학습률(Learning Rate, LR)은 딥러닝 모델의 최적화를 위해 매우 중요한 하이퍼파라미터이다. 학습률은 모델이 각 반복(iteration)마다 가중치를 얼마나 크게 업데이트할지를 결정하며, 적절한 값을 선택하지 않으면 학습 속도와 성능에 큰 영향을 미친다. 이번 글에서는 학습률의 종류와 설정 방법에 대해 정리한다.
고정 학습률(Fixed Learning Rate)
고정 학습률은 학습 과정에서 변하지 않는 일정한 값을 사용하는 방법이다. 학습이 단순한 경우나 데이터가 안정적일 때 사용되며, 설정이 간단하다는 장점이 있다. 그러나 학습 초기에 과도하게 큰 값으로 설정되면 학습이 불안정해지고, 너무 작은 값으로 설정하면 학습 속도가 느려질 수 있다.
- 장점: 설정이 간단하고 구현이 쉬움.
- 단점: 학습 과정에 따라 유연하게 대응하지 못함.
lr = 0.01
학습률 감소(Learning Rate Decay)
학습이 진행됨에 따라 학습률을 점차 줄이는 방법이다. 학습 초기에는 큰 학습률로 빠르게 최적화하고, 이후에는 작은 학습률로 세밀하게 조정하는 데 유용하다.
1. Step Decay
일정 단계(epoch)마다 학습률을 감소시키는 방법이다.
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.5)
step_size=10으로 설정되어 있으므로, 10 epoch 마다 학습률이 감소
gamma=0.5는 학습률을 0.5배로 줄이는 역할
2. Exponential Decay
학습률을 매 단계 지수적으로 감소시키는 방법이며, 감소율을 더욱 세밀하게 조정 가능하다
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
gamma=0.9 설정에 따라, 매 에포크마다 학습률이 90%로 줄어든다.
초기 학습률이 0.01에서 시작하여 점점 작아지며, 에포크가 진행될수록 감소 속도가 느려지는 것을 확인할 수 있다.
3. Cosine Annealing
상대적으로 짧은 주기로 학습률을 조정하기 때문에, 더 빈번하게 다양한 지역 최적값을 탐색할 수 있다. 이를 통해 학습 초기와 중후반 모두에서 효과적인 학습을 기대할 수 있다.
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10, eta_min=0.001)
2.4 Reduce on Plateau
검증 손실(validation loss)이 일정 횟수 이상 개선되지 않을 경우 학습률을 줄이는 방법이다. 과적합(overfitting)을 방지하고, 학습을 효율적으로 진행할 수 있다.
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', patience=5, factor=0.5)
mode='min'
손실이 감소하지 않을 때 학습률을 줄이는 방식이다.
patience=5
손실이 patience 에포크 동안 개선되지 않으면 학습률을 조정한다.
예를 들어, 손실이 5 에포크 동안 줄어들지 않으면 학습률이 감소한다.
factor=0.5
학습률이 이전 학습률의 50%로 감소한다.
학습률 스케줄링(Learning Rate Scheduling)
학습률을 동적으로 조정하는 방식으로, 학습의 효율성을 극대화하기 위해 설계되었다.
1. Warm-Up
학습 초기에 학습률을 점진적으로 증가시키는 방법이다.
모델이 학습 초기 단계에서 너무 큰 변화에 적응하지 못하는 것을 방지한다.
또한, 학습 초기에 적절한 학습률로 시작하여 모델이 더 빠르고 안정적으로 수렴할 수 있도록 도와준다.
num_epochs = 20
warmup_epochs = 5
initial_lr = 0.01
for epoch in range(num_epochs):
lr = initial_lr * (epoch / warmup_epochs)
2. One-Cycle Policy
한 사이클 안에서 학습률을 점진적으로 증가시키다가 감소시키는 방식이다. 이 방법은 학습을 빠르게 안정화시키고, 좋은 성능을 보이는 것으로 알려져 있다.
scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.1, steps_per_epoch=100, epochs=10)
OneCycleLR의 장점
빠른 수렴
초기 학습률 증가로 탐색 범위를 넓히고, 최적화 방향을 빠르게 찾는다.
안정성 확보
감소 단계에서 학습률을 줄여 세밀한 조정을 가능하게 한다.
성능 극대화
학습의 각 단계에서 적절한 학습률을 제공해 모델 성능을 향상시킨다.
학습률 검색(Learning Rate Finder)
적절한 학습률을 찾기 위해 학습률을 점진적으로 증가시키면서 손실 값을 관찰하는 방법이다.
이 방법은 최적의 학습률 범위를 시각적으로 확인할 수 있어 유용하다.
사용 가능한 라이브러리
1. torch_lr_finder
- PyTorch 기반 학습률 검색 라이브러리
- 사용법이 간단하며 손실과 학습률 간의 관계를 그래프로 출력
from torch_lr_finder import LRFinder
# 모델과 데이터 준비
model = ... # PyTorch 모델
criterion = torch.nn.CrossEntropyLoss() # 손실 함수
optimizer = torch.optim.SGD(model.parameters(), lr=1e-7) # 초기 학습률 설정
train_loader = ... # DataLoader 객체
# 학습률 검색 실행
lr_finder = LRFinder(model, optimizer, criterion, device="cuda")
lr_finder.range_test(train_loader, end_lr=10, num_iter=100)
end_lr
학습률 검색이 끝날 때의 최대 학습률
보통 1~10 사이로 설정
num_iter
학습률을 점진적으로 증가시키는 학습 반복 횟수
데이터셋 크기에 따라 적절히 조정
2. FastAI
- FastAI 라이브러리에서 학습률 검색은 lr_find() 메서드로 제공
- 사용자가 적절한 학습률을 직관적으로 선택할 수 있도록 시각화 지원
from fastai.vision.all import *
# 데이터 준비
dls = ImageDataLoaders.from_folder('path/to/data')
# 모델 준비
learn = cnn_learner(dls, resnet34, metrics=error_rate)
# 학습률 검색 실행
learn.lr_find()
# 최적 학습률을 기반으로 학습 시작
learn.fine_tune(5, base_lr=3e-3) # lr_find()로 찾은 최적 학습률 사용
손실이 급격히 감소하기 시작하는 지점이 최적 학습률
손실이 발산하기 직전의 학습률은 최대 학습률로 설정 가능
학습률 설정 팁
- 초기 설정:
- 기본 학습률은 0.01 ~ 0.001 사이로 설정하는 경우가 많다.
- 작은 학습률부터 시작해 조금씩 조정하는 것이 안전하다.
- 학습 곡선 관찰:
- 학습률이 너무 크면 학습이 불안정하고, 너무 작으면 학습이 느려진다.
- 학습 곡선을 지속적으로 확인하며 조정해야 한다.
학습률은 딥러닝 모델의 성능과 학습 속도를 크게 좌우하는 요소이다. 적절한 학습률을 선택하고, 상황에 따라 동적으로 조정하는 것이 성공적인 모델 학습의 핵심이다. 다양한 학습률 전략을 실험하며 최적의 설정을 찾아가는 과정을 즐기기 바란다.
댓글