본문 바로가기

인공지능/이론

Gradient Descent 공식 유도

Gradient Descent 알고리즘의 공식을 수학적으로 유도해보자.

 

 

먼저 Loss Function과 Cost Function의 의미를 정의하고 출발하겠다.

 

Loss Function은 정답과 예측값의 일치정도를 나타내는 함수이다. 정답과 예측값이 완전히 동일하다면 그 값은 0이 나올 것이며, 값이 다를 경우 미묘한 차이에는 시큰둥하다가 차이가 커지면 커질수록 값이 무한대로 나아가게끔 과민반응할 것이다. 식은,

 

$$ L(y, h(x)) = \frac{1}{2} (h(x)-y)^{2} $$

 

을 사용할 것이다. $h(x)$는 Hypothesis Function이며 예측값을 구하는 함수이다. 식을 보면 MSE(Mean Squared Error) Loss Function에 $\frac{1}{2}$을 붙인 형태인데, 붙인 이유로써 별다른 의미는 없으며 단지 미분하였을 때 식이 깔끔하게 나오도록 유도하기 위한 장치일 뿐이다.

 

Cost Function은 여러개의 정답과 그에 대응하는 여러개의 예측값들이 존재할 때 각각의 Loss Function을 구하여 그것들을 평균낸 것을 의미한다. 즉, 퍼셉트론 알고리즘에서 현재의 weight값과 bias값이 특정 example과 label이 아닌 모든 example과 label에 대한 적합성을 알아보기 위해 Loss Function들을 평균낸 것에 대한 명칭일 뿐이다. 식은,

 

$$ J(w, b) = \frac{1}{m} \sum_{i=1}^{m} L(y_i, h(x_i)) $$

 

를 사용할 것이다. Cost Function을 왜 대문자 J로 나타내는지에 대해 찾아보았는데 Jacobi의 J를 따왔다는 등 여러가지 설이 있는 것 같지만 다들 확실히는 모르겠단 의견이었다. 아마 Machine Learning분야에서 다들 J를 사용하고 있고 그러다보니 새로 입문하는 사람들도 J를 쓰고 하다보면서 굳어진 게 아닐까 싶다.

 

 

이제 본격적으로 Cost Function을 편미분해보자. 편미분을 하는 이유는 각각의 weight들이나 bias가 현재의 Cost값에 대해 갖는 선호도(편미분 후 얻어내는 기울기)가 어느정도 되는가를 각자 따로 구해내야하기 때문이다. 그래야 개별 맞춤형 보정이 가능해진다.

 

일단, Loss Function부터 편미분을 시작하자. Cost Function은 어차피 Loss Function들의 평균에 불과하기 때문이다.

 

$$ \frac{\partial}{\partial w} L(y, h(x)) = \frac{\partial}{\partial w} (\frac{1}{2} (h(x)-y)^{2}) $$

 

여기서 $h(x)$를 $wx + b$로 치환한 뒤 제곱식을 전개하여 $w$에 대해 편미분을 할 수도 있겠지만 식이 굉장히 난잡하고 길어진다. 대신 Chain Rule(합성미분 공식)을 사용하면 보다 간편하게 편미분이 가능하다.

 

우선 이렇게 $\frac{1}{2}$을 바깥으로 빼낸 뒤,

 

$$ \frac{1}{2} \frac{\partial}{\partial w} (h(x)-y)^{2} $$

 

아래와 같이 Chain Rule을 적용한다.

 

$$ \frac{1}{2} 2 (h(x)-y) \frac{\partial}{\partial w} (h(x)-y) $$

 

그리고 w에 대해 편미분을 진행해야하는 부분의 $h(x)$를 $wx + b$로 치환해주면

 

$$ (h(x) - y) \frac{\partial}{\partial w} (wx + b - y) $$

 

이렇게 된다. 이후 w에 대한 편미분을 진행해주면

 

$$ \therefore \frac{\partial}{\partial w} L(y, h(x)) = (h(x) - y)x $$

 

로 마무리가 된다. 만약 $w$가 아닌 $b$에 대해 편미분을 진행한다면 Chain Rule 후 편미분 부분이 1밖에 남지 않으므로 $(h(x) - y)$로 마무리 된다.

 

 

Loss Function을 편미분하였으니 이제 그것들의 평균인 Cost Function을 편미분해 보자. 먼저 Cost Function을 편미분하는 것은 다음과 같은 식으로 나타낼 수 있다.

 

$$ \frac{\partial}{\partial w} J(w, b) = \frac{\partial}{\partial w} (\frac{1}{m} \sum_{i=1}^{m} L(y_i, h(x_i))) $$

 

여기서 각 항을 모두 합하고 나눈 뒤 편미분을 진행하는 방법과 각 항을 미리 편미분하는 방법은 결과가 같으므로 후자의 식으로 고쳐줄 수 있다.

 

$$ \frac{1}{m} \sum_{i=1}^{m} \frac{\partial}{\partial w} L(y_i, h(x_i)) $$

 

이것에다가 위에서 구한 Loss Function 편미분 결과를 대입해주면

 

$$ \therefore \frac{\partial}{\partial w} J(w, b) = \frac{1}{m} \sum_{i=1}^{m} (h(x_i) - y_i)x_i $$

 

로 마무리가 된다. bias의 경우라면 마찬가지의 원리로,

 

$$ \therefore \frac{\partial}{\partial b} J(w, b) = \frac{1}{m} \sum_{i=1}^{m} (h(x_i) - y_i) $$

 

이렇게 마무리가 된다.

 

 

파이썬 코드에서는

 

w1 = w1 - learning_rate * ((y_predict - y) * x1).mean()
w2 = w2 - learning_rate * ((y_predict - y) * x2).mean()
b = b - learning_rate * (y_predict - y).mean()

 

이러한 방식으로 적용된다.

'인공지능 > 이론' 카테고리의 다른 글

인공지능, 머신러닝, 딥러닝  (0) 2020.02.10
지도학습 vs 비지도학습  (0) 2020.02.10