본문 바로가기
데이터 과학 수학

torch.optim.Adam 한 줄 뒤에 숨겨진 수학, 모멘텀·RMSProp·Adam 최적화 알고리즘의 원리

by dexien 2026. 5. 1.

PyTorch로 모델을 만들 때 optimizer를 설정하는 코드를 씁니다. torch.optim.Adam(model.parameters(), lr=0.001). 이 한 줄을 쓰면서 Adam이 정확히 어떻게 작동하는지 몰랐습니다. 그냥 "Adam이 좋다더라"는 말만 듣고 썼습니다. 그런데 학습이 잘 안 될 때 왜 안 되는지, 학습률을 얼마로 설정해야 하는지 판단하려면 optimizer 내부를 알아야 합니다.

경사하강법은 손실을 줄이는 방향으로 가중치를 업데이트하는 원리입니다. 그런데 기본 경사하강법에는 문제가 있습니다. 학습률이 고정되어 있고, 모든 가중치에 같은 학습률이 적용됩니다. 모멘텀, RMSProp, Adam은 이 문제를 단계적으로 해결한 알고리즘입니다. 오늘은 각 알고리즘이 어떤 문제를 어떻게 해결하는지 실제 숫자와 함께 따라가 보겠습니다.

모멘텀 RMSProp Adam 최적화 알고리즘의 원리
torch.optim.Adam 한 줄 뒤에 숨겨진 수학, 모멘텀·RMSProp·Adam 최적화 알고리즘의 원리

기본 경사하강법의 문제점

기본 경사하강법(SGD)은 단순합니다. 기울기의 반대 방향으로 학습률만큼 이동합니다. 그런데 실제 학습에서 세 가지 문제가 발생합니다.

기본 SGD 수식:
w = w - α × ∂L/∂w

α: 학습률 (고정값)
∂L/∂w: 손실에 대한 기울기

문제 1. 안장점(Saddle Point) 문제:
기울기가 0에 가까운 안장점에서 학습 멈춤
→ 극소값이 아닌데 학습이 정체됨

문제 2. 진동(Oscillation) 문제:
좁고 깊은 골짜기에서 좌우로 진동
한 방향은 기울기가 크고 다른 방향은 작을 때
→ 학습률을 크게 하면 발산, 작게 하면 느림

문제 3. 고정 학습률 문제:
자주 등장하는 특성: 기울기가 크게 축적됨
드물게 등장하는 특성: 기울기가 작음
같은 학습률 적용 → 드문 특성 학습 어려움

→ 세 문제를 각각 해결한 게 모멘텀, RMSProp, Adam

모멘텀 — 관성으로 안장점 탈출하기

모멘텀(Momentum)은 물리학의 관성 개념을 경사하강법에 적용합니다. 이전에 이동하던 방향을 기억해서 관성을 유지합니다. 공이 경사면을 굴러 내려갈 때 이전 속도가 유지되는 것과 같습니다.

모멘텀 수식:
v_t = β × v_{t-1} + (1-β) × ∂L/∂w
w = w - α × v_t

v_t: 현재 속도 (이동 방향과 크기)
β: 모멘텀 계수 (보통 0.9)
v_{t-1}: 이전 속도

β=0.9의 의미:
현재 기울기: 10% 반영
이전 속도: 90% 유지

안장점 탈출 원리:
기울기 = 0인 안장점에서
v_t = 0.9 × v_{t-1} + 0 = 0.9 × v_{t-1}
→ 이전 속도의 90%가 유지됨
→ 관성으로 안장점을 통과

진동 감소 원리:
좌우로 반복되는 기울기는 서로 상쇄됨
일관된 방향의 기울기는 누적됨
→ 좁은 골짜기에서 진동이 줄고 빠르게 수렴

모멘텀이 강화학습에서 다룬 감가율 γ와 구조가 같습니다. 과거 정보를 얼마나 유지할지 조절하는 계수가 β와 γ로 같은 역할을 합니다. 수학적으로 v_t는 과거 기울기들의 지수 가중 이동 평균(Exponential Moving Average)입니다.


