주제: 2-1 Optimizer 비교 (SGD, Momentum, AdamW)

분류: foundations

타입: concept

난이도: 중급

선수지식: 있음 - gradient descent, learning rate, gradient

문제 설정

신경망의 기본 업데이트는 w <- w - eta * grad(L) 이지만, 실제 학습에서는 optimizer를 통해 속도/안정성을 개선합니다.

대표 optimizer는 SGD, Momentum, AdamW입니다.

초심자 관점에서는 optimizer를 "경사하강법의 세부 옵션"으로 보기 쉽지만, 실제로는 학습이 되느냐, 얼마나 빨리 수렴하느냐, 과하게 흔들리느냐를 크게 좌우하는 핵심 설계 요소입니다. 같은 모델과 같은 데이터라도 optimizer 선택에 따라 전혀 다른 학습 곡선이 나올 수 있습니다.

직관 비유

여기서 learning rate와 momentum은 자주 같이 나오지만 역할은 다릅니다. learning rate는 얼마나 크게 움직일지 정하고, momentum은 이전 방향을 얼마나 계속 믿을지 정합니다.

1. SGD

wt+1=wteta*gt

SGD의 장점은 해석이 가장 단순하다는 점입니다. 현재 gradient가 가리키는 방향으로 한 걸음 이동한다는 구조라서, learning rate가 너무 크면 왜 흔들리고 너무 작으면 왜 느린지 직관적으로 이해하기 쉽습니다.

수식에서 w_t는 현재 step의 파라미터, g_t는 그 시점 gradient, η는 보폭입니다. 즉 "현재 위치에서 지금 보이는 기울기만 보고 바로 이동한다"는 뜻입니다.

즉 learning rate는 optimizer를 고르는 값이 아니라, 어떤 optimizer를 쓰더라도 거의 항상 중요한 공통 하이퍼파라미터입니다. 너무 크면 valley를 건너뛰고, 너무 작으면 내려가긴 하지만 시간이 매우 오래 걸립니다.

2. Momentum

vt=beta*vt1+gt
wt+1=wteta*vt

주의: beta가 너무 크면 overshoot가 생길 수 있습니다.

직관적으로는 작은 공이 울퉁불퉁한 지형을 내려가는 상황과 비슷합니다. SGD가 매 순간 기울기만 보고 방향을 바꾸는 방식이라면, Momentum은 이전 속도를 조금 기억해서 자주 바뀌는 잡음 방향에는 덜 흔들리고, 일관된 방향에는 더 빠르게 나아갑니다.

첫 번째 식의 v_t는 일종의 "속도 메모리"입니다. 현재 gradient만 보는 것이 아니라 직전까지 누적된 방향을 섞어 쓰기 때문에, 골짜기 양옆으로 흔들리는 현상을 줄이고 더 매끄럽게 내려갈 수 있습니다.

여기서 β는 momentum의 강도를 정합니다. 값이 크면 과거 방향을 오래 기억하고, 값이 작으면 현재 gradient 비중이 더 커집니다. 그래서 learning rate가 보폭이라면, momentum은 관성의 크기라고 보면 됩니다.

3. AdamW

Adam의 1차/2차 모멘트 추정:

mt=beta1*mt1+(1beta1)*gt
vt=beta2*vt1+(1beta2)*gt2

업데이트:

w <- w - eta * m_t / (sqrt(v_t) + epsilon) - eta * lambda * w

AdamW가 널리 쓰이는 이유는 파라미터마다 업데이트 스케일을 자동으로 조정해 주기 때문입니다. 어떤 파라미터는 gradient가 자주 크고, 어떤 파라미터는 매우 작을 수 있는데, AdamW는 이런 차이를 어느 정도 보정해 학습을 안정적으로 진행하게 돕습니다.

특히 LLM이나 Transformer 계열에서는 파라미터 수가 크고 학습 스케일도 크기 때문에, AdamW처럼 adaptive한 optimizer가 실무 기본값으로 자리잡았습니다. 다만 "항상 AdamW가 최고"라기보다, 계산 비용과 일반화 특성까지 포함한 trade-off로 이해하는 편이 맞습니다.

여기서 m_t는 gradient의 이동평균이라 Momentum과 비슷한 방향 기억 역할을 하고, v_t는 gradient 제곱의 이동평균이라 파라미터별 스케일 정보를 담습니다. 그래서 AdamW는 "방향 기억 + 스케일 보정"을 동시에 하는 optimizer라고 이해하면 됩니다.

SGD Momentum AdamW SGD는 더 흔들리고, Momentum은 방향을 누적하고, AdamW는 스케일까지 보정한다.
세 optimizer는 모두 loss를 줄이는 방향으로 가지만, 경로를 만드는 방식이 다르다. SGD는 현재 gradient만 보고, Momentum은 이전 방향을 기억하며, AdamW는 파라미터별 gradient 크기까지 반영해 보폭을 조절한다.

4. Optimizer 비교

Optimizer특징사용 상황
SGD현재 gradient만 사용전통 CNN
Momentumgradient 방향 누적빠른 수렴 필요 시
AdamWadaptive step + decoupled weight decayTransformer/LLM

5. 업데이트 직관 비교

SGD: 현재 gradient만 사용
Momentum: 이전 gradient 방향을 유지
AdamW: gradient 평균/분산으로 adaptive step + weight decay 분리

즉 세 방법을 한 줄로 정리하면 이렇습니다. SGD는 "지금 기울기만 본다", Momentum은 "이전 방향도 기억한다", AdamW는 "방향도 기억하고 파라미터별로 얼마나 크게 움직일지도 조절한다"입니다.

이 관점이 잡히면 수식이 길어 보여도 결국 같은 패턴이라는 점이 보입니다. 모두 현재 파라미터 + gradient 정보 + 보정 규칙으로 다음 파라미터를 만드는 구조입니다.

정리하면 learning rate는 "얼마나 크게 움직일까", momentum은 "이전 방향을 얼마나 유지할까"에 대한 답입니다. 둘 다 학습 속도와 안정성에 직접 영향을 주지만, 조절하는 축은 서로 다릅니다.

코드-수식 연결

수식/방법PyTorch 코드설명
SGDtorch.optim.SGD(...)기본 optimizer
Momentumtorch.optim.SGD(..., momentum=0.9)momentum SGD
AdamWtorch.optim.AdamW(...)LLM 표준 optimizer

자주 하는 오해 5개

체크리스트 (스스로 설명 가능해야 하는 질문)