수학과의 좌충우돌 프로그래밍

[딥러닝]04.그레디언트 본문

인공지능/케라스창시자에게 배우는 딥러닝

[딥러닝]04.그레디언트

ssung.k 2019. 3. 15. 05:15
텐서연산

그레디언트 기반 최적화

output = relu(dot(W,input)+b)

W와 b는 각 층의 속성처럼 생각할 수 있다. W는 가중치, b는 편향이라고 부르며 초기에는 무작위 난수로 채워져 있다. 당연히 난수이기 때문에 위 식의 계산은 의미가 없다. 여기서 각 층의 속성들을 조정하게 되는데 그 과정은 다음과 같다.

  1. 훈련 샘플 x 와 이에 대응되는 타깃 y의 배치를 추출한다.
  2. x 에 대한 예측값 y_pred를 구한다.
  3. y_pred와 y의 차이를 이용해 손실을 계산한다.
  4. 배치에 대한 손실이 감소되는 방향으로 각 층의 속성들을 조정한다.

4번에서 각 층의 속성들을 어떠한 방법으로 조정할지가 중요한 포인트가 된다.

확률적 경사 하강법

앞에서 봤던 4번을 어떻게 구현할지에 대한 이야기이다. 먼저 다음과 같은 식을 얻을 수 있다.(단순화하기 위해 편향 b는 생략하였다.)

y_pred = dot(W,x)
loss_value = loss(y_pred,y)

각 층의 속성들을 이용해서 예측값을 구하고 예측값과 원래의 레이블을 비교해 손실값을 구해주게 된다. 여기서 우리의 목적은 손실값 loss_value를 줄여주는 것이다.

위에 두 식에서 x와 y는 입력데이터로서 이미 정해져있는 고정값이다. 즉 loss_value는 W에 의해 결정되는 값이라고 볼 수 있다. 즉 두 변수에 대한 그래프를 그려줄 수 있다.


그레디언트

x 축은 W, y축은 loss_value로서 다시 한 번 말하지만 우리의 목표는 loss_value가 최소인 지점을 찾는 것이다. 이를 위해서 우리는 현재 위치의 변화율(기울기)를 구해줍니다. 그리고 이 텐서 연산의 변화율을 그레디언트라고 합니다. 이제 그레디언트의 반대방향으로 W를 조금씩 조정하면 loss_value의 값을 줄일 수 있습니다.

W -= step * gradient

여기서 step 값에 따라 얼마나 많이 이동할지가 결정됩니다.

  • step이 작은 경우 : 학습이 되는데 너무 많은 시간이 소요, 지역 최솟값에 갇힐 수 있음
  • step이 큰 경우 : 임의의 위치로 튕겨져 나갈 수 있음

지역 최솟값은 다음과 같은 경우를 말합니다. 저 부분도 분명히 gradient가 0이 되는 지점이라 더 이상 정보가 갱신되지는 않지만 찾고 싶었던 원하는 값은 아닙니다.


옵티마이저

그래서 가중치를 계산할 때 현재의 그레이언트 뿐 아니라 이전에 업데이트된 가중치를 여러 가지 다른 방식으로 다룹니다. 예를 들어 모멘텀을 사용한 SGD, Adagrad, RMSProp 등이 있습니다. 이러한 방법들을 최적화 방법, 옵티마이저 라고 합니다.

마치 손실곡선 위에 공을 굴린다는 개념으로 모멘텀, 과거의 가속도까지 고려하여 w를 최신화하게 됩니다.

past_velocity = 0
momentum = 0.1
while loss > 0.01:
    w, loss, gradient = get_current_parameters()
    velocity = momemtum * past_velocity - learning_rate * gradient
    w = w + momentum * velocity - learning_rate * gradient
    past_velocity = velocity
    update_parameters(w)

 

Comments