RMSProp — 가중치마다 다른 학습률 적용하기

RMSProp(Root Mean Square Propagation)은 가중치마다 학습률을 다르게 적용합니다. 기울기가 큰 가중치는 학습률을 줄이고, 기울기가 작은 가중치는 학습률을 늘립니다.

RMSProp 수식:
s_t = β × s_{t-1} + (1-β) × (∂L/∂w)²
w = w - (α / √(s_t + ε)) × ∂L/∂w

s_t: 기울기 제곱의 지수 이동 평균
ε: 분모가 0이 되는 것 방지 (보통 1e-8)

작동 원리:
기울기가 계속 큰 가중치:
s_t가 커짐 → α/√s_t 작아짐 → 학습률 감소

기울기가 계속 작은 가중치:
s_t가 작음 → α/√s_t 커짐 → 학습률 증가

예시:
가중치 A: 기울기 항상 10 → s_t ≈ 100
유효 학습률 = 0.01/√100 = 0.001

가중치 B: 기울기 항상 0.1 → s_t ≈ 0.01
유효 학습률 = 0.01/√0.01 = 0.1

→ 기울기 작은 B가 10배 빠르게 학습

임베딩에서 드물게 등장하는 단어의 가중치는 기울기가 작습니다. RMSProp은 이런 가중치에 자동으로 더 큰 학습률을 적용해서 드문 특성도 효과적으로 학습합니다. 자연어 처리와 추천 시스템에서 RMSProp이 효과적인 이유입니다.


Adam — 모멘텀과 RMSProp의 결합

Adam(Adaptive Moment Estimation)은 모멘텀과 RMSProp을 결합한 알고리즘입니다. 기울기의 1차 모멘트(평균)와 2차 모멘트(분산)를 동시에 추적합니다.

Adam 수식:

① 1차 모멘트 (모멘텀):
m_t = β₁ × m_{t-1} + (1-β₁) × ∂L/∂w

② 2차 모멘트 (RMSProp):
v_t = β₂ × v_{t-1} + (1-β₂) × (∂L/∂w)²

③ 편향 보정 (Bias Correction):
m̂_t = m_t / (1 - β₁^t)
v̂_t = v_t / (1 - β₂^t)

④ 가중치 업데이트:
w = w - α × m̂_t / (√v̂_t + ε)

기본값:
β₁ = 0.9 (1차 모멘트 감쇠율)
β₂ = 0.999 (2차 모멘트 감쇠율)
α = 0.001 (학습률)
ε = 1e-8 (수치 안정성)

편향 보정이 필요한 이유:
초기에 m_t, v_t가 0으로 초기화됨
초반 스텝에서 값이 0에 치우침 (편향)
→ (1-β^t)로 나누어 보정

Adam이 대부분의 상황에서 좋은 이유는 두 가지 장점을 동시에 가져오기 때문입니다. 모멘텀으로 안장점을 탈출하고, RMSProp으로 가중치마다 적응적 학습률을 적용합니다. 대부분의 딥러닝 논문이 Adam을 기본 optimizer로 씁니다.


실제 숫자로 Adam 계산해 보기

가중치 w=0.5, 기울기가 매 스텝 0.3으로 일정한 경우로 Adam 3 스텝을 직접 계산해 보겠습니다.

초기값: w=0.5, m=0, v=0
β₁=0.9, β₂=0.999, α=0.001, ε=1e-8
기울기 g=0.3 (매 스텝 동일)

[스텝 1 (t=1)]:
m₁ = 0.9×0 + 0.1×0.3 = 0.030
v₁ = 0.999×0 + 0.001×0.09 = 0.000090
m̂₁ = 0.030/(1-0.9¹) = 0.030/0.1 = 0.300
v̂₁ = 0.000090/(1-0.999¹) = 0.000090/0.001 = 0.090
w = 0.5 - 0.001×0.300/√0.090 = 0.5 - 0.001 = 0.499

