C.W.K.
Stream
Lesson 07 of 09 · published

Optimizer: SGD 부터 AdamW 까지

~22 min · optimizer, adamw, momentum

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

Optimizer 는 gradient 사용 recipe

SGD 는 w := w - lr * grad. Modern optimizer 가 momentum (과거 gradient 의 running average), parameter 당 scaling (과거 squared gradient 의 running average), weight decay 추가. 차이가 어떤 optimizer 가 더 빨리 train 하고, 더 잘 generalize 하고, transformer vs CNN 에 올바른 default 인지 만들어.

  • SGD with momentum — classic baseline. ImageNet-style data 에 from scratch CNN 에 자주 best. lr, momentum (0.9), weight decay 신중히 tune.
  • Adam — gradient 의 running mean/variance 통한 adaptive parameter 당 learning rate. 빠르게 train, vision 에서 가끔 SGD 보다 generalize 못함.
  • AdamW — decoupled weight decay (adaptive optimizer 에서 weight decay 의 올바른 방법) 의 Adam. Transformer 와 modern training 의 default.
  • Lion — sign-based optimizer, Adam 보다 memory 적게, 일부 workload 에서 비슷한 accuracy.
  • Adafactor — memory-efficient (parameter 당 variance state 없음), 매우 큰 scale (T5 등) 에 사용.
팁: 2026 년에 지루한 선택은 transformer 에 lr=3e-4 (또는 batch size 에 scaled), weight_decay=0.01, betas=(0.9, 0.95) 의 AdamW. 거기서 시작해서 이유 있을 때만 deviate.

왜 decoupled weight decay 가 중요한가

'Weight decay' 는 원래 loss 에 추가된 L2 regularizer: L + 0.5 * λ * ||w||². SGD 에서 이건 stepping 전 gradient 에서 λw 빼는 것과 mathematically identical. Adam 에서는 안 그래 — adaptive learning rate 가 L2 term 을 덜 효과적으로 만드는 방식으로 scale. AdamW 가 decouple 함: adaptive scaling 과 별도 step 동안 직접 λw 빼. 이 작은 fix 가 대부분 task 에서 측정 가능한 차이 만듦.

원칙: 2018 년 전 코드에서 Adam 이 weight decay 와 함께 쓰인 거 보면, original paper 가 L2 regularization (Adam 과 깨짐) 을 썼지 decoupled weight decay (올바른 AdamW form) 안 썼을 거라고 의심해.

Code

AdamW with sane defaults for a transformer·python
import torch
from torch import optim

optimizer = optim.AdamW(
    model.parameters(),
    lr=3e-4,
    betas=(0.9, 0.95),
    weight_decay=0.01,
)

def split_params(model):
    decay, no_decay = [], []
    for name, p in model.named_parameters():
        if not p.requires_grad: continue
        if p.ndim == 1 or name.endswith(".bias"):
            no_decay.append(p)
        else:
            decay.append(p)
    return [
        {"params": decay,    "weight_decay": 0.01},
        {"params": no_decay, "weight_decay": 0.0},
    ]

optimizer = optim.AdamW(split_params(model), lr=3e-4, betas=(0.9, 0.95))

External links

Exercise

같은 model 을 SGD+momentum, Adam, AdamW 로 train. 같은 learning rate budget. Training 과 validation loss 그려. 어느 optimizer 가 training metric 이기고 어느 게 validation metric 이기는지 — 다를 수 있어.

Progress

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

댓글 0

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

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