이번 포스팅에서는 경사하강법(Gradient Descent)에 대해 알아보겠다. (이번에도 Coursera 강의를 참고하여 포스팅합니다.)
경사하강법(Gradient Descent)이란 앞서 포스팅한 Cost Function을 최소화되도록 최적화하는 알고리즘으로 말 그대로 경사(기울기)를 줄여가면서 Cost Function(J(θ0, θ1))을 최소화하는 파라미터(θ0(bias), θ1(weight))를 찾는 알고리즘이다.
여기서 말하는 최적화란 여러 허용되는 값들 중에서 주어진 기준을 가장 잘 만족하도록 하는 것을 말하며, 계속 강조하지만 Cost Function을 최소화한다는 뜻은 실제 데이터들에 맞게 잘 예측하는 모델을 찾겠다는 뜻이다. 또다른 표현으로 예측값에 대한 오류나 손실(Loss function = Cost Fucntion)을 점점 줄여나가는 방법이라고 한다. 모두 같은 말이다.
위 그림이 Coursera 강의에서 나온 내용들인데 위에서부터 차근차근 읽어보면,
- 1번째 줄 : J(θ0, θ1)이 Cost Function이고 우리는 이러한 Cost Function을 가지고 있다.
- 2번째 줄 : 우리는 이 Cost Function을 최소화하는 θ0, θ1을 구하기를 원한다.
- Outline 1번째 줄 : 임의의 값 θ0, θ1에서 시작하라.
- Outline 2번째 줄 : 우리가 희망적으로 최소화가 되어 끝날 때까지 Cost Function을 줄이기 위해 θ0(bias), θ1(weight)을 계속 변화시켜라.
이렇게 된다. 이 내용들을 식과 그래프와 함께 좀 더 자세하게 보자. (그래프는 다음 포스팅에서...)
이 식이 바로 Gradient Descent에 관한 식이다. 맨 오른쪽에 있는 녹색 글자들을 보자.
a:=b라고 되어 있는데, 이는 코딩에서의 "a=b"와 같다. 즉, 대입이라는 뜻이다. 그 아래에 a:=a+1이 있는데 만약 a=3이라고 하면 a는 이제 4로 업데이트되는 것이다. Truth assertion 부분을 보면 a=b라고 되어 있는데, 이 a=b가 방금 말한 프로그래밍에서의 대입을 의미한다. 그 아래에는 a=a+1에 X 표시가 되어 있는데, 이게 무슨 의미냐면, '='이 같음을 의미하는 경우는 a=a+1이 틀리다는 것이다. 예를 들어, a=4라고 할 때 4!=5이기 때문이다(!은 NOT).
이렇게 '='을 같음으로 혼동할 수 있으니 혼동하지 않게 하기 위하여 := 로 표시한 것이다. 만약 '='을 대입으로 인식한다면 꼭 :=로 사용할 필요없이 '='로 써도 된다.
이번엔 아래 repeat until convergence에 있는 θj식을 보자. convergence는 수렴이라는 뜻인데, "수렴할 때까지 반복하라 => 해당 데이터들에 적합한 최소값으로 수렴할 때까지 반복하라" 는 뜻이다. 그 안의 θj식을 보면, α*( J(θ0, θ1)의 θj에 대한 미분 값 => 위 식을 그대로 표현할 수가 없어서 J'(θ0, θ1)라고 표현하겠다. ) 만큼이 계속 감소하면서 θj값이 업데이트 된다고 생각하면 된다. 이 J'(θ0, θ1)은 점 (θ0, θ1)에서의 Cost Function에 대한 기울기를 의미한다.
α는 Learning rate(학습 비율)라고 해서 우리가 경사를 따라 내려갈 때 얼만큼 이동해야 할 것인지에 대한 값이다. 또한,
처음에 경사하강법을 설명할 때 보통 2차 함수에 대해 먼저 예를 드는데, 그 경우가 θ0(bias) = 0인 경우이다. Learning rate와 2차 함수(θ0(bias) = 0인 경우)에서의 경사하강법에 대해서는 다음 포스팅에서 자세하게 설명하겠다.
하지만, 위 식은 θ0(bias) != 0인 경우를 설명하고 있다. 아래 왼쪽의 "Correct: Simultaneous update" 부분을 보자.
temp0에 θ0 - α*J'(θ0, θ1) (***0***)의 결과값이 대입된다. temp1에는 θ1- α*J'(θ0, θ1) (***1***)이 대입된다. 물론 '='를 '같음'이 아니라 '대입'으로 인식한다면 '='으로 써도 무방하다. 헷갈리지 않는다면, temp0 = θ0- α*J'(θ0, θ1), temp1 = θ1- α*J'(θ0, θ1)이라고 써도 된다(필자는 '='이 더 편하다 ㅠㅠ). 그 다음 θ0에 temp0이 대입되고, θ1에 temp1이 대입된다. 즉, θ0 = temp0이고, θ1 = temp1이다. 경사하강법은 이런 알고리즘으로 진행된다.
P.S : temp0, temp1 둘 다에 J'(θ0, θ1)를 써놨는데 사실 이 둘은 다른 식이다. 아까 잠깐 얘기 했지만 미분 식을 완전하게 표현하는데 한계가 있어 똑같이 써놓은건데, 식을 보면 알겠지만 temp0의 J'(θ0, θ1)은 θ0에 대해서 미분한 값이고 temp1의 J'(θ0, θ1)은 θ1에 대해서 미분한 값이기 때문이다. 그래서, (***0***) 부분은 θ0에 대해서 미분한 값이고 (***1***) 부분은 θ1에 대해서 미분한 값이다. 위 그림의 식을 보면서 글을 읽기를 바란다. (혹시나 혼동하실까봐 적어봅니다.)
그럼 이번엔 Incorrect 부분을 보자. temp0에 θ0 - α*J'(θ0, θ1) (***0***)의 결과값이 대입되고, θ0에 temp0의 값이 대입된다. 그 다음, temp1에 θ1- α*J'(θ0, θ1) (***1***)의 결과값이 대입되고, θ1에 temp1의 값이 대입된다. Correct와의 차이를 알겠는가? 차이는 temp1에서 발생한다. 왜냐하면, temp1까지만 볼 때 Incorrect는 θ0 = α*J'(θ0, θ1)인 반면, Correct는 초기에 주어진 θ0값이기 때문이다. 즉, Incorrect에서의 θ0와 Correct에서의 θ0가 다른데, 각각 다른 값들로 미분한 값으로 temp1에서 계산을 하므로 서로 temp1이 다를 수 밖에 없다.
P.S : 여기도 마찬가지다. (***0***) 부분은 θ0에 대해서 미분한 값이고 (***1***) 부분은 θ1에 대해서 미분한 값이다. 위 그림의 식을 보면서 글을 읽기를 바란다.
쉬운 이해를 위하여, θ0 = 10, α*J'(θ0, θ1) = 5라고 가정하고 생각해보자(여기서 J'(θ0, θ1)은 θ0에 관해 미분한 값). Incorrect에서는 temp0 = θ0 - α*J'(θ0, θ1) = 10 - 5 = 5이므로 θ0 = 5가 된다. 하지만, Correct에서의 temp1 계산 시 θ0 = 10이다.
이렇게 같은 식이라도 순서가 바뀜에 따라 값들이 달라지기 때문에 경사하강법에서는 Correct에 나와있는 방식대로 값을 대입한다.
이번 포스팅에서는 경사하강법에 대한 전체적인 구조에 대해 알아보았다. 다음 포스팅에서 조금 더 자세하게 알아보자.
참고 사이트 :
- https://jfun.tistory.com/127
- https://cyc1am3n.github.io/2018/02/06/gradient-descent.html
'Machine Learning' 카테고리의 다른 글
Multiple Features in Linear Regression (= Multivariate linear regression(다변량 선형회귀)) (0) | 2020.08.11 |
---|---|
Gradient Descent (경사하강법) (2) (feat. Learning rate) (0) | 2020.07.31 |
Cost Function (비용 함수) (2) (0) | 2020.06.14 |
Cost Function (비용 함수) (1) (0) | 2020.06.12 |
Linear Regression (선형 회귀) (Feat. Cost Function) (0) | 2020.06.11 |
댓글