본문 바로가기
C.W.K.
Stream
Lesson 08 of 09 · published

학습률 스케줄

~22 min · lr, schedule, warmup

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

학습률은 가장 중요한 하이퍼파라미터

학습률이 너무 작으면 학습이 느려지고, 너무 크면 학습이 발산해. 적절한 값은 옵티마이저, 모델, 배치 크기, 데이터셋, 학습 단계에 따라 달라져. 어디에나 통하는 규칙은 없지만, 잘 작동하는 패턴은 있어.

요즘 학습에서 가장 널리 쓰이는 방식은 워밍업 + 코사인 감쇠야. 첫 수백~수천 단계 동안 학습률을 0에서 lr_max 까지 선형으로 올린 뒤, 남은 학습 동안 ~0까지 부드럽게 낮춰. 이 조합은 학습 초반의 불안정성과 후반의 수익 체감 문제를 모두 깔끔하게 다뤄.

팁: 워밍업 없이 Transformer를 학습하면 첫 백 단계에서 손실이 폭발하거나 학습이 멈추는 모습을 볼 수 있어. 일정 규모 이상의 어텐션 기반 모델에서는 워밍업이 사실상 필수야.

자주 쓰는 스케줄

  • 상수 — 짧은 학습이나 프로토타이핑에는 괜찮지만, 최종 선택으로 쓰는 경우는 드물어.
  • 단계 감쇠 — N 에폭마다 학습률에 0.1을 곱해. ResNet 계열 학습의 고전적인 방식이지만 요즘은 덜 쓰여.
  • 코사인 어닐링 — 코사인 곡선의 후반부처럼 학습률을 부드럽게 낮춰. 거의 어디서나 잘 작동해.
  • 워밍 리스타트를 포함한 코사인 스케줄 — 주기적으로 학습률을 다시 높여야 하는 매우 긴 학습에 유용해.
  • OneCycle — Smith가 제안한 방식이야. 학습률을 올렸다가 내리며, 최고점은 가운데에 둬. 짧은 미세 조정에 강해.

좋은 lr_max 찾기

'LR finder' 기법(Smith, 2017)을 쓰면 돼. 학습률을 1e-7에서 10까지 지수적으로 높이면서 수백 단계 학습해. 그런 다음 손실과 학습률의 관계를 그래프로 그려. 손실이 가장 빠르게 내려가는 학습률을 골라 2-4로 나누면 돼. 보통 아무 근거 없이 하이퍼파라미터를 탐색하는 것보다 결과가 좋아.

원칙: 먼저 학습 시간에 맞춰 스케줄을 고르고, LR finder로 lr_max를 정해. 그다음 둘은 그대로 둔 채 나머지를 조정해. 학습 도중 스케줄까지 바꾸면 무엇이 결과에 영향을 줬는지 알기 어려워져.

Code

워밍업과 코사인 스케줄·python
import torch, math
from torch.optim.lr_scheduler import LambdaLR

def warmup_cosine(optimizer, warmup_steps, total_steps, min_ratio=0.1):
    def fn(step):
        if step < warmup_steps:
            return step / max(1, warmup_steps)
        progress = (step - warmup_steps) / max(1, total_steps - warmup_steps)
        cosine = 0.5 * (1 + math.cos(math.pi * progress))
        return min_ratio + (1 - min_ratio) * cosine
    return LambdaLR(optimizer, fn)

opt = torch.optim.AdamW(model.parameters(), lr=3e-4)
sch = warmup_cosine(opt, warmup_steps=500, total_steps=20_000)

for step in range(20_000):
    opt.zero_grad()
    loss = compute_loss(model, batch())
    loss.backward(); opt.step(); sch.step()

External links

Exercise

본인 모델에 LR finder 패턴을 구현해. 손실 대 log(lr) 그래프를 그리고, 손실이 가장 가파르게 내려가는 학습률을 골라 2로 나눠. 그 값을 코사인 스케줄의 lr_max로 사용한 뒤, 이전에 선택한 학습률과 비교해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.