경사하강법(Gradient descent method)

 경사법에서는 일정한 거리를 또는 간격을 두고 그 지역의 기울기를 따라서 조금씩 이동하며 최솟값을 찾는다. 이번 포스팅에서는 경사하강법이라는 방법을 알아본다.

경사하강법은 최적화를 위해 진행하는 작업에서 가장 기본적이고 기초적인 방법이다. SGD이라고도 불리는 확률경사하강법이 기초이긴 하지만 현재는 Adam이나 AdaGrad같은 갱신방법을 이용하긴 한다. 하지만 가장 기본이 되는 방법이고 이해하기 가장 쉬운 방법이므로 경사하강법을 이용하여 최솟값을 찾는 방법을 포스팅해보겠다.


경사하강법은 처음에 이야기 했다 싶이 조금씩 기울기를 타고 움직인다. 이때 하강법은 부호를 (-)로 하여 조금씩 감소시킨다. 수식은 다음과 같다. 






위에서 보이다 싶이 X1은 갱신 후 X0는 갱신 전 이다. 그리고 가장 중요한 기호인 eta는 학습률이라고도 하는데 한번에 어느 정도의 양을 학습하는지 정해주는 중요한 변수이다.  학습률이 너무 낮거나 높으면 원하는 값이 잘 나오지 않을 수 있다. 

경사하강법을 파이썬 코드로 구현하게 되면 다음과 같다. 

def gra_des(function,int_x, lr, stepnum):
first = int_x

for i in range(stepnum):
grad = grad_c(function,first)
first = first - (lr*grad)
return first

function은 경사법에 대입될 함수, int_x는 입력된 초기값, stepnum는 반복횟수 그리고 lr은 학습률을 뜻한다. grad_c함수는 편미분을 통한 기울기를 구하는 함수로 따로 소스코드를 밑에 첨부하겠다. 보다 싶이 각 기울기에 따라 조금씩 하강하는 것을 볼 수 있다. 

만일 lr값을 너무 크게 작성해버리면 매우 큰 값으로 발산해버리며 lr값을 너무 작게 할 경우 초기값에서 거의 변하지 않으므로 적당한 lr값을 정하는 것이 중요하다.   

참고 기울기 함수 grad_c

def grad_c(function,x):
h = 0.0001
grad = np.zeros_like(x)
for i in range(x.size):
tmp_val = x[i]
x[i] = tmp_val+h
fxh1 = function(x)

x[i]=tmp_val-h
fxh2 = function(x)

grad[i] = (fxh1 - fxh2)/(2*h)
x[i] = tmp_val

return grad








댓글

이 블로그의 인기 게시물

MongoDB와 VScode 이용한 드라이빙app 개발 일지 (2022.4.10)

다양한 계층 구현을 통한 오차역전파법 구현하기(2)