🐍 Python & library/PyTorch

[PyTorch] ReduceLROnPlateau

복만 2021. 10. 26. 16:54

ReduceLROnPlateau는 더이상 학습이 진행되지 않을 때 learning rate를 감소시키는 scheduler이다.

scheduler에 input으로 metric을 주면, 일정 epoch 동안 변화가 없을 때 learning rate를 감소시킨다.

 

주요 Parameter은 다음과 같다.

  • mode: [min, max] 중 하나. Input으로 주는 metric이 낮을수록 좋은지, 높을수록 좋은지를 의미한다. 'min' option을 주면, metric의 감소가 멈출 때마다 learning rate를 감소시킨다.
  • factor: Learning rate를 감소시키는 비율. new_lr = lr * factor이 된다.
  • patience: Metric이 얼마 동안 변화가 없을 때 learning rate를 감소시킬지 결정한다. 만약 patient=2라면, metric이 2 epoch 동안 변화가 없으면 learning rate를 감소시킨다.
  • threshold: Metric이 '변화가 없다'라고 판단하는 threshold. Metric의 변화가 threshold 이하일 시 변화가 없다라고 판단한다.
  • cooldown: 처음 몇 epoch 동안은 변화가 없어도 learning rate를 감소시키지 않는다. 몇 epoch만큼을 기다릴지를 지정한다.
  • eps: Learning rate 감소의 최소치를 지정한다. new_lr과 old_lr의 차이가 eps 이하이면 더이상 learning rate를 감소시키지 않는다.

 

import torch.optim as optim

epochs = 300
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=5, threshold=1e-3)
for epoch in range(epochs):
    train(...)
    val_loss = validate(...)
    scheduler.step(val_loss) #scheduler.step에 input으로 metric을 넣어주어야 한다.

 

위 예시처럼 설정하면, val_lossepoch 5동안 1e-3 이하로 감소하면 learning rate를 절반으로 감소시킨다.

 

*ReduceLROnPlateau는 get_lr() method가 정의되어 있지 않기 때문에 이를 통해 learning rate를 기록할 수 없다.

대신 optimizer.param_groups[0]['lr']을 이용해 learning rate를 받아올 수 있다. (참고)

반응형