Optimzer의 Learning Rate을 관리하는 Scheduler를 이용하면 똑같은 환경에서도 조금 더 나은 학습 결과를 얻을 수 있습니다. pytorch에서 여러가지 종류의 Scheduler를 제공하니, 종류와 활용 방법을 체크하는 것이 좋습니다. https://sanghyu.tistory.com/113 블로그에서는 각 Scheduler의 Learning Rate 변화를 시각적으로 표현해주셔서 직관적으로 파악하는 것을 도와줍니다. 참고하시길 추천합니다.

다만, Pytorch가 제공하는 Scheduler 중 일부는 그대로 이용하기에는 몇가지 아쉬움이 있습니다. 특히 이번 포스팅에서 다룰 Cosine Annealing Warm Up Restarts의 경우 특히 그렇습니다.

Pytorch Original

torch.optim.lr_scheduler.CosineAnnealingWarmRestarts는 아래와 같은 parameter를 가집니다.
참조 : pytorch tutorial

  • optimizer (Optimizer) – Wrapped optimizer.
  • T_0 (int) – Number of iterations for the first restart.
  • T_mult (int, optional) – A factor increases \(T_{i}\) after a restart. Default: 1.
  • eta_min (float, optional) – Minimum learning rate. Default: 0.
  • last_epoch (int, optional) – The index of last epoch. Default: -1.
  • verbose (bool) – If True, prints a message to stdout for each update. Default: False.

위의 parameter로 조작할 수 있는 요소는 아래의 그림과 같이 제한적입니다.

Custom Cosine Annealing Warm Up Restarts

위의 Pytorch 제공 class에서 scheduler 주기에 따라 eta_max를 변경하거나, warmup_steps를 바꾸는 등의 더 많은 조작 요소를 추가하기 위해 나름대로의 custom 코드를 만들어 이용해왔습니다. 그런데 제가 만들었던 코드 보다 더 깔끔하고 직관적으로 작성된 repository가 있어 소개하고자 합니다.

katsura-jp/pytorch-cosine-annealing-with-warmup에서는 pip을 통해 install해서 간편하게 import 할 수 있는 pytorch lr_scheduler class를 제공합니다.

이 라이브러리에서는 아래의 parameter를 제공합니다.

  • optimizer (Optimizer): Wrapped optimizer.
  • first_cycle_steps (int): First cycle step size.
  • cycle_mult (float): Cycle steps magnification. Default: 1.
  • max_lr (float): First cycle’s max learning rate. Default: 0.1.
  • min_lr (float): Min learning rate. Default: 0.001.
  • warmup_steps (int): Linear warmup step size. Default: 0.
  • gamma (float): Decrease rate of max learning rate by cycle. Default: 1.
  • last_epoch (int): The index of last epoch. Default: -1.

조금 더 많은 parameter를 이용하여 아래의 그림과 같이 내가 원하는 대로 특정 학습 단계에서 Learning rate을 조절할 수 있습니다.