인지야공/딥러닝 기초 정리/12번째 글
최적화 — Adam·워밍업·스케줄이 하는 일
실행:
python NN_12_optimization.py(검증 환경: torch 2.8.0+cu129, RTX 5080) 이 글의 수치는 전부 그 스크립트를 돌려 얻은 것이다. 정규화와 잔차 편이 깊어도 그라디언트가 살아남게 했다면, 이 글은 그 그라디언트로 어떻게 내려갈지를 잰다.
정규화와 잔차 편에서 잔차와 정규화로 그라디언트를 살렸다. 이제 그 그라디언트를 받아 파라미터를 실제로 업데이트하는 것이 최적화다. “손실의 기울기 반대로 한 걸음”이 전부일 것 같지만, 그 한 걸음의 크기와 방향을 정하는 데 세 가지 장치가 필요하다 — Adam, 워밍업, 학습률 스케줄. 각각이 무엇을 고치는지 잰다.
1. SGD의 문제 — 방향마다 곡률이 다르다
가장 단순한 최적화는 경사 하강(SGD) 이다.
| 기호 | 뜻 |
|---|---|
| 파라미터 | |
| 그라디언트 (손실이 가장 가파르게 오르는 방향) | |
| 학습률 (한 걸음 크기) |
문제는 모든 방향에 같은 를 쓴다는 것이다. 손실 표면이 방향마다 곡률이 다르면(어떤 방향은 가파른 협곡, 어떤 방향은 완만한 평지) 곤란해진다. 가파른 방향에서 튕기지 않으려면 를 작게 써야 하는데, 그러면 완만한 방향은 한없이 느리게 내려간다.
이 정도를 재는 값이 조건수 다(곡률의 최대/최소 비). SGD 가 안정하려면 여야 하고, 그러면 가장 완만한 방향은 걸음마다 대략 배씩만 줄어 — 가 크면 그만큼 느리다.
직접 재 보기 A
조건수 인 이차 그릇(곡률 1~1000)에서 세 방법을 400스텝 돌렸다.

| 방법 | 400스텝 후 손실 |
|---|---|
| SGD | 2.13 (완만한 방향에 발이 묶임) |
| Momentum | 3.9e-9 |
| Adam | 3.7e-15 |
SGD 는 2.13 에서 거의 멈췄다. Adam 은 SGD 보다 배 낮은 손실에 도달했다. 무엇이 다른가.
2. Adam — 좌표마다 걸음을 다시 잰다
모멘텀(momentum) 은 과거 그라디언트를 관성처럼 쌓아 지그재그를 펴 준다(위 그림의 주황). Adam 은 여기에 한 가지를 더한다 — 좌표마다 그라디언트 크기로 나눠 걸음을 고르게 만든다.
| 기호 | 뜻 |
|---|---|
| 그라디언트의 지수이동평균 — 관성 낀 방향 | |
| 그라디언트 제곱의 이동평균 — 그 좌표가 얼마나 큰가 | |
| 초기 편향 보정 ( 가 0에서 시작하는 것 교정) | |
| 좌표별 크기. 이걸로 나누니 큰 좌표든 작은 좌표든 걸음이 비슷 |
핵심은 로 나누는 부분이다. 가파른 좌표는 가 커서 도 크니 나눠서 작은 걸음, 완만한 좌표는 가 작으니 큰 걸음. 결과적으로 모든 좌표가 비슷한 속도로 내려간다 — 1절의 조건수 에 발목 잡히지 않는다. 그래서 Adam 이 협곡·평지가 섞인 표면에서 SGD 를 압도한다.
실무에서는 AdamW 를 쓴다. 가중치 감쇠(작게 유지하는 힘)를 그라디언트에 섞지 않고 따로 빼 준다.
항이 파라미터를 0 쪽으로 살짝 당겨 과적합을 줄인다. 요즘 큰 모델의 기본 최적화기가 AdamW 다.
3. 워밍업 — 첫걸음은 살살
Adam 을 골랐어도, 시작부터 큰 학습률을 쓰면 초반에 튄다. 이유는 두 가지다 — ① 초기 그라디언트·2차 모멘트 추정이 아직 불안정하고, ② 정규화와 잔차 편에서 본 깊은 post-norm 은 잔차 지름길이 정규화에 눌려 큰 걸음에 특히 약하다. 그래서 학습률을 0에서 서서히 올린다 — 워밍업이다.
직접 재 보기 B
정규화와 잔차 편에서 워밍업이 필요하다고 한 쪽 — 깊이 32 post-norm 망을 큰 학습률()로 학습시켰다.

