[머신러닝] 모멘텀(Momentum), NAG 옵티마이저

    모멘텀(Momentum)

    모멘텀이란 물리학에서 쓰이는 용어인 운동량, 동력을 뜻하며 이를 옵티마이저 개념에 적용한 것이 모멘텀 옵티마이저이다. 우선 모멘텀을 이해하기 위해서는 이전에 등장한 경사하강법 계열들을 이해해야 하는데 이 개념이 나온 이유가 바로 경사하강법 특히 확률적 경사하강법(Stochastic Gradient Descent, SGD)에서 나온 개념이기 때문이다.

     

    모멘텀, NAG 옵티마이저

     

    SGD의 지그재그로 움직이며 최적화되는 것을 해결하기 위해서 나왔으며 너무 왔다갔다 해서 지역 최소값(local minimum)에 갇혀 빠져나오지 못하는 경우가 많은데 이를 위해 관성과 가속도 넣어서 지그재그가 아니라 한 방향으로 좀 더 이동할 수 있게 한 것이다. 

     

    https://eloquentarduino.github.io/2020/04/stochastic-gradient-descent-on-your-microcontroller/

     

    현재 이동하는 방향과는 별개로 과거에 이동을 했었던 방향을 기억하여 과거의 방향으로 일정량을 추가하여 이동을 하게 되는데 기존의 파라미터 이외에 과거의 행동을 저장해야 하므로 메모리가 더 필요한 단점도 있다.

     

    텐서플로우 v1 버전, Momentum 옵티마이저

    # 사용예 1
    optimizer = tf.train.MomentumOptimizer(learning_rate=0.01, momentum=0.9)
    train = optimizer.minimize(loss)
    
    # 사용예 2
    tf.compat.v1.train.MomentumOptimizer(
        learning_rate, momentum, use_locking=False, name='Momentum',
        use_nesterov=False
    )

    텐서플로우(Tensorflow)의 초창기를 보면, 다음과 같이 모멘텀이 별도로 존재해서 옵티마이저(Optimizer)를 설정하는 것을 알 수 있다. 하지만 옵티마이저는 사실상 SGD를 위한 방법이기 때문에 케라스(Keras)로 연결되는 텐서플로우 2에서는 사용 방법이 아래처럼 바뀐다.

     

    케라스 Momentum 옵티마이저

    tf.keras.optimizers.SGD(
        learning_rate=0.01, momentum=0.0, nesterov=False, name='SGD', **kwargs
    )

    케라스의 모멘텀 옵티마이저는 SGD내에서 모멘텀을 설정하는 것이다.

     

     

    NAG(Nesterov Accelerated Gradient)

    NAG는 Momentum 방식을 베이스로 하며 미리 경사를 확인 할 수 있게 하고 경사에 맞춰 속도를 조절하는 방식으로 기울기를 계산하는 옵티마이저이다.

     

    모멘텀은 이동 벡터를 계산할 때 현재 위치에서 기울기와 모멘텀 스텝을 독립적 계산 수행 후 합치지만 NAG는 모멘텀 스텝을 먼저 이동했다 가정 후 해당 위치에서 기울기를 구해 스텝을 이동한다.

     

    모멘텀과 Nesterov의 차이

     

    모멘텀은 관성으로 인해서 최적값을 지나칠 수 있는 단점이 있는데 NAG는 같이 관성을 이용하더라도 학습이 어느정도 진행이 되었다면 최적값을 지나치는 문제를 방지할 수 있다.

     

    텐서플로우 v1 버전에서 사용하는 NAG 옵티마이저

    tf.train.MomentumOptimizer(0.05, 0.03, use_nesterov=True)

    네스테로브 옵티마이저는 모멘텀에서 파생되었기 때문에 모멘텀 옵티마이저 설정에서 옵션값으로 제공된다. 그러나 텐서플로우 v2 즉 케라스에서 설정하는 방법은 윗 케라스 소스를 보면 알겠지만 통합되었다.

     

    케라스에서 사용하는 NAG 옵티마이저

    tf.keras.optimizers.SGD(
        learning_rate=0.01, momentum=0.0, nesterov=False, name='SGD', **kwargs
    )

    옵티마이저에서 파생된 개념이고, 옵티마이저는 SGD에서 파생되다보니 SGD 옵티마이저에서 모멘텀과 함께 옵션으로 제공하게 된다.

     

     

    댓글

    Designed by JB FACTORY