[16] Deep Learning - Learning Rate Scheduling
Learning Rate Scheduling
학습률 lr 은 모델을 학습하는 데에 있어 중요한 parameter다. lr은 성능과 훈련 시간 사이를 저울질한다. 너무 낮은 lr은 훈련 시간이 매우 오래 걸리게 만들지만 , 너무 높은 lr은 도착한 최적점에 대해 신뢰를 주지 못할 수 있다. 언제나 유한한 컴퓨팅 자원을 통해 모델을 만드므로 , 적절한 lr을 찾는 것은 언제나 중요하다.
일반적으로 알려진 좋은 lr을 선택하는 방법은 모델 학습을 반복하면서 lr을 지수적으로 증가시킨 후 , 곡선을 확인하고 , 곡선의 상승보다 낮춰서 선택한 lr로 다시 훈련하는 방식이 알려져 있다. 즉 lr을 점차적으로 낮춰갈 텐데 , 이때 사용할 수 있는 몇 가지 방법들이 있고 이를 Learning Rate Scheduling이라고 한다.
Power Scheduling (제곱 기반 스케줄링)
제곱 기반 스케줄링은 학습률에 대한 식을 다음과 같이 정의한다.
위의 식에서 η0는 초기 학습률 , c는 제곱수 (일반적으로 1) , t는 반복횟수 , s는 스텝 횟수다. lr은 스텝이 진행됨에 따라 점차 감소하게 된다. s번 스텝이 진행되면서 초기값의 1/2 , 1/3 , 1/4...로 줄어들 것이다. 줄어드는 scale을 생각해보면 처음에 급격히 감소하고 뒤로 갈수록 느리게 감소하는 것을 볼 수 있다. s , c , lr초기값을 튜닝해 사용할 수 있다.
keras에서 제곱 기반 스케줄링을 구현하는 방법은 다음과 같다.
optimizer = keras.optimizers.SGD(lr=0.01 , decay=1e-4)
#decay는 s의 역수
위의 코드에서 s는 decay의 역수로 표현이 되어있지만 , c는 들어있지 않다. keras에서 제곱 기반 스케줄링의 c를 1로 두고 있다.
Exponential Scheduling (지수 기반 스케줄링)
지수 기반 스케줄링의 식은 다음과 같다.
지수 기반 스케줄링의 η0 , t , s도 제곱 기반 스케줄링과 같다. lr의 감소율을 생각해보면 0.1 , 0.01... 이므로 10배씩 감소되는 것을 볼 수 있다. 즉 s번 스텝마다 10배씩 감소하게 되는 것이다.
keras에서 지수 기반 스케줄링을 구현하는 방법은 다음과 같다.
def exponential_lr(epoch,lr):
return lr * 0.1**(1 / 20)
위의 코드는 초기 lr에만 영향을 받기 떄문에 초기 lr을 적절하게 선택해야 한다.
Piecewise constant Scheduling (구간별 고정 스케줄링)
구간별 고정 스케줄링은 일정 epoch 동알 고정된 lr을 사용하고 , 또 다른 횟수 동안 작은 lr을 사용하는 방법이다. 구간별 고정 스케줄링을 사용하기 위해서는 적절한 lr과 epoch의 횟수를 찾아야 한다.
keras에서 구간별 고정 스케줄링을 사용하는 방법은 다음과 같다.
def piecewise(epoch):
if epoch < 5:
return 0.01
elif epoch < 15:
return 0.005
else:
return 0.001
lr_scheduler = keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=5)
위의 코드는 ReduceLROnPlateau 콜백을 사용해서 성능 기반 스케줄링을 구현하고 있다.
Performance Scheduling (성능 기반 스케줄링)
매 스텝마다 validation error를 확인하고 , error가 줄어들지 않으면 i 배만큼 lr을 감소시키는 방법이다.
1 Cycle Scheduling (1 사이클 스케줄링)
1 사이클 스케줄링 방법은 초기에 설정된 lr , η0를 훈련 절반 동안 선형적으로 증가시켜 η1 까지 만든다. 이후 나머지 절반 동안은 lr을 다시 η0로 줄인다. 최대 lr인 η1은 최적의 lr을 찾는 방법과 동일하게 선택하고 , 초기 학습률은 약 10배 정도 낮은 값을 선택한다. 이후 오르락내리락 과정을 한번 반복한 후 , 마지막 몇 개의 epoch에서는 η0 보다 좀 더 감소시킨다. 물론 이때도 선형적으로 감소한다.
keras의 다양한 lr 스케줄링은 콜백을 적절히 사용하는 것으로 만들 수 있다. self.model.optimizer.lr을 통해 optimizer의 lr을 바꿀 수 있고 , 다양한 방법을 통해 위의 lr 스케줄링 방법들을 구현할 수 있다. 일반적으로 지수 기반 , 성능 기반 , 1 사이클 스케줄링이 성능이 좋다고 알려져 있다.
ref. "Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition"
'코딩 > 데이터 분석 이론 & 응용' 카테고리의 다른 글
[18] Deep Learning - Tensorflow (0) | 2022.02.04 |
---|---|
[17] Deep Learning - Regularization (0) | 2022.01.27 |
[15] Deep Learning - Optimizer (0) | 2022.01.24 |
[14] Deep Learning - Transfer Learning & Pre-training (0) | 2022.01.23 |
[13] Deep Learning - Gradient clipping (0) | 2022.01.20 |