2020. 4. 3. 03:00ㆍAI/모두를 위한 딥러닝
이 포스트는 모두를 위한 딥러닝 - Tensor Flow를 정리한 내용을 담았습니다.
누구나 이해할 수 있는 수준으로 설명하고자 하였으며 LAB의 코드는 TF2.0에 맞추어 재작성되었습니다.
우리는 이전 포스트 02. Simple Linear Regression에서 cost에 대해 알아보았으며 02-2. Simple Linear Regression LAB에서 텐서플로우로 cost를 구현해보았습니다. 이번 포스트에서 우리는 cost를 최소화하는 알고리즘 중 하나인 Gradient descent(경사 하강법)에 대해 알아보겠습니다.
0.0. 들어가기에 앞서, 이번 포스트에서 우리는 기존의 H(x) = Wx + b에서 b를 0으로 고정하여 H(x) = Wx로 표현하겠습니다. 이는 단순히 변화의 추이를 보기 편하고 계산을 쉽게 하기 위함입니다. 따라서 우리는 cost를 다음의 수식으로 표현할 수 있습니다. cost(W)를 표현할 때, 평균을 1/m이 아닌 1/2m로 표현했는데, 뒤에서 미분할 때 편하기 위함이며 cost의 변화에는 영향을 끼치지 않습니다.
0.1. 이제 아래 데이터를 예시로 cost의 최소화에 대해 간단히 살펴보겠습니다.
x |
y |
1 |
1 |
2 |
2 |
3 |
3 |
위에서 배운 비용 함수에 X와 Y값을 대입해 W의 변화에 따른 cost의 변화(cost(W))를 살펴보겠습니다.
W = 0일 때, cost(W)는 1/3 * ((0 * 1 - 1)^2 + (0 * 2 - 2)^2 + (0 * 3 - 3)^2), 약 4.67입니다.
W = 1일 때, cost(W)는 1/3 * ((1 * 1 - 1 )^2 + (1 * 2 - 2)^2 + (1 * 3 - 3)^2), 0입니다.
마찬가지 방법으로 W가 2일 때와 3일 때의 cost(W)를 구하면 각각 4.67, 18.67이 나옵니다. 우리는 이제 이 데이터들을 가지고 W와 cost(W)를 x, y축으로 갖는 그래프를 그릴 수 있습니다. 그래프는 아래와 같습니다.
그래프를 보고 W가 1일 때 cost(W)가 최소가 된다는 것을 직관적으로 확인할 수 있습니다. 이렇게 우리는 눈으로 보고 cost가 최소가 되는 W를 구할 수 있지만, 이미 알고 있듯이 아직 컴퓨터에서는 직관을 통해 최소점을 구하는 것이 불가능합니다. 그렇다면 컴퓨터에서는 그래프에서 cost(W)가 최소가 되는 지점을 어떻게 알까요? 이제 우리는 컴퓨터에서 cost의 최솟값을 구하는 알고리즘인 Gradient descent에 대해 알아보겠습니다.
1.0. 이제 cost를 최소화하는 알고리즘 중 하나인 Gradient descent 알고리즘(경사 하강법)에 대해 알아보겠습니다. Gradient descent은 단어 그대로 경사(기울기)를 따라 내려가며 최저점을 찾도록 설계된 알고리즘으로, cost(W, b)가 주어졌을 때 cost를 최소화하는 W와 b를 구하는 것이 목적입니다. 그럼 이 알고리즘이 어떻게 동작하는지를 단계별로 살펴보겠습니다.
-
W와 b를 임의의 값으로 정합니다. 텐서플로우의 난수 생성 함수를 이용합니다.
-
그다음엔 W와 b값을 지속적으로 업데이트합니다. 이 때 무작정 업데이트하는 것이 아니라, 기울기 값을 이용해 cost(W, b)가 최소화되는 방향으로 W와 b값을 업데이트를 해나가야 합니다. 기울기 값을 이용하는 것에 대해서는 아래에서 다시 살펴보겠습니다.
-
최소점에 도달했다고 판단될 때까지 업데이트 과정을 반복합니다.
그럼 위에서 그린 그래프 0.1.1에서 Gradient descent를 활용하여 최소점을 구하는 방법을 알아보겠습니다.
2.0. 위에서 설명한 동작 방식을 따라, cost가 최솟값에 도달하는 과정을 살펴보겠습니다.
초기 W값을 4로 정합니다. 그 다음 W값을 지속적으로 업데이트해주는데, 방법은 다음과 같습니다. W = 4에서 cost(W)에 그은 접선의 기울기 값을 학습 속도에 곱해 W에서 빼줍니다. 학습 속도는 이전 포스트에서 설명했지만, 다시 한번 간단하게 말하면 기울기를 어느 정도 반영할 것인지를 정헤주는 상수입니다. 이 과정을 식으로 표현하면 다음과 같습니다.
2.1. Gradient descent의 핵심입니다. 우리는 cost가 최소가 되는 W를 찾는 것이 목적이였고, 마침내 이 식을 구하였습니다. 그럼 ∂/∂W·cost(W)를 보겠습니다. ∂는 편미분 기호로 ∂/∂W는 "W에 대해서만 미분하며 나머지는 모두 상수로 취급한다"는 의미입니다. 다음은 cost(W)를 W에 대해 편미분 하여 풀어낸 결과입니다.
이제 W를 지속적으로 업데이트하며 cost의 변화를 살펴봅니다. 그래프에서처럼 W가 4에서 3으로 줄어들며 접선의 기울기 또한 줄어드는 것을 알 수 있고, 계속 반복하다 보면 결국 W가 0일 때 cost(W)가 최소가 됩니다.
3.0. 이렇게 우리는 Gradient descent 알고리즘으로 cost(W)를 최소화하는 H(x)를 구했습니다. 하지만 우리는 cost(W, b)가 Convex function(볼록 함수)이어야만 우리가 찾은 최솟값이 전역적 최솟값임을 확신할 수 있습니다. 당장은 이 단어들을 이해하기 힘들 것이기에, 다음의 그래프를 보겠습니다. 이 그래프는 W, b, 그리고 cost(W)를 x, y, z 축으로 갖는 3차원 그래프입니다.
위의 그래프의는 not convex function(볼록 함수가 아닌 경우)으로, 어떤 지점에서 시작하는지에 따라서 경사를 따라 내려간 cost의 최솟값이 여러 개가 구해질 수 있습니다. 따라서 이런 경우에는 시작점에 따라 구한 지역적 최솟값(local minimum)이 전체에서의 최솟값(global minimum)인지 확신할 수는 없으며, 때에 따라서는 전역적 최솟값을 구하지 못할 수도 있습니다. 이런 경우에는 Gradient descent의 첫 번째 단계부터 막힐 것이라 생각합니다.
이번에는 cost(W, b)가 Convex function(볼록 함수)형태인 다음의 그래프를 보겠습니다.
위의 그래프는 convex function(볼록 함수)으로, 어느 지점에서 시작하든 경사를 따라 내려간 cost의 최솟값이 전역적 최솟값이 됩니다. 다른 말로는 지역적 최솟값이 전역적 최솟값과 같음을 확신할 수 있으며, 따라서 W와 b에 임의의 값을 주더라도 문제없이 cost(W, b)를 최소화하는 W, b를 구할 수 있을 것입니다.
이번 포스트에서는 cost를 어떻게 초기화하는지, 그리고 그 방법 중 하나인 Gradient descent(경사 하강법)에 대해서 알아보았습니다. 텐서플로우에서 Gradient descent를 구현하고 싶다면 이전 포스트에서 확인해주시길 바랍니다. 다음 포스트에서는 Gradient descent를 텐서플로우 코드로 어떻게 구현하는지를 알아보겠습니다.
'AI > 모두를 위한 딥러닝' 카테고리의 다른 글
04. Multi-variable Linear Regression (0) | 2020.04.05 |
---|---|
03-1. How to minimize cost - Gradient descent LAB (3) | 2020.04.04 |
02-2. Simple Linear Regression LAB (3) | 2020.03.31 |
02-1. 텐서플로우(TensorFlow)란? / 텐서플로우 설치 (1) | 2020.03.26 |
02. Simple Linear Regression (1) | 2020.03.23 |