Files
2nd/10_Wiki/Topics/AI_and_ML/Momentum-and-Optimization.md
T
Antigravity Agent f8b21af4be Wiki cleanup: error-doc removal, dedup merge, link normalization
10_Wiki/Topics 대규모 정리:
- 오류 캡처/미완성 stub 문서 227개 제거
- 교차폴더 중복 43클러스터 병합 (63파일 → redirect)
- 링크명 정규화: 깨진 링크 수정·redirect 직결·개념 매핑 ~2,400건
- 카테고리 MOC 6개 신규 생성
- Graph 섹션 미해결 related-keyword 링크 10,058건 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 23:52:15 +09:00

195 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: wiki-2026-0508-momentum-and-optimization
title: Momentum and Optimization
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Optimizers, SGD momentum, Adam, AdamW, Lion, Nesterov]
duplicate_of: none
source_trust_level: A
confidence_score: 0.95
verification_status: applied
tags: [optimization, deep-learning, adam, lion, sgd, training]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack: { language: python, framework: pytorch }
---
# Momentum and Optimization
## 매 한 줄
**Momentum**은 gradient에 관성(velocity)을 부여해 SGD의 수렴 속도와 안정성을 개선하는 1차 최적화의 핵심 트릭이며, 이를 진화시킨 Adam/AdamW/Lion이 2026년 LLM·비전 학습 표준이다.
## 매 핵심
### 1. Vanilla SGD vs Momentum
```
SGD: θ ← θ - η · ∇L(θ)
Momentum: v ← μ · v + ∇L(θ); θ ← θ - η · v (μ ≈ 0.9)
```
- 관성 계수 μ ≈ 0.9 — 직전 gradient의 90% 누적.
- ravine(좁은 골짜기)에서 SGD는 진동, momentum은 직진.
### 2. Nesterov Accelerated Gradient (NAG)
```
v ← μ · v + ∇L(θ - η · μ · v) ← look-ahead gradient
θ ← θ - η · v
```
- 이론적 convergence O(1/k²) (Nesterov 1983), volatile loss에서 momentum보다 안정.
### 3. Adaptive: Adam (Kingma 2014)
- 1차 모멘트 m, 2차 모멘트 v 모두 EMA.
- bias correction 후 `θ ← θ - η · m̂ / (√v̂ + ε)`.
- 기본 hyperparam: lr=1e-3, β₁=0.9, β₂=0.999, ε=1e-8.
### 4. AdamW (Loshchilov 2017) — 표준
- weight decay를 gradient에서 분리 (decoupled).
- LLM/Transformer 학습에서 사실상 default. lr=1e-4~3e-4, wd=0.01~0.1.
### 5. Lion (Chen et al., Google 2023)
- sign-based update: `θ ← θ - η · sign(β₁·m + (1-β₁)·g)`.
- 메모리 50% 절감 (1차 모멘트만), AdamW 대비 lr 10× 작게(1e-4 → 1e-5).
- 대규모 비전(ViT-G) / LLM 미세조정에서 동등 또는 우수 성능.
### 6. 2026 best practices
- **LLM pretrain**: AdamW, β₂=0.95, cosine LR with warmup, gradient clipping 1.0.
- **LLM finetune**: AdamW lr=2e-5 또는 Lion lr=2e-6.
- **Vision (ViT)**: AdamW or Lion, weight decay 0.05.
- **Diffusion**: AdamW lr=1e-4, EMA on weights.
- **Sophia / Shampoo**: 2차 정보 활용, 일부 frontier lab에서 채택 — wall-clock 1.5-2× 개선 보고.
## 💻 패턴
```python
# 1. SGD with momentum (PyTorch)
import torch
opt = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, nesterov=True)
```
```python
# 2. AdamW — LLM finetune 표준
opt = torch.optim.AdamW(
model.parameters(),
lr=2e-5, betas=(0.9, 0.95), weight_decay=0.01, eps=1e-8,
)
```
```python
# 3. Lion (lion-pytorch 패키지)
from lion_pytorch import Lion
opt = Lion(model.parameters(), lr=1e-5, weight_decay=0.1) # AdamW lr / 10
```
```python
# 4. Cosine schedule with warmup
from torch.optim.lr_scheduler import LambdaLR
import math
def warmup_cosine(step, warmup, total):
if step < warmup:
return step / warmup
p = (step - warmup) / (total - warmup)
return 0.5 * (1 + math.cos(math.pi * p))
sched = LambdaLR(opt, lr_lambda=lambda s: warmup_cosine(s, 2000, 100_000))
```
```python
# 5. Gradient clipping
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
opt.step()
```
```python
# 6. Manual momentum (educational)
velocity = {p: torch.zeros_like(p) for p in model.parameters()}
mu, lr = 0.9, 0.01
for p in model.parameters():
velocity[p].mul_(mu).add_(p.grad)
p.data.add_(velocity[p], alpha=-lr)
```
```python
# 7. EMA on model weights (diffusion 표준)
class EMA:
def __init__(self, model, decay=0.999):
self.shadow = {n: p.clone().detach() for n, p in model.named_parameters()}
self.decay = decay
def update(self, model):
for n, p in model.named_parameters():
self.shadow[n].mul_(self.decay).add_(p.data, alpha=1-self.decay)
```
```python
# 8. Param-group: no weight decay on bias/LN
no_decay = ["bias", "LayerNorm.weight"]
groups = [
{"params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], "weight_decay": 0.01},
{"params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], "weight_decay": 0.0},
]
opt = torch.optim.AdamW(groups, lr=2e-5)
```
```python
# 9. fused / 8-bit optimizer (메모리 절감)
import bitsandbytes as bnb
opt = bnb.optim.AdamW8bit(model.parameters(), lr=2e-5) # 메모리 75% 절감
```
```python
# 10. Sophia (2차 근사, 일부 lab)
# from sophia import SophiaG
# opt = SophiaG(model.parameters(), lr=3e-4, betas=(0.965, 0.99), rho=0.04)
```
## 매 결정 기준
| 상황 | 추천 옵티마이저 | 비고 |
|------|----------------|------|
| LLM pretrain | AdamW (β₂=0.95) | 표준 |
| LLM finetune | AdamW or Lion | Lion: lr=AdamW/10, wd=AdamW×3 |
| ViT / 큰 비전 모델 | AdamW or Lion | Lion 메모리 우위 |
| Diffusion | AdamW + EMA | EMA 필수 |
| Sparse embedding | SparseAdam | RecSys |
| 메모리 부족 | AdamW8bit (bitsandbytes) | 75% 절감 |
| RL policy gradient | Adam (낮은 β₂=0.9) | 노이즈 환경 |
| 단순 CNN/from scratch | SGD+momentum 0.9 | 잘 일반화 |
## 🔗 Graph
- 부모: [[Gradient Descent]]
- Adjacent: [[Gradient Clipping]], [[Weight Decay]]
## 🤖 LLM 활용
- "AdamW와 Lion의 학습 곡선을 비교해서 어느 게 stable한지 분석" — wandb log dump.
- LLM에 hyperparameter sweep 결과 요약 요청.
- "이 loss curve가 발산 중인데 lr / clipping / momentum 중 무엇을 조정?" — diagnostic.
## ❌ 안티패턴
- **Adam에 weight decay를 L2로 추가**: Adam은 v로 나누므로 의도와 다른 효과 → AdamW 사용.
- **lr 그대로 Lion 채택**: Lion은 sign-based, AdamW lr / 10 ~ / 5.
- **β₂=0.999 LLM에**: long sequence + 큰 gradient → β₂=0.95 권장.
- **Warmup 없이 Adam 시작**: 초기 v 추정 불안정 → divergence.
- **EMA 없이 diffusion**: 샘플 품질 크게 저하.
## 🧪 검증 / 중복
- 검증: PyTorch docs, Adam(2014), AdamW(2017), Lion(2023) 원논문.
- 중복: [[Adam Optimizer]] (specific) — 본 문서는 비교/선택 가이드.
## 🕓 Changelog
- 2026-05-10: 신규 작성. SGD momentum → Nesterov → Adam → AdamW → Lion + 2026 best practice.