Learning Rate
학습률
가중치 업데이트 크기를 결정하는 하이퍼파라미터. 너무 크면 발산.
학습률
가중치 업데이트 크기를 결정하는 하이퍼파라미터. 너무 크면 발산.
Learning Rate(학습률)는 모델 가중치를 업데이트할 때 gradient에 곱해지는 스케일러입니다. w_new = w_old - lr * gradient 수식에서 lr이 학습률입니다. 딥러닝에서 가장 중요한 하이퍼파라미터로, 너무 크면 발산하고 너무 작으면 수렴이 느립니다.
일반적인 범위: CNN은 1e-3~1e-2, Transformer/LLM은 1e-5~1e-4, Fine-tuning은 1e-5~5e-5. Adam 옵티마이저는 SGD보다 낮은 학습률에서 잘 작동합니다.
Learning Rate Schedule: 고정 lr보다 동적 조절이 효과적. Warmup(처음에 서서히 증가), Step Decay(일정 epoch마다 감소), Cosine Annealing(코사인 곡선으로 감소), OneCycleLR(한 사이클 내 증가 후 감소)이 대표적입니다.
LLM 시대의 학습률: 대규모 모델은 Warmup이 필수(보통 전체의 1~3%)이고, Cosine Decay로 끝까지 학습합니다. 배치 크기가 커지면 학습률도 선형적으로 키울 수 있습니다(Linear Scaling Rule).
import torch
from torch.optim import Adam, AdamW, SGD
from torch.optim.lr_scheduler import (
StepLR, CosineAnnealingLR, OneCycleLR,
LinearLR, CosineAnnealingWarmRestarts
)
model = MyModel()
# 1. 기본 옵티마이저 설정
optimizer = AdamW(model.parameters(), lr=1e-4, weight_decay=0.01)
# 2. Step Decay (30 epoch마다 0.1배)
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
# 3. Cosine Annealing (최소 lr까지 코사인 감소)
scheduler = CosineAnnealingLR(
optimizer,
T_max=100, # 총 epoch
eta_min=1e-6 # 최소 lr
)
# 4. Warmup + Cosine Decay (LLM 표준)
from transformers import get_cosine_schedule_with_warmup
total_steps = len(dataloader) * num_epochs
warmup_steps = int(total_steps * 0.03) # 3% warmup
scheduler = get_cosine_schedule_with_warmup(
optimizer,
num_warmup_steps=warmup_steps,
num_training_steps=total_steps
)
# 5. OneCycleLR (빠른 수렴)
scheduler = OneCycleLR(
optimizer,
max_lr=1e-3, # 피크 lr
total_steps=total_steps,
pct_start=0.3, # 30%까지 상승
anneal_strategy='cos'
)
# 6. Learning Rate Finder (최적 lr 찾기)
from torch_lr_finder import LRFinder
finder = LRFinder(model, optimizer, criterion)
finder.range_test(train_loader, end_lr=1, num_iter=100)
finder.plot() # 기울기가 가장 가파른 지점의 lr 선택
# 보통 loss가 감소하기 시작하는 lr의 1/10을 선택
# 학습 루프
for epoch in range(num_epochs):
for batch in dataloader:
loss = model(batch)
loss.backward()
optimizer.step()
scheduler.step() # 배치마다 호출 (OneCycleLR, Warmup)
optimizer.zero_grad()
# scheduler.step() # epoch마다 호출 (StepLR, CosineAnnealing)
"학습 초반에 loss가 튀는 현상이 있어서 warmup을 3%에서 5%로 늘렸더니 안정화됐습니다. 최종 성능은 동일하고, 학습 실패 확률이 줄었어요."
"LR Finder로 1e-3이 최적인 걸 확인하고, OneCycleLR로 3e-3까지 올렸다가 1e-5까지 내렸습니다. 고정 lr 대비 수렴이 30% 빨랐고, 최종 정확도도 0.5% 높았어요."
"배치 크기를 256에서 1024로 키웠으면 lr도 4배로 키워야 해요. Linear Scaling Rule이요. 근데 너무 큰 lr은 일반화 성능이 떨어져서, LARS나 LAMB 옵티마이저로 레이어별 lr을 조절하는 게 좋습니다."
사전학습 가중치가 파괴됩니다. Fine-tuning은 1e-5~5e-5, 사전학습의 1/10~1/100 수준으로 시작하세요.
초기 gradient가 불안정해 발산합니다. LLM/Transformer는 warmup 필수(1~5% steps).
LR Finder로 적정 범위 탐색 후, Warmup + Cosine Decay 조합. 배치 크기 변경 시 lr도 비례 조정하세요.