본문 바로가기
Machine Learning

Gradient Descent (경사하강법) (1)

by ahfmrjttb 2020. 7. 16.

이번 포스팅에서는 경사하강법(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 

    - https://mangkyu.tistory.com/34

댓글