
Warmup + Cosine Learning Rate
76번 순수 Cosine 은 t=0 에서 최대 lr 로 시작. 하지만 큰 모델은 초반 gradient 가 불안정해 바로 큰 lr 로 시작하면 발산. 해결: 처음 W 스텝은 선형 warmup.
2-phase 스케줄
\eta_{\max} \cdot \frac{t}{W} & t < W \quad \text{(warmup)} \\[4pt]
\eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos\pi \cdot \frac{t - W}{T - W}\right) & W \le t \le T \quad \text{(cosine)} \\[4pt]
\eta_{\min} & t > T
\end{cases}$$
- $t=0$: $0$.
- $t=W$: $\eta_{\max}$ (peak).
- $t=T$: $\eta_{\min}$.
## 왜 warmup?
- 초기 가중치가 랜덤 → 첫 배치의 loss landscape 가 잘 안 보임. 큰 lr 로 시작하면 엉뚱한 방향으로 튕겨 발산.
- Adaptive optimizer (Adam) 의 $\hat v$ 추정치도 초기엔 신뢰도 낮음.
- Warmup: 안전하게 lr 를 서서히 올려 optimizer state 안정화.
BERT 논문 이래 **거의 모든** LLM fine-tuning / pre-training 이 이 패턴 사용. Warmup 은 보통 전체의 1–10%.
## 과제
함수 `warmup_cosine_lr(t, warmup_steps, total_steps, lr_max, lr_min=0.0)` 를 완성하세요.
- 입력: 스칼라 또는 array `t`.
- 반환: 같은 shape. `t > total_steps` → `lr_min` clamp.
- `warmup_steps <= 0` 일 때도 안전하게 동작 (순수 cosine).
## 테스트 케이스
| # | 이름 | 검증 |
|---|---|---|
| 1 | t=0 → 0 (lr_min=0) | warmup 시작 |
| 2 | t=W → lr_max | warmup 끝 |
| 3 | t=T → lr_min | 전체 끝 |
| 4 | t=(W+T)/2 → 중점 값 | cosine 중간 |
| 5 | warmup=0 → 순수 cosine | |
| 6 | t > T clamp | |