본문 바로가기

ML & DM/Deep Learning

Learning rate decay

Learning rate decay


보통 일반적인 Stochastic gradient descent를 이용한 backprop을 할때 weight 의 learning rate를 잘 조정하는 것이 중요하다. 초기에는 이 learning rate를 grid search(요즘엔 random search를 사용하는 추세이다.)로 찾아 가장 오차를 적게하는 learning rate로 고정을 시켰다. 그러나 이는 실제 오차함수의 최적해를 찾는 과정을 보면 알맞지 않은 방법이다. 이를 골짜기를 향해 내려가는 것에 비유해보면 걸음폭을 일정하게 가지만 골짜기로 내려 갈수록 이 걸음폭을 줄여야만 가장 움푹 패인 곳에 도달할 수 있기 때문이다.


다시말해 최적해를 구하기 위해서는 각 스텝(혹은 iteration, step)이 진행될 때마다 learning rate(걸음폭)을 줄여야 한다는 말이다. 이것이 바로 Learning rate dacay의 중심주제(Theme) 이다. 이를 통해 기존 뉴럴넷들의 성능을 높일 수 있다.


그렇다면 이것은 어떻게 동작되는가?


Learning rate decay의 식과 작동방식은 아래와 같다.

(텐서플로우 코드이다. https://www.tensorflow.org/versions/r0.10/api_docs/python/train.html#exponential_decay)


decayed_learning_rate = learning_rate *
                        decay_rate ^ (global_step / decay_steps)
...
global_step = tf.Variable(0, trainable=False)
starter_learning_rate = 0.1
learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step,
                                           100000, 0.96, staircase=True)
# Passing global_step to minimize() will increment it at each step.
learning_step = (
    tf.GradientDescentOptimizer(learning_rate)
    .minimize(...my loss..., global_step=global_step)
)


global_step은 현재 step을 말한다. 코드를 보면 알겠지만 초기값은 당연히 0부터 시작이다. decay_steps과 decay_rate는 하이퍼파라미터로써 유저가 정해야 하는 값이다. 위 예에서는 각각 100000, 0.96으로 설정했다. 

기존의 learning rate에  decay_rate의 (global_step/decay_step)곱을 지수곱한것이 곱해져 있다. 이것을 풀어 쓰면 global_step이 올라갈때 마다 decay_rate ^ (global_step / decay_steps)만큼 학습률이 줄어들게 되고 global_step내에서 gradient descent를 통해 가장 오차가 작은 곳을 찾는 방식으로 작동한다.


하지만 이는 하이퍼파라미터를 어떻게 조정할것인지에 대한 문제이기 때문에 cost function이 복잡할 때, 근본적문제인 local minima문제가 남아있다. 필자의 생각으로는 오히려 이러한 문제를 부추기는 문제가 있는 것 같다.


grid search and random search 참고문현 : http://scikit-learn.org/stable/modules/grid_search.html