| 초반 최대 손실 | 최종 손실 | |
|---|---|---|
| 워밍업 없음 | 1.99 (초반 스파이크) | 0.0695 |
| 워밍업 있음 | 0.43 | 0.0694 |
워밍업 없이 큰 학습률로 출발하자 초반 손실이 1.99 로 튀었다(그림 왼쪽 빨강 봉우리). 학습률을 80스텝에 걸쳐 서서히 올리자 스파이크가 4.6배 낮은 0.43 으로 눌렸다. 최종 손실은 거의 같지만, 실제 큰 모델에서는 이 초반 스파이크가 그대로 발산으로 이어져 학습이 깨지기도 한다. 워밍업은 그 위험 구간을 건너는 다리다.
4. 스케줄 — 끝에서는 걸음을 줄인다
워밍업으로 올린 학습률을 끝까지 크게 두면, 최소점 근처에서 계속 튕겨 바닥에 안착하지 못한다. 특히 데이터에 잡음이 있으면 큰 걸음이 그 잡음 바닥 위에서 진동한다. 그래서 후반에는 학습률을 서서히 낮춘다. 가장 흔한 것이 코사인 감쇠다.
| 기호 | 뜻 |
|---|---|
| 전체 스텝 수 | |
| 워밍업 스텝 수 | |
| 항 | 1에서 0으로 매끄럽게 내려가는 곡선 |
직접 재 보기 C
라벨에 잡음(표준편차 0.25 → 손실 바닥 약 0.0625)을 넣고, 상수 학습률과 코사인 감쇠를 600스텝씩 비교했다.

| 스케줄 | 마지막 50스텝 평균 손실 |
|---|---|
| 상수 학습률 | 0.0691 |
| 코사인 감쇠 | 0.0655 |
잡음 바닥이 0.0625 인데, 상수는 그 위 0.0691 에서 계속 진동했고 코사인 감쇠는 0.0655 로 바닥에 더 가까이 내려앉았다(초과분 0.0066 → 0.0030, 절반). 5.2% 차이지만, 바닥까지 남은 여유로 보면 절반을 더 좁힌 것이다. 끝에서 걸음을 줄이는 것만으로 더 좋은 최소점에 안착한다.
5. 정리
| 장치 | 무엇을 고치나 | 핵심 |
|---|---|---|
| Adam | 방향마다 다른 곡률(조건수) | 좌표별 로 나눠 걸음을 고르게 |
| AdamW | 과적합 | 가중치 감쇠를 그라디언트와 분리 |
| 워밍업 | 초반 스파이크·발산 | 학습률을 0에서 서서히 올림 |
| 코사인 감쇠 | 최소점 근처 진동 | 끝에서 학습률을 낮춰 바닥에 안착 |
한 문단으로: SGD 는 모든 방향에 같은 학습률을 써서, 곡률이 방향마다 다르면(조건수 1000) 완만한 방향에 발이 묶인다(재 보니 손실 2.13 에서 멈춤). Adam 은 좌표마다 그라디언트 크기 로 나눠 걸음을 고르게 만들어 그 벽을 넘고(, SGD 의 배 아래), AdamW 는 여기에 가중치 감쇠를 분리해 얹는다. 큰 학습률로 곧장 출발하면 초반에 튀므로(깊은 post-norm 에서 손실 1.99 스파이크) 워밍업으로 살살 올리고(4.6배 완화), 끝에서는 코사인 감쇠로 걸음을 줄여 잡음 바닥에 더 가까이 안착한다(5.2% 개선). 정규화와 잔차 편이 그라디언트를 살렸다면, 이 세 장치가 그것을 실제 학습으로 바꾼다.