모두의 딥러닝 시즌 2 정리...
이전 글에서는 linear regression에 대한 개념을 알아보았다면 이번 글에서는 cost를 최소화하는 구체적인 방법과 알고리즘에 대해 좀 더 깊이 있게 살펴보도록 하겠다.
[Linear Regression] 개념 부분에서 살펴본 Hypothesis와 cost에 대한 내용은 다음과 같다.
우리는 Hypothesis를 바탕으로 Cost 함수를 정의한 바 있다.
해당 cost 함수는 우리의 가설과 실제 데이터의 차이를 제곱한 값의 전체 합에서 데이터의 개수로 나눠서 도출한 평균 값이다.
위의 Cost 함수는 W, b에 대한 함수이고 이 W, b에 따라서 Cost의 결과값이 달라지게 된다.
(우리의 가설과 실제 데이터의 차이를 Error라고 명칭하기도 한다.)
이때 이 cost의 값이 즉 비용이 작을수록 우리의 가설은 실제 데이터를 잘 반영하고 있다고 할 수 있다.
"데이터를 통해 cost가 최소화가 되는 W, b를 찾는 것" 이것이 우리의 목표이다.
이제 계산을 좀 더 쉽게 하기 위해 b를 생략하여 간략화를 시켰다.
여기서 생략된 b(bias)는 나중에 W가 matrix가 되면서 그 안으로 들어가게 되는데 해당 내용은 다른 글에서 추가 설명을 하도록 하겠다.
What cost(W) looks like?
이제 cost 함수의 변화를 살펴보기 위해 W 값을 변화시켜 가면서 cost를 살펴보고자 한다.
위의 그림은 W의 값이 변화해가면서 출력된 cost의 값을 보여준다. 명확히 파악하기 위해 W의 값을 촘촘하게 하여 시각적으로 나타내 보자.
위의 그래프가 해당 cost 함수의 그래프 모양이다.
이전에 Machine Learning에서 Learning이란 것은 이 cost가 최저점이 되는 W를 찾아가는 과정이라고 하였다.
즉, "Machine Learning의 목표는 cost가 최소화가 되는 W 값을 알아내는 것"이라고 할 수 있다.
위의 그래프에서 cost가 가장 작아지는 부분은 W가 1인 부분이다. 사실 그래프를 보면 사람인 우리는 쉽게 찾을 수 있다. 하지만 우리는 컴퓨터한테 해당 지점을 찾으라고 기계적으로 혹은 알고리즘을 통해 명령을 해야 한다.
Gradient descent algorithm (경사 하강법)
컴퓨터가 최저점을 찾는 것에 널리 알려진 알고리즘이 이 Gradient descent algorithm(경사 하강법)이다. 해당 알고리즘은 말 그대로 경사를 따라 내려가면서 최저점을 찾는 알고리즘이다.
우리가 하는 엔지니어링 문제의 대부분은 최적화 문제이다. 이 최적화 문제는 이득을 최대화시키거나 손실을 최소화시키는 것이 대부분이라고 요약할 수 있다.
이렇게 손실을 최소화. 즉, Cost를 최소화하는 방법으로 널리 쓰이는 것이 이 Gradient descent이다. Gradient descent는 cost를 최소화하는 W, b를 찾게 하는 것에 사용할 수 있으며 또한 Gradient descent는 변수가 W, b와 같이 1 or 2개일 때 사용할 뿐만 아니라 W1, W2...Wn과 같이 변수가 여러 개 일때도 사용할 수 있는 알고리즘이다.
How it works?
자!! 여기까지 Gradient descent가 무엇인지 대략적으로 알았다면 해당 알고리즘이 어떻게 작동하는지 알아볼 필요가 있다.
- Start with initial guesses
- Start at 0, 0 ( or any other value )
- Keeping changing W and b a little bit to try and reduce cost(W, b)
- Each time you change the parameters, you select the gradient which reduces cost(W, b) the most possible
(W, b 값을 지속적으로 업데이트할 때 기울기 값을 구해서 cost가 최소화되는 방향으로 업데이트를 한다.) - Repeat
- Do so until you converge to a local minimum
(자체적으로 최소점에 도달했다고 판단될 때까지 반복) - Has an interesting property
- Where you start can determine which minimum you end up
여기까지가 Gradient descent의 알고리즘이다.
다음은 시각적 이해를 돕기 위한 자료이다.
그림에서 보이는 파란색 선은 비용함수. 즉, cost function을 나타낸다. W 값의 분포에 따라서 cost가 어떻게 분포되는지 표현하고 있다.
- 해당 곡선 상의 임의의 한 지점을 정하겠다. 예제에서는 W = 4인 지점을 Initial Weight로 잡았다.
- 이제 Initial Weight에서의 기울기(=Gredient)를 구한다.
- 그리고 W 값에 Gradient를 곱해서(이때의 값을 α라고 하겠다.) 초기 W 값에서 α 값을 빼준다.
Initial Weight - (Initial Weight * Gradient) - 이때 구한 Gradient의 값은 양수를 나타낸다. 그리고 위 3번의 과정을 거치면 즉, Initial Weight이 Increment Step을 거치면서 빨간 점으로 이동하게 된다.
- 이렇게 업데이트된 W값이 지속적으로 1~4번 과정을 거치면 Gradient(=기울기)는 점점 작아지면서 결국엔 기울기가 0인 지점에 도달할 것이다.
이때 기울기가 0이 되는 지점 즉, 기울기가 더 이상 줄어들지 않는 지점.
다시 말해 이 지점은 비용이 최소화가 되는 지점인 것이다.
재밌는 점은 위의 과정에서 그림에 나타난 Gradient는 양수를 나타낸다. 하지만 반대쪽 지점의 W에서의 Gradient라 할지라도(즉, 음수라고 할지라도) 동일한 결과를 나타내게 된다.
기울기가 음수이고 계산 결과를 보면 W 값은 증가하는 방향으로 이동하기 때문에 최종적으로는 기울기가 0인 지점에 도달하게 된다.
이때 이동하는 간격도 기울기를 곱한 만큼 이동하기 때문에 경사가 급할수록 기울기 값은 크고 기울기 값이 크면 더 많이 이동을 하게 된다. 0지점으로 갈수록 기울기는 작아지기 때문에 이동하는 간격도 작아지는 것이다.
그렇다면 Gradient는 어떻게 구하는 것일까?
곡선에 접하는 직선의 기울기. 즉, W 지점에 접하는 직선의 기울기를 구하는 방법은 바로 미분을 이용하는 것이다.
우리는 미분을 사용하기 위해 기존의 cost 함수의 공식을 약간 수정하고자 한다.
우리는 평균을 구하기 위해서 전체의 갯수로 나누어 준 작업을 진행했었다. 하지만 이 전체의 갯수로 나눌때 이 값을 m으로 나누든지 2m...3m...4m으로 나누든지 cost의 특성에는 큰 영향을 주지 않는다.
그래서 우리는 미분할 때 지수인 2의 약분을 통해 좀 더 간편한 식을 도출하기 위해 2m으로 설정할 것이다.
Formal definition
위의 공식이 Gradient descemt 알고리즘이다. Gradient descemt는 W 값을 지속적으로 업데이트하는 내용으로 되어있다.
알고리즘 식 과정 설명
α : 작은 상수. learning rate라고 한다. 즉, 우리가 구한 기울기 값을 얼마만큼 반영을 할지 혹은 얼마만큼 W에서 뺄지를 결정하는 배수의 역할을 한다. 만약 α 값이 크다면 많은 값을 빨리빨리 빼서 값의 변화가 클것이고 α 값이 작다면 값의 변화가 작을 것이다. 보통 α값은 주로 0.001 or 0.00001 같은 작은 값을 사용한다.
해당 식이 편미분 과정이다. 이 편미분은 W에 대해서만 미분을 진행하겠단 것이다.
즉, 다른 변수들은 상수로 두고 W에 대해서만 미분을 하겠다는 의미이다.( ∂는 편미분 기호이다.)
즉. cost function을 미분한 값. 위의 식이 최종적으로 기울기를 나타내는 것이다.
이제 W에 대해 미분을 진행하면 지수는 1/2m과 상쇄되어 아래와 같은 간략화된 식이 도출된다.
바로 이 수식이 Gradient descent의 최종적인 수식이다.
마지막으로 최종 정리를 하자면 위 수식은 W 값을 업데이트하는 모습을 보여준다. W 값에서 cost function을 미분한 값을 빼준 결과로 업데이트를 한다.
이때 W 값의 변화 빈도는 α 값에 의해 결정된다. α값이 크면 W 값을 많이 빼고 α 값이 작으면 W 값을 조금씩 빼게 한다.
Non - Convex function
해당 그림은 W, b 값에 의해 cost(loss) function이 어떻게 분포되어 있는지를 그린 것이다.
Gradient descent는 주변의 경사를 따라서 좀 더 낮은 곳을 찾아가서 최저점을 구하는 알고리즘인데 만약 해당 그림과 같은 경우 시작 지점에 따라 전체의 최저점을 찾지 못할 수도 있다.
예를 들어보자. ①, ②, ③지점은 시작점이 다른 곳에서 구한 Gradient descent의 최저점이다. 이 3 지점은 해당 지점의 주변에 비해서는 가장 낮은 지점에 해당한다. 하지만 이 3 지점은 전체적으로 가장 낮은 지점이라고는 할 수 없어 보인다. 이때 ①, ②, ③을 local minimum 이라고 한다.
이렇게 local minimun이 여러 개 존재할 때 가장 낮은 지점으로 도달할 거라는 것을 우리는 장담할 수가 없다. 즉, Gradient descent는 이런 상황에서는 사용할 수 없는 것이다.
Convex function
해당 그림처럼 볼록한 함수를 convex라고 하는데 local minimum과 global minimum이 일치하는 경우를 말한다.
즉, local minimum이 여러 개 존재하지 않는 것을 말한다.
만약 우리의 cost function이 convex function이라면 시작점이 어디든지 항상 최저점에 도달할 것이란 것을 보장할 수 있기 때문에 이때는 Gradient descent algorithm을 마음 놓고 사용할 수 있다.
이제 해당 개념을 바탕으로 텐서플로우 라이브러리를 활용하여 구현해보도록 하겠다.