AI4NLP

Learning rate Scheduler 설명 본문

Machine Learning

Learning rate Scheduler 설명

nlp user 2020. 6. 21. 23:05

딥러닝, 머신러닝을 사용할 때에 Model이나 Optimizer에는 많은 신경을 쓰지만 Lr Scheduler에는 많은 신경을 쓰지 않는 경우가 많습니다. (제가 그랬습니다...ㅠㅠ)

실제 학습을 할 때에 어떤 Lr Scheduler를 고르느냐, Lr Scheduler의 Hyperparameter로 어떤 값을 고르느냐에 따라 학습 결과에는 큰 차이가 존재합니다.


Lr Scheduler는 미리 학습 일정을 정해두고, 그 일정에 따라 학습률을 조정하는 방법입니다. 일반적으로는 warmup이라는 파라미터를 정하고 현재 step이 warmup보다 낮을 경우는 learning rate를 linear하게 증가 시키고, warmup 후에는 각 Lr Scheduler에서 정한 방법대로 learning rate를 update합니다.

이번 포스팅에서는 Learning rate scheduler(이하 Lr Scheduler)에 대해 다뤄보려고 합니다.

  1. Constant Lr Scheduler

    Learning rate를 고정된 값(Constant)으로 설정하는 Lr Scheduler입니다. Learning rate의 변화가 없으며, 처음부터 끝까지 고정된 값으로 학습되는 방식입니다.

  2. Exponential Lr Scheduler

    매번마다 현재 step의 비율을 지수(exponential)로 취해주는 Lr Scheduler입니다. stage_length를 정해주고 현재 step이 stage_length 이하일 때까지는 1이하의 값을 지수로 취해주고, 현재 step가 stage_length를 초과할 경우는 1 이상의 값을 지수로 취해줍니다. floor 함수를 취해서 step의 비율 값을 정수로 설정할 수도 있습니다.

     


    cur_stage = step / stage_length
    if staircase:
        cur_stage = np.floor(cur_stage)
    learning_rate = init_lr * decay ** cur_stage

  3. King Lr Scheduler

    King Scheduler는 loss history에 맞는 OLS(Ordinary least square)의 기울기가 음수일 확률을 계산하고, 최근 step에서의 이 확률이 51% 미만일 경우, learning rate를 급격하게 감소시키는 방법입니다.

    참고 ) http://blog.dlib.net/2018/02/automatic-learning-rate-scheduling-that.html

  4. Cosine Lr Scheduler

    warmup 후에는 코사인 함수를 이용하여 Learning rate를 scaling하는 방식입니다. t_curr은 현재 주기 범위 내의 업데이트 비율이며 t_i는 현재 주기 범위입니다.


    lr = lr_min + 0.5*(lr_max - lr_min)*(1 + cos(t_cur / t_i))


    구현 참고 : https://fairseq.readthedocs.io/en/latest/_modules/fairseq/optim/lr_scheduler/cosine_lr_scheduler.html#CosineSchedule

    논문 : https://arxiv.org/pdf/1608.03983.pdf

  5. Noam Lr Scheduler

    linear한 warmup 후 inverse square root를 취하여 업데이트 하는 방식입니다. 'Attention is all you need" 논문에서 transformer 업데이트에 사용한 Lr Scheduler입니다.

     

    lr = scale_factor * ( (model_dim ** (-0.5)) * adj_step )

    adj_step = min(step_num ** (-0.5), step_num * warmup_steps ** (-1.5))

    논문 : https://arxiv.org/abs/1706.03762
  6. ReduceLROnPlateau

    warmup 이전까지는 선형적으로 증가시키다가, warmup 이후 val_loss의 정체(Plateau)가 생기면 Learning rate를 축소시키는 방법입니다.

    구현 참고 : https://fairseq.readthedocs.io/en/latest/_modules/fairseq/optim/lr_scheduler/reduce_lr_on_plateau.html#ReduceLROnPlateau

 

Training 에서는 같은 모델이더라도, 어떤 Lr Scheduler를 사용하냐에 따라 더 좋은 결과를 얻어낼 수 있을 것입니다.

Comments