지난 글 Momentum에 이어서 이번에는 AdaGrad라는 매개변수의 Optimizer에 대해서 알아보도록 하겠습니다.

AdaGrad란?

Adaptive Gradient의 줄임말로서 지금까지 많이 변화한 매개변수는 적게 변화하도록, 반대로 적게 변화한 매개변수는 많이 변화하도록 learning late의 값을 조절하는 개념을 기존의 SGD에 적용한 것입니다.

 

AdaGrad의 장점

SGD에서 비등방성 함수의 경우 비효율적이라고 얘기하면서 예시를 보여드렸습니다.

지그재그로 계속 이동하게되어 실제 손실함수의 최솟값으로 이동하는데 비효율적인데 만약 학습률(learning late)을 낮춘다면 어떻게 될까요? SGD에서 손실함수의 기울기(gradient)는 벡터의 방향성을, 학습률은 벡터의 크기를 의미하는 바가 큽니다. 만약 학습률은 점진적으로 낮춘다면 지그재그로 활동하는 형태를 줄여 매개변수 y는 좀더 빠르게 손실함수의 최솟값으로 다가갈 수 있습니다.

 

또한 위 예시에서는 x축에 대해서는 조금씩 조금씩 이동하는데 만약 매개변수 x에 대한 학습률(learning late)를 올린다면 어떻게 될까요? 더 빠르게 최솟값에 도달 할 수 있습니다.

 

 

 

공식

위 식에서 두 번째를 보면 h를 제외하면 기존의 SGD와 같은 갱신방법이라는 것을 알 수 있습니다. 여기에 h를 곱하여 학습률에 개입하여 위 AdaGrad의 개념을 사용할 수 있습니다. h에는 매번 갱신될때마다 해당 매개변수의 기울기값을 제곱하여 넣습니다. 즉 이런 방법을 통해서 처음에는 학습률을 높이고 많이 이동 할 수록 학습률을 낮출 수 있습니다. 

 

결과

문제점과 해결방안

AdaGrad의 문제점은 h의 값은 항상 양으로 커지기 때문에 매개변수가 매우 크게 이동하여 h의 값이 무한대로 커진다면 해당 매개변수의 학습이 정체 될 수 있다는 점입니다. 이런점을 해결하기 위해서 RMSProp라는 새로운 방안이 있습니다. 

글의 목적

지난 글 동안 매개변수의 최적값을 찾아내기 위해서 손실함수를 미분하여 가장 낮은 경사를 따라 내려가는 경사하강법(Gradient Descent)을 사용했습니다. 이번에는 최적값을 찾아내기 위한 여러가지 Optimizer중 SGD에 대해서 알아보도록 하겠습니다.

여기서 Optimizer는 매개변수가 기울기를 이용해서 최적값을 찾아가는 방법을 통틀어서 말한 것입니다.

확률적 경사 하강법, SGD( Stochastic Gradient Decent )

1. 개념

출처: https://seamless.tistory.com/38

SGD의 개념은 기존의 GD를 알고있다면 이해하기 쉽습니다. GD는 위 사진처럼 매번 모든 트레이닝 데이터에 대한 손실함수를 구하고 기울기를 구하는 과정입니다. 이런 과정은 보다 정확하게 최적값을 찾을 수 있겠지만 현실적으로 트레이닝 데이터는 수십 만에서 수 천만까지 매우 용량이 많으므로 기울기를 구할 때 이 모두를 계산하는것은 시간이 너무 오래 걸리므로 비현실적입니다.

 이런 문제를 해결하기 위해서 트레이닝 데이터를 mini-batch단위 만큼 무작위로 추출하여 이 데이터만으로 학습을 하는 것이 Stochastic Gradient Decent입니다.

무작위, 표본집단을 계속 추출하여 최적해를 구한다면 최적해의 값은 통계학적으로 GD와 별 차이가 없습니다. 결과값은 별 차이가 없지만 시간은 매우 단축할 수 있다는 장점이 있기에 SGD가 많이 사용되기 시작했습니다.

 

2. 공식

변수 설명

W : 매개변수( weight, bias )

n : 학습률( learning late )

ℓL / ℓW : 매개변수에 대한 결괏값의 기울기

 

위 개념에 대해서 이해했다면 공식은 아주 쉬울 것입니다.

사실상 공식 자체는 GD와 다를 바가 없으며 중요한 점은 SGD가 학습을 할 때는 일부 데이터만 무작위로 추출하여 사용한다는 것입니다. 

 

3. 구현

class SGD:

    """확률적 경사 하강법(Stochastic Gradient Descent)"""

    def __init__(self, lr=0.01):
        self.lr = lr
        
    def update(self, params, grads):
        for key in params.keys():
            params[key] -= self.lr * grads[key] 

4. 문제점 

1. 비등방성 함수 문제

위 그래프는 문제점을 보여주기 위한 예시입니다. 그래프를 보면 x축에서는 변화가 별로없지만 y축은 U자를 그리며 격한 기울기를 가지고 있는 모습을 볼 수 있습니다. 위 같은 그래프같은 비등방성 함수(Anisotropy) SGD를 수행하면 아래의 그림처럼 y축에 대해서 지그재그로 움직여 최적해를 찾는 데 시간이 더 소요되는 문제가 발생합니다.

지그재그 문재를 해결하기 위해서 새로운 Optimizer를 고안한 결과로 Momentum과 AdaGrad가 개발되었는데 이에 대해서는 다음 글에서 다루도록 하겠습니다.

 

2. Local minima 문제

매개변수 w가 기울기를 따라서 계속 진행하여 기울기가 0이 되는 지점에 도착했습니다.

그런데 만약 그 지점이 손실함수의 최솟값이 아니라 극솟값( local minima )이라면 문제가 발생합니다.

손실함수를 최소화하지 못했는데 기울기가 0이되어 더 이상 매개변수가 갱신되지 않아 학습이 멈추는 것이죠

이는 Momentum에서 해결 할 수 있습니다. 해결방법은 Momentum에 대한 글에서 설명하겠습니다.

+ Recent posts