Published 2022. 12. 6. 00:11

Warm-up

Warm-up 방법은 성능 향상을 위해 Learning rate를 조절하는 방법이다.

 

해당 방법은 Bag of Tricks for Image Classification with CNN(https://arxiv.org/pdf/1812.01187.pdf)에서 이미지 분류의 성능을 높이기 위한 방법 중 하나로 소개되었다. 시간 나면 다 읽어봐야지...

 

학습을 시작할 때, 우리는 모든 parameters를 random으로 초기화 해주고 이후에 최적화를 통해 업데이트한다.

이때 Learning rate라는 하이퍼 파라미터를 지정해주는데 만약 매우 큰 Learning rate를 사용하게 되면 최적화된 파라미터에 가까워지지 못하고 수치적으로 불안정한 상태가 된다.

 

이러한 점을 보완하기 위한 방법이 Warm-up 방법이다. 

시작할 때는 매우 작은 Learning rate로 출발하여 안정적인 parameter값들을 형성하고, 특정 시점부터 초기에 정한 Learning rate로 학습하는 것을 의미한다

보통은 5 epoch 까지 Warm-up을 적용한다고 한다.

 


Learning rate scheduler

Pytorch에서 제공하는 다양한 Learning rate scheduler가 있지만 여기서는 LambdaLr,

ReduceLROnPlateau, get_cosine_schedule_with_warmup에 대해 알아보고자 한다.

 

* Learning rate는 1 epoch마다 scheduler.step()을 통해 업데이트한다.

* 중요하다고 생각되는 파라미터만 작성했다! 나머지는 https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate 여기서 확인해보자.

1. LambdaLR

우리가 보통 파이썬에서 쓰는 lambda 표현식을 통해 epoch마다 learning rate를 얼마나 조절할 건지 결정해준다.

epoch마다 초기 learnig rate를 lambda에서 설정한 비율만큼 감소시키는 scheduler이다.

torch.optim.lr_scheduler.LambdaLR(최적화 함수, lr_lambda = lambda 함수)

- 최적화 함수 = optimizer

- lr_lambda = 사용자가 원하는 lambda함수

torch.optim.lr_scheduler.LambdaLR(최적화 함수, lr_lambda = lambda 함수)

### 예를 들어 ###

model = model()
optim = torch.optim.SGD(model, lr=0.01)
lambda1 = lambda epoch : 0.65 ** epoch
scheduler = torch.optim.lr_scheduler.LambdaLR(optim, lr_lambda=lambda1)


### 1epoch마다 scheduler update ###

for epoch in range(epochs):
	optimizer.step()
   	...
   	scheduler.step()

 

 

2. ReduceLROnPlateau

모델의 성능 향상이 없을 때 Learning rate를 감소시키는 방법이다. 성능 향상에 대한 지표는 validation data 평가 지표에서 알 수 있기 때문에 해당 값을 scheduler.step(평가 지표) input으로 넣어야 한다. optimizer에서 momentum을 설정해야 사용할 수 있다고 한다.

torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10)

- optimizer = 최적화 함수

- mode = input으로 들어오는 값이 최소 또는 최대가 되어야 하는지를 의미한다. 만약 'min'이면 input으로 들어오는 값이 감소하지 않으면 Learning rate를 감소시킨다.

- factor = 첫 주기 이후 곱해지는 값

- patience = 어느정도의 epoch 동한 변화가 없으면 Learnig rate를 감소할 건지를 결정한다. 10이면 10 epoch동안 변화가 없으면 Learning rate를 감소시킨다.

 

3. CosineAnnealingWarmRestarts

ConsineAnnealing은 Learning rate를 cosine함수의 주기와 같이 감소, 증가하는 과정을 반복하는 것을 의미한다. WarmRestart는 Learning rate가 감소한 후 local optima에 빠지는 것을 방지하기 위해 Learning rate를 급격하게 증가시키는 방법이다.

 

torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimzer, T_0, T_mult=1, eta_min=0)

- optimizer = 최적화 함수

- T_0 = 첫 주기의 길이

- T_mult = 첫 주기 이후 곱해지는 값

- eta_min = 최소 Learing rate

- optimizer에서 설정한 Learnig rate = 최대 Learning rate

 

* custom된 방법으로 많이들 사용하나 보다..

https://github.com/katsura-jp/pytorch-cosine-annealing-with-warmup/blob/master/cosine_annealing_warmup/scheduler.py

 

GitHub - katsura-jp/pytorch-cosine-annealing-with-warmup

Contribute to katsura-jp/pytorch-cosine-annealing-with-warmup development by creating an account on GitHub.

github.com

 

 

 

Reference

감사합니다!

https://better-tomorrow.tistory.com/entry/Learning-rate-Warmup

https://kmhana.tistory.com/25 

https://norman3.github.io/papers/docs/bag_of_tricks_for_image_classification.html

https://sanghyu.tistory.com/113

https://dacon.io/codeshare/2373

https://bo-10000.tistory.com/88

복사했습니다!