[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -2,62 +2,195 @@
|
||||
id: wiki-2026-0508-momentum-and-optimization
|
||||
title: Momentum and Optimization
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [DL-OPT-MOM-001]
|
||||
aliases: [Optimizers, SGD momentum, Adam, AdamW, Lion, Nesterov]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 1.0
|
||||
tags: [ai, Deep-Learning, Optimization, momentum, Gradient-Descent, adam]
|
||||
confidence_score: 0.95
|
||||
verification_status: applied
|
||||
tags: [optimization, deep-learning, adam, lion, sgd, training]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-26
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack: { language: python, framework: pytorch }
|
||||
---
|
||||
|
||||
# Momentum and Optimization (모멘텀과 최적화)
|
||||
# Momentum and Optimization
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> "기울기의 관성(Velocity)을 이용하여 평탄한 길은 빠르게 주파하고, 웅덩이(Local Minima)는 과감하게 뛰어넘어라" — 경사 하강법에 물리적인 '운동량' 개념을 도입하여, 이전 업데이트의 방향과 속도를 현재 학습에 반영함으로써 수렴 속도를 높이고 최적화의 안정성을 확보하는 기법.
|
||||
## 매 한 줄
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
- **추출된 패턴:** "Accumulated Velocity and Smoothing" — 매 순간의 기울기 변화에 일일이 반응하여 진동하는 대신, 과거의 이동 궤적을 누적하여 진행 방향의 일관성을 유지함으로써 지그재그 현상을 억제하고 전역 최적해를 향해 전진하는 최적화 패턴.
|
||||
- **주요 기법:**
|
||||
- **Standard Momentum:** 과거 기울기의 가중 평균을 사용하여 현재 방향 결정.
|
||||
- **Nesterov Accelerated Gradient (NAG):** 다음 단계의 예상 지점에서 기울기를 계산하여 '미리 보고' 조절하는 더 영리한 방식.
|
||||
- **Adam (Adaptive Moment Estimation):** 모멘텀과 RMSProp(적응형 학습률)을 결합하여 현재 가장 널리 쓰이는 표준 최적화 알고리즘.
|
||||
- **의의:** 딥러닝 모델의 복잡한 손실 함수 곡면에서 안장점(Saddle Point)이나 지역 최적해에 갇히는 문제를 물리적 원리로 해결함.
|
||||
**Momentum**은 gradient에 관성(velocity)을 부여해 SGD의 수렴 속도와 안정성을 개선하는 1차 최적화의 핵심 트릭이며, 이를 진화시킨 Adam/AdamW/Lion이 2026년 LLM·비전 학습 표준이다.
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 모멘텀이 항상 빠르다는 믿음에서 벗어나, 과도한 관성이 오히려 최적점을 지나쳐 버리는(Overshooting) 문제를 해결하기 위한 '감쇠(Damping)'와 '적응형 조절'의 중요성이 현대 최적화 이론의 핵심이 됨.
|
||||
- **정책 변화:** Antigravity 프로젝트는 거대 언어 모델의 가중치 업데이트 시, 안정적인 수렴과 일반화 성능을 극대화하기 위해 AdamW(가중치 감쇠가 포함된 Adam)와 적절한 모멘텀 계수(0.9)를 기본값으로 사용함.
|
||||
## 매 핵심
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- Gradient-Descent-Foundations, HyperParameter-Optimization, [[Global-vs-Local-Optima|Global-vs-Local-Optima]], Deep-Learning-Foundations
|
||||
- **Raw Source:** 10_Wiki/Topics/AI/Momentum-and-Optimization.md
|
||||
### 1. Vanilla SGD vs Momentum
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
```
|
||||
SGD: θ ← θ - η · ∇L(θ)
|
||||
Momentum: v ← μ · v + ∇L(θ); θ ← θ - η · v (μ ≈ 0.9)
|
||||
```
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
- 관성 계수 μ ≈ 0.9 — 직전 gradient의 90% 누적.
|
||||
- ravine(좁은 골짜기)에서 SGD는 진동, momentum은 직진.
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
### 2. Nesterov Accelerated Gradient (NAG)
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
```
|
||||
v ← μ · v + ∇L(θ - η · μ · v) ← look-ahead gradient
|
||||
θ ← θ - η · v
|
||||
```
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
- 이론적 convergence O(1/k²) (Nesterov 1983), volatile loss에서 momentum보다 안정.
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
### 3. Adaptive: Adam (Kingma 2014)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
- 1차 모멘트 m, 2차 모멘트 v 모두 EMA.
|
||||
- bias correction 후 `θ ← θ - η · m̂ / (√v̂ + ε)`.
|
||||
- 기본 hyperparam: lr=1e-3, β₁=0.9, β₂=0.999, ε=1e-8.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
### 4. AdamW (Loshchilov 2017) — 표준
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
- 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
|
||||
|
||||
- 부모: [[Optimization Theory]], [[Gradient Descent]]
|
||||
- 변형: [[Adam Optimizer]], [[Lion Optimizer]], [[Sophia]], [[Shampoo]]
|
||||
- 응용: [[LLM Pretraining]], [[Diffusion Training]], [[Fine-tuning Strategies]]
|
||||
- Adjacent: [[Learning Rate Scheduling]], [[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.
|
||||
|
||||
Reference in New Issue
Block a user