[스텝 2 (t=2)]:
m₂ = 0.9×0.030 + 0.1×0.3 = 0.027+0.030 = 0.057
v₂ = 0.999×0.000090 + 0.001×0.09 = 0.000180
m̂₂ = 0.057/(1-0.81) = 0.057/0.19 = 0.300
v̂₂ = 0.000180/(1-0.998) = 0.090
w = 0.499 - 0.001×0.300/√0.090 ≈ 0.498

[스텝 3 (t=3)]:
편향 보정 후 m̂₃ ≈ 0.300, v̂₃ ≈ 0.090
w ≈ 0.497

→ 매 스텝 약 0.001씩 안정적으로 감소
→ 기울기가 일정해도 편향 보정으로 초반부터 정확한 업데이트

편향 보정의 효과가 스텝 1에서 확연히 보입니다. m₁=0.030이지만 보정 후 m̂₁=0.300으로 실제 기울기 0.3에 가깝게 복원됩니다. 보정이 없으면 초반에 업데이트가 너무 작아서 학습이 느립니다.


학습률 스케줄링 — 학습률을 동적으로 조정하기

Adam 같은 적응적 optimizer를 써도 학습률 자체를 동적으로 조정하면 더 좋은 결과를 얻을 수 있습니다. 학습 초반에는 큰 학습률로 빠르게 이동하고, 후반에는 작은 학습률로 세밀하게 조정합니다.

대표적인 학습률 스케줄:

1. Step Decay:
매 N 에폭마다 학습률을 γ배 감소
α_t = α_0 × γ^(t/N)
예: 10에폭마다 0.1배 → 0.001 → 0.0001 → 0.00001

2. Cosine Annealing:
코사인 함수로 학습률을 부드럽게 감소
α_t = α_min + 0.5(α_max-α_min)(1+cos(πt/T))
→ 주기적으로 학습률이 올라갔다 내려감
→ 지역 최솟값 탈출에 유리

3. Warm-up + Decay:
초반 N 스텝: 학습률을 0에서 α_max로 선형 증가
이후: 점진적으로 감소
→ 트랜스포머 학습의 표준 방식
→ 초반 불안정한 그레디언트 처리

PyTorch 코드:
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
    optimizer, T_max=100, eta_min=1e-6
)

Warm-up이 트랜스포머 학습에서 중요한 이유가 있습니다. 학습 초반에는 가중치가 무작위 초기화 상태라 기울기가 불안정합니다. 이때 학습률이 크면 학습이 발산할 수 있습니다. 작은 학습률로 시작해서 점점 키우는 Warm-up으로 초반 불안정성을 처리합니다.


optimizer 선택 가이드

어떤 optimizer를 언제 써야 하는지 실무 기준으로 정리합니다.

Optimizer 특징 적합한 상황
SGD 단순, 예측 가능 이미지 분류, 잘 튜닝된 학습률 있을 때
SGD + 모멘텀 안정적 수렴 ResNet, VGG 같은 CNN 학습
RMSProp 적응적 학습률 RNN, 순환 신경망 학습
Adam 범용적, 빠른 수렴 대부분의 딥러닝 모델 기본값
AdamW Adam + 가중치 감쇠 트랜스포머, LLM 학습 표준

AdamW는 Adam에서 L2 규제를 올바르게 구현한 버전입니다. 일반 Adam은 적응적 학습률과 L2 규제가 상호작용해서 규제 효과가 약해지는 문제가 있습니다. AdamW는 가중치 감쇠를 적응적 학습률과 분리해서 적용합니다. GPT, BERT 같은 대형 언어 모델 학습의 표준 optimizer가 AdamW인 이유입니다.

이 연재에서 다룬 경사하강법, 역전파, 편미분, L2 규제가 모두 optimizer 안에 들어있습니다. torch.optim.Adam 한 줄 뒤에서 1차 모멘트, 2차 모멘트, 편향 보정, 적응적 학습률이 동시에 계산됩니다. optimizer를 이해하면 학습이 잘 안 될 때 어디서 문제가 생기는지 진단할 수 있습니다.


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 블로그 이름