본문 바로가기
코딩/데이터 분석 이론 & 응용

[16] Deep Learning - Learning Rate Scheduling

반응형

[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"

 

 

 

반응형