2 분 소요

11.3.6 학습률 스케줄링

  • 학습률을 너무 크게 잡으면 학습이 빠르게 진행되지만 최적점 주변에서 발산하며, 너무 작게 잡으면 최적점에 수렴하는데 매우 오래 걸린다.

    image

  • 학습 스케줄: 훈련하는 동안 학습률을 감소시키는 전략

    • 큰 학습률로 시작하고 학습 속도가 느려질 때 학습을 낮추면 최적의 고정 학습률보다 좋은 솔루션을 빠르게 발견할 수 있다.


널리 사용하는 5가지 학습률 스케줄링에 대해 알아보자



1. 거듭제곱 기반 스케줄링

image

  • t: 반복 횟수, η0: 초기 학습률, c: 거듭제곱수(일반적으로 1), s: 스텝 횟수 하이퍼파라미터

  • 학습률은 각 스텝마다 감소된다.

  • s번 스텝 후에 학습률은 η0/2로 줄어든다.

  • s번 더 진행되면 학습률은 η0/3, η0/4, …로 빠르게 감소하다가 느리게 감소된다.

  • 튜닝해야할 하이퍼파라미터: η0, s, c

import keras

# 거듭제곱 기반 스케줄링
optimizer = keras.optimizers.SGD(learning_rate=0.01, decay=1e-4)

코드 설명

decay: s(학습률을 나누기 위한 스텝 수)의 역수.

c를 1로 가정한다.



2. 지수 기반 스케줄링

image

  • s번 스텝마다 학습률이 1/10배가 된다.

  • s번 스텝마다 일정하게 1/10배씩 감소한다.

# 지수 기반 스케줄링 - 학습률이 0.01에서 시작하여 20번 스텝마다 학습률이 1/10씩 감소한다.
def exponential_decay_fn(epoch):
    return 0.01 * 0.1**(epoch/20)

초기 학습률과 s(step)를 하드코딩하고 싶지 않으면 변수를 설정한 클로저를 반환하는 함수를 만들어보자

def exponential_decay(lr0, s):
    def exponential_decay_fn(epoch):
        return lr0 * 0.1**(epoch/s)
    return exponential_decay_fn

exponential_decay_fn = exponential_decay(lr0=0.1, s=20)

LearningRateScheduler 콜백을 만들고 fit() 메서드에 전달한다.

lr_scheduler = keras.callbacks.LearningRateScheduler(exponential_decay_fn)
history = model.fit(X_train, y_train, epochs=100
                    validation_data=(X_valid, y_valid), 
                    callbacks=[lr_scheduler])

LearningRateScheduler: 에포크를 시작할 때마다 옵티마이저의 learning_rate 속성을 업데이트한다.


다른 버전 - 표준 Keras API가 아닌 tf.keras에서만 지원한다.

s = 20 * len(X_train) // 32 # 배치 크기 32, 에포크 20, s는 전체 스텝 수
learning_rate = keras.optimizers.schedules.ExponetialDecay(0.01, s, 0.1)
optimizer = keras.optimizers.SGD(learning_rate)



3. 구간별 고정 스케줄링

  • 일정 구간의 에포크동안 일정한 학습률을 사용하고 다음 구간의 에포크 동안 작은 일정한 학습률을 사용한다.

  • ex) (5에포크, η0=0.1), (50에포크, η1=0.001)

  • 잘 동작할 수 있지만 적절한 학습률과 에포크 횟수의 조합을 직접 찾아봐야한다.

# 구간별 고정 스케줄링 함수 -> 이 함수로 LearningRateScheduler 콜백을 만들어 fit() 메서드에 전달하기
def piecewise_constant_fn(epoch):
    if epoch < 5:
        return 0.01
    elif epoch < 15:
        return 0.005
    else:
        return 0.001
    



4. 성능 기반 스케줄링

  • 매 N 스텝마다 Validation loss를 측정하고 loss가 줄어들지 않으면 λ배 만큼 학습률을 감소시킨다.
# 성능 기반 스케줄링에 사용되는 콜백
lr_scheduler = keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=5)

ReduceLROnPlateau: 성능 기반 스케줄링이다. 이 콜백을 fit() 메서드에 전달하면 최상의 검증 손실이 다섯 번의 연속적인 에포크 동안 향상되지 않을 때마다 학습률에 0.5를 곱한다.



5. 1 사이클 스케줄링

  • 초기 학습률η0에서 η1까지 선형적으로 증가시키고, 나머지 절반 에포크 동안 선형적으로 학습률을 초기 학습률η0까지 줄인다. 마지막 몇 번의 에포크는 학습률을 선형적으로 소수점 몇 째자리까지 줄인다.

  • 최대 학습률η1은 최적의 학습률을 찾을 때와 같은 방식으로 찾고, 10배 정도 낮은 값을 η0로 둔다.

  • CIFAR10 이미지 데이터셋에서 이 방식을 사용하여 에포크 100번만에 91.9%의 정확도를 달성하였다.



스케줄링 정리

저자는 성능 기반 스케줄링과 지수 기반 스케줄링이 둘 다 잘 작동했지만 튜닝이 쉽고, 최적점에 빨리 수렴하며 구현이 쉬운 지수 기반 스케줄링을 선호하였다. 그렇지만 1사이클 방식이 조금 더 좋은 성능을 내는 것 같다고 하였다.

댓글남기기