수학/딥러닝 이론

[딥러닝] 매개변수 갱신 - AdaGrad 기법

AI 꿈나무 2020. 10. 2. 20:10
반응형

사이토고키의 <밑바닥부터 시작하는 딥러닝>을 공부하고 정리하였습니다.

 


AdaGrad

 신경망 학습에서는 학습률 값이 중요합니다.

 이 값이 너무 작으면 학습 시간이 너무 길어지고, 반대로 너무 크면 발산하여 학습이 제대로 이뤄지지 않습니다.

 

 이 학습률을 정하는 효과적 기술로 학습률 감소(learning rate decay)가 있습니다.

 이는 학습을 진행하면서 학습률을 점차 줄여가는 방법입니다.

 

 학습률을 서서히 낮추는 가장 간단한 방법은 매개변수 '전체'의 학습률 값을 일괄적으로 낮추는 것입니다.

 이를 더욱 발전시킨 것이 AdaGrad입니다.

 AdaGrad는 '각각의' 매개변수에 '맞춤형'값을 만들어 줍니다.

 

 AdaGrad는 개별 매개변수에 적응적으로 학습률을 조정하면서 학습을 진행합니다.

 AdaGrad의 갱신 방법은 수식으로는 다음과 같습니다.

 

 

 h라는 변수가 등장했습니다.

 h는 식에서 보듯 기존 기울기 값을 제곱하여 계속 더해줍니다.

 그리고 매개변수를 개신할 때 $1/\sqrt{h}$을 곱해 학습률을 조정합니다.

 

 매개변수의 원소 중에서 많이 움직인 원소는 학습률이 낮아진다는 뜻인데, 다시 말해 학습률 감소가 매개변수의 원소마다 다르게 적용됨을 뜻합니다.

 

AdaGrad는 과거의 기울기를 제곱하여 계속 더해갑니다. 그래서 학습을 진행할수록 갱신 강도가 약해집니다. 실제로 무한히 계속 학습한다면 어느 순간 갱신량이 0이 되어 전혀 갱신되지 않게 됩니다.

 이 문제를 개선한 기법으로서 RMSProp라는 방법이 있습니다. RMSProp은 과거의 모든 기울기를 균일하게 더해가는 것이 아니라, 먼 과거의 기울기는 서서히 잊고 새로운 기울기 정보를 크게 반영합니다. 이를 지수이동평균이라 하며, 과거 기울기의 반영 규모를 기하급수적으로 감소시킵니다.

 AdaGrad의 구현

class AdaGrad:
    def __init__(self, lr=0.01):
        self.lr = lr
        self.h = None
        
    def update(self, params, grads):
        if self.h is None:
            self.h = {}    
            
      	    for key, val in parmas.items():
        	    self.h[key] = np.zeros_lize(val)
                
        for key in params.keys():
            self.h[key] += grads[key] * grads[key]
            params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)

 

 여기서 주의할 것은 마지막 줄에서 1e-7이라느 작은 값을 더하는 부분입니다. 이 작은 값은 self.h[key]에 0이 담겨 있다 해도 0으로 나누는 사태를 막아줍니다.

 

 그러면 AdaGrad에 의한 최적화 갱신 경로를 확인해보겠습니다.

 

 

 그림을 보면 최솟값을 향해 효율적으로 움직이는 것을 알 수 있습니다.

 y축 방향은 기울기가 커서 처음에느 크게 움직이지마, 그 크 움직임에 비례해 갱신 정도도 큰 폭으로 작아지도록 조정됩니다.

 

반응형