ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Scheduler
    전반적인 딥러닝 기법 2021. 8. 13. 18:01

    처음 딥러닝을 시작하면 접하는 용어가 바로 learning rate이다. 일반적으로 딥러닝 모델에서 cost function을 최소화하기 위해 gradient descent 방법을 사용한다. Gradient descent algorithm을 사용하게 되면 기울기의 크기가 줄어드는 방향으로 학습이 진행되며 loss값을 줄이는 때, 이때 얼만큼의 step으로 건너뛰는가를 결정하는 것이 바로 leaning rate가 해주는 일이다.

    모델 학습 과정에서 적절한 learning rate를 설정하는 것은 매우 중요한데 그 이유는 위 그림으로 설명이 가능하다. 만약 learning rate가 매우 작을 경우 학습이 천천히 이루어지므로 optimal한 minimum에 도달하기 까지 시간이 매우 많이 걸릴 것이다. 하지만 반대로 그렇다고 learning rate가 매우 크다면 너무 dramatic한 update가 이루어져 값이 수렴하지 않고 발산하게 될 것이다. 따라서 사람들은 이 learning rate를 0.01부터 시작해서 적절한 값으로 변경하며 학습의 global minumum 값을 찾게 된다.

     

    하지만 조금만 생각해보더라도 학습 과정에서 계속해서 같은 learning rate 값을 주는 것은 비효율적이라는 결론이 나온다. 따라서학습 시작시에는 크게크게 이동했다가 global minumum에 조금 가까이 도달할 때는 느리게 이동해가며 미세조정을 해주는 것이 더 좋아보인다.실제로 Pytorch에서는 학습과정에서 learning rate에 변화를 주는 툴들을 여러 제공하고 있으며 그 중 내가 자주 사용하는 StepLR에 대해 간략하게 소개하고자 한다.

     

    1. StepLR

    StepLR는 흔하게 사용되는 learning rate scheduler 중 하나이다. 파이토치가 제공하는 StepLR에 대한 Class는 다음과 같다.

    Class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1, verbose=False)

    Class에 속해 있는 주요 파라미터는 크게 step_size와 gamma값이 있을 것이다. StepLR는 매 step_size마다 gamma만큼 learning rate를 감소시킨다. 예를 들어 step_size=50, gamma=0.1이라 지정했을 때, 나 학습률은 50 epoch마다 0.1*learning rate만큼 줄어들게 된다.

     

    이처럼 학습률을 epoch이 진행됨에 따라 마치 로그함수와 같이 점차시키는 방법이 많이 쓰여진다. 그러나 이러한 scheduler는 학습이 개시되기 전에 정의되며 학습이 진행되는 동안에는 동일하게 적용되기 때문에 데이터셋의 특성을 반영하여 변화를 주는 것이 어렵다. 따라서 이를 위해 나온 개념이 바로 주기적 학습률, 즉 Cyclical Learning rate이다.

     

    2. Cyclical Learning rate

    주기적 학습률은 learning rate가 합리적인 최소값과 최대값 사이를 지속적으로 오가는 것을 허용한다. 바꿔말하면 최적은 learning rate는 최소값과 최대값 사이 어딘가에 놓여 있을 거기 때문에 CLR은 가장 좋은 learning rate를 찾을 이유가 없다.

    파이토치에서 제공하는 CLR 클래스 및 파라미터는 아래와 같으며 보다 정확한 설명은 다음 github에 자세히 나와있다.

    https://github.com/bckenstler/CLR

    CLASS torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1, verbose=False)
    <Mode>
    1. triangular : amplitude scaling이 없는 basic한 triangular cycle
    2. triangular2 : 매 cycle마다 initial amplitude를 반으로 sacling해주는 basic triangular cycle
    3. exp_range : 매 cycle iteration마다 initial amplitude를 gamma만큼 scaling해주는 cycle

    1. Triangular

    2. Triangular2

    3. exp_range

    마지막으로 소개할 이와 비슷한 개념으로 나온 scheduler는 one cycle policy이다. 이는 내가 저번에 발표한 ppt 자료를 참고하여 설명하도록 하겠다.

     

    3. One Cycle policy

    CLASS torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr, total_steps=None, epochs=None, steps_per_epoch=None, pct_start=0.3, anneal_strategy='cos', cycle_momentum=True, base_momentum=0.85, max_momentum=0.95, div_factor=25.0, final_div_factor=10000.0, three_phase=False, last_epoch=-1, verbose=False)

    OnecycleLR 역시 학습률이 삼각혐의 모습을 이루고 있지만 CLR와 다른 점은 scheduler가 chainable하지 않다는 점이다. 이 기법은 Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates에서 처음 소개되었다.

     

    이 밖에도 pytorch가 제공하는 scheduler들은 매우 다양하며 이는 https://pytorch.org/docs/stable/optim.html에서 확인해볼 수 있다.

    댓글

Designed by Tistory.