Skip to Content
독학사독학사 3단계딥러닝07. 최적화 알고리즘: SGD, Momentum, RMSprop, Adam

이번 문서의 목표: 이 파일을 다 읽으면 경사하강법의 기본 아이디어를 설명하고, SGD·Momentum·RMSprop·Adam 네 최적화 알고리즘의 갱신 수식을 같은 손실 함수에 대해 2스텝씩 직접 계산해 그 차이를 비교하며, 학습률·모멘텀 같은 하이퍼파라미터가 학습에 미치는 영향을 설명할 수 있다.

왜 SGD만으로는 부족한가

07편에서 가중치를 한 번 갱신하는 데 썼던 규칙 wwηLww \leftarrow w - \eta \frac{\partial L}{\partial w}경사하강법(gradient descent)의 가장 기본 형태다. 그런데 실제 학습에서는 이 단순한 규칙만으로는 학습이 느리거나, 골짜기 모양의 손실 함수 표면에서 좌우로 진동하며 시간을 낭비하는 경우가 많다. 이 편에서는 기본 경사하강법을 확장한 세 가지 대표 알고리즘 — 이전 방향을 기억하는 모멘텀(Momentum), 가중치마다 학습률을 자동 조절하는 RMSprop, 이 둘을 결합한 Adam — 의 갱신 수식을 같은 간단한 손실 함수에 대해 2스텝씩 직접 계산해 실제로 얼마나 다르게 움직이는지 비교한다.

공통 설정: 하나의 손실 함수로 네 알고리즘 비교하기

쉽게 말하면: 네 알고리즘이 얼마나 다르게 움직이는지 보려면, 같은 출발점과 같은 목표를 주고 각자 어떻게 다가가는지 나란히 계산해 보면 된다.

비교를 위해 파라미터 ww 하나만 있는 아주 단순한 손실 함수를 쓴다.

L(w)=(w3)2L(w) = (w-3)^2

이 함수는 w=3w=3일 때 최솟값 L=0L=0을 가지므로, 모든 최적화 알고리즘의 목표는 ww33에 가깝게 이동시키는 것이다. 이 함수의 기울기(도함수)는 다음과 같다.

dLdw=2(w3)\frac{dL}{dw} = 2(w-3)

모든 알고리즘의 출발점을 w0=0w_0=0, 학습률 η=0.1\eta=0.1로 통일한다. 먼저 첫 번째 기울기를 구해 둔다.

g0=2(w03)=2(03)=6g_0 = 2(w_0-3) = 2(0-3) = -6
  • gtg_t: tt번째 스텝에서 계산한 기울기(gradient). 아래 첨자 tt는 학습이 진행된 횟수(스텝)를 가리킨다.

SGD(확률적 경사하강법): 기울기만 보고 바로 이동

쉽게 말하면: 지금 이 순간의 기울기만 보고, 그 반대 방향으로 정해진 보폭만큼 한 걸음 내딛는 가장 단순한 방법이다.

SGD(Stochastic Gradient Descent, 확률적 경사하강법)는 전체 데이터가 아니라 미니배치(mini-batch, 데이터를 작게 나눈 묶음. 10편에서 자세히 다룬다) 단위로 기울기를 계산해 매번 갱신하는 경사하강법을 가리키며, 갱신 수식 자체는 07편의 기본 경사하강법과 같다.

wt+1=wtηgtw_{t+1} = w_t - \eta \, g_t

1스텝:

w1=w0ηg0=00.1(6)=0.6w_1 = w_0 - \eta g_0 = 0 - 0.1(-6) = 0.6

2스텝: 새로운 w1=0.6w_1=0.6에서 기울기를 다시 계산한다.

g1=2(w13)=2(0.63)=4.8g_1 = 2(w_1-3) = 2(0.6-3) = -4.8 w2=w1ηg1=0.60.1(4.8)=0.6+0.48=1.08w_2 = w_1 - \eta g_1 = 0.6 - 0.1(-4.8) = 0.6+0.48 = 1.08

두 스텝 만에 ww00.61.080 \to 0.6 \to 1.08로 목표 33을 향해 꾸준히 다가갔지만, 아직 절반도 못 왔다.

Momentum: 이전 이동 방향을 기억해 가속하기

쉽게 말하면: 언덕에서 공을 굴리면 이전에 굴러가던 속도가 남아 있어 같은 방향이면 더 빨리 가속되는 것처럼, 이전 갱신 방향을 어느 정도 기억해 다음 갱신에 더해준다.

모멘텀(Momentum)은 현재 기울기만 보지 않고, 이전 스텝까지 누적된 속도(velocity) vv를 함께 사용한다.

vt=βvt1+gtv_t = \beta v_{t-1} + g_t wt+1=wtηvtw_{t+1} = w_t - \eta v_t
  • β\beta (베타): 이전 속도를 얼마나 반영할지 정하는 하이퍼파라미터(보통 0.90.9). β\beta가 클수록 과거 방향을 더 오래 기억한다.
  • vtv_t: tt번째 스텝의 누적 속도. 초기값 v0=0v_0=0에서 시작한다.

1스텝: v0=0v_0=0이므로 첫 스텝은 SGD와 동일하다.

v1=βv0+g0=0.9(0)+(6)=6v_1 = \beta v_0 + g_0 = 0.9(0)+(-6) = -6 w1=w0ηv1=00.1(6)=0.6w_1 = w_0 - \eta v_1 = 0 - 0.1(-6) = 0.6

2스텝: 이제부터 SGD와 달라진다. 새 기울기 g1=2(0.63)=4.8g_1=2(0.6-3)=-4.8을 이전 속도와 합친다.

v2=βv1+g1=0.9(6)+(4.8)=5.44.8=10.2v_2 = \beta v_1 + g_1 = 0.9(-6)+(-4.8) = -5.4-4.8 = -10.2 w2=w1ηv2=0.60.1(10.2)=0.6+1.02=1.62w_2 = w_1 - \eta v_2 = 0.6 - 0.1(-10.2) = 0.6+1.02 = 1.62

같은 두 스텝을 거쳤는데도 모멘텀은 w2=1.62w_2=1.62로, SGD의 w2=1.08w_2=1.08보다 훨씬 더 멀리 이동했다. 이전 스텝의 기울기 g0=6g_0=-6이 속도에 남아 두 번째 스텝의 힘을 보태 주었기 때문이다. 비유로 이해하기: SGD가 매 순간 발밑의 경사만 보고 걷는 사람이라면, 모멘텀은 이미 한 방향으로 달리던 관성이 있어 같은 방향의 언덕에서는 더 빨리 가속되는 스케이트보더와 같다.

RMSprop: 가중치마다 학습률을 자동 조절하기

쉽게 말하면: 최근 기울기가 계속 컸던 방향으로는 보폭을 줄이고, 기울기가 작았던 방향으로는 보폭을 키워서 울퉁불퉁한 지형에서도 안정적으로 이동한다.

RMSprop(Root Mean Square Propagation)은 기울기의 제곱을 지수적으로 이동평균(exponential moving average, 최근 값에 더 큰 비중을 두는 평균)한 값 ss로 학습률을 나누어, 기울기가 컸던 파라미터는 보폭을 줄이고 작았던 파라미터는 보폭을 키운다.

st=βst1+(1β)gt2s_t = \beta s_{t-1} + (1-\beta) g_t^2 wt+1=wtηst+ϵgtw_{t+1} = w_t - \frac{\eta}{\sqrt{s_t+\epsilon}} \, g_t
  • sts_t: 기울기 제곱의 이동평균. 초기값 s0=0s_0=0.
  • β=0.9\beta=0.9: 이동평균에서 과거 값을 얼마나 반영할지 정하는 하이퍼파라미터.
  • ϵ\epsilon (엡실론, 아주 작은 상수, 보통 10810^{-8}): 분모가 정확히 0이 되어 나눗셈이 정의되지 않는 것을 막기 위한 안전장치.

1스텝:

s1=βs0+(1β)g02=0.9(0)+0.1(6)2=0.1(36)=3.6s_1 = \beta s_0 + (1-\beta)g_0^2 = 0.9(0)+0.1(-6)^2 = 0.1(36) = 3.6 w1=w0ηs1+ϵg0=00.13.6(6)=0.1×61.897=0.3163w_1 = w_0 - \frac{\eta}{\sqrt{s_1+\epsilon}} g_0 = 0 - \frac{0.1}{\sqrt{3.6}}(-6) = \frac{0.1 \times 6}{1.897} = 0.3163

2스텝: 새 기울기 g1=2(0.31633)=5.3675g_1 = 2(0.3163-3) = -5.3675를 구한 뒤 이동평균을 갱신한다.

s2=βs1+(1β)g12=0.9(3.6)+0.1(5.3675)2=3.24+0.1(28.81)=3.24+2.881=6.121s_2 = \beta s_1 + (1-\beta)g_1^2 = 0.9(3.6)+0.1(5.3675)^2 = 3.24+0.1(28.81) = 3.24+2.881 = 6.121 w2=w1ηs2+ϵg1=0.31630.16.121(5.3675)=0.3163+0.536752.474=0.3163+0.2170=0.5333w_2 = w_1 - \frac{\eta}{\sqrt{s_2+\epsilon}} g_1 = 0.3163 - \frac{0.1}{\sqrt{6.121}}(-5.3675) = 0.3163+\frac{0.53675}{2.474} = 0.3163+0.2170 = 0.5333

RMSprop은 00.31630.53330 \to 0.3163 \to 0.5333으로 SGD(00.61.080 \to 0.6 \to 1.08)보다 오히려 느리게 움직였다. 이는 기울기의 절댓값이 처음부터 커서(g0=6g_0=-6) ss 값이 커지고, 그만큼 분모 s+ϵ\sqrt{s+\epsilon}가 커져 보폭이 줄었기 때문이다. RMSprop의 장점은 이 예제처럼 기울기가 항상 큰 상황보다는, 파라미터마다 기울기의 크기가 서로 크게 다른 실제 신경망에서 각 파라미터에 맞는 보폭을 자동으로 찾아준다는 데 있다.

Adam: Momentum과 RMSprop의 결합

쉽게 말하면: Adam은 이전 방향을 기억하는 모멘텀의 아이디어와, 파라미터마다 보폭을 조절하는 RMSprop의 아이디어를 동시에 쓰는 알고리즘으로, 오늘날 가장 널리 쓰이는 기본 선택지다.

Adam(Adaptive Moment Estimation)은 1차 모멘트(기울기의 이동평균, 모멘텀과 동일한 개념) mm과 2차 모멘트(기울기 제곱의 이동평균, RMSprop과 동일한 개념) vv를 동시에 유지한다.

mt=β1mt1+(1β1)gtm_t = \beta_1 m_{t-1} + (1-\beta_1) g_t vt=β2vt1+(1β2)gt2v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2
  • β1=0.9\beta_1=0.9, β2=0.999\beta_2=0.999: 각각 1차·2차 모멘트의 이동평균 계수로, 관례적으로 이 값을 널리 쓴다.

m0=v0=0m_0=v_0=0에서 시작하면 초기 몇 스텝 동안 m,vm, v가 실제보다 0 쪽으로 치우치는 편향이 생기므로, Adam은 다음과 같은 편향 보정(bias correction)을 거친다.

m^t=mt1β1t,v^t=vt1β2t\hat{m}_t = \frac{m_t}{1-\beta_1^{t}}, \qquad \hat{v}_t = \frac{v_t}{1-\beta_2^{t}}
  • m^t,v^t\hat{m}_t, \hat{v}_t (m 햇, v 햇): 편향을 보정한 1차·2차 모멘트. tt가 커질수록 β1t,β2t\beta_1^t, \beta_2^t가 0에 가까워져 보정 효과는 점점 사라진다.

마지막으로 이 보정된 값으로 파라미터를 갱신한다.

wt+1=wtηv^t+ϵm^tw_{t+1} = w_t - \frac{\eta}{\sqrt{\hat{v}_t}+\epsilon}\, \hat{m}_t

1스텝(t=1t=1):

m1=β1m0+(1β1)g0=0.1(6)=0.6m_1 = \beta_1 m_0+(1-\beta_1)g_0 = 0.1(-6) = -0.6 v1=β2v0+(1β2)g02=0.001(36)=0.036v_1 = \beta_2 v_0+(1-\beta_2)g_0^2 = 0.001(36) = 0.036

편향 보정을 적용한다. 1β11=10.9=0.11-\beta_1^1 = 1-0.9 = 0.1, 1β21=10.999=0.0011-\beta_2^1=1-0.999=0.001이다.

m^1=0.60.1=6,v^1=0.0360.001=36\hat{m}_1 = \frac{-0.6}{0.1} = -6, \qquad \hat{v}_1 = \frac{0.036}{0.001} = 36 w1=w0ηv^1+ϵm^1=00.136(6)=00.16(6)=0+0.1=0.1w_1 = w_0 - \frac{\eta}{\sqrt{\hat{v}_1}+\epsilon}\hat{m}_1 = 0 - \frac{0.1}{\sqrt{36}}(-6) = 0-\frac{0.1}{6}(-6) = 0+0.1 = 0.1

2스텝(t=2t=2): 새 기울기 g1=2(0.13)=5.8g_1=2(0.1-3)=-5.8을 구한다.

m2=β1m1+(1β1)g1=0.9(0.6)+0.1(5.8)=0.540.58=1.12m_2 = \beta_1 m_1+(1-\beta_1)g_1 = 0.9(-0.6)+0.1(-5.8) = -0.54-0.58 = -1.12 v2=β2v1+(1β2)g12=0.999(0.036)+0.001(33.64)=0.035964+0.03364=0.069604v_2 = \beta_2 v_1+(1-\beta_2)g_1^2 = 0.999(0.036)+0.001(33.64) = 0.035964+0.03364 = 0.069604

1β12=10.81=0.191-\beta_1^2 = 1-0.81 = 0.19, 1β22=10.998001=0.0019991-\beta_2^2 = 1-0.998001 = 0.001999이다.

m^2=1.120.19=5.8947,v^2=0.0696040.001999=34.819\hat{m}_2 = \frac{-1.12}{0.19} = -5.8947, \qquad \hat{v}_2 = \frac{0.069604}{0.001999} = 34.819 w2=w1ηv^2+ϵm^2=0.10.134.819(5.8947)=0.10.15.901(5.8947)=0.1+0.0999=0.1999w_2 = w_1 - \frac{\eta}{\sqrt{\hat{v}_2}+\epsilon}\hat{m}_2 = 0.1 - \frac{0.1}{\sqrt{34.819}}(-5.8947) = 0.1-\frac{0.1}{5.901}(-5.8947) = 0.1+0.0999 = 0.1999

Adam은 00.10.19990 \to 0.1 \to 0.1999로 이동해, 이 예제에서는 네 알고리즘 중 가장 조심스러운 보폭을 보였다. 편향 보정이 없었다면 초기 v^1\hat{v}_1이 실제보다 작게 잡혀 첫 스텝의 보폭이 지나치게 커질 수 있는데, 편향 보정이 이를 막아 준 것이다.

네 알고리즘의 이동 궤적 비교

같은 출발점 w0=0w_0=0, 같은 학습률 η=0.1\eta=0.1에서 2스텝을 진행한 결과를 한 표에 모으면 다음과 같다.

알고리즘w0w_0w1w_1w2w_2
SGD000.60000.60001.08001.0800
Momentum000.60000.60001.62001.6200
RMSprop000.31630.31630.53330.5333
Adam000.10000.10000.19990.1999

같은 손실 함수, 같은 학습률인데도 두 스텝 만에 도달한 위치가 1.621.62(Momentum)부터 0.200.20(Adam)까지 여덟 배 가까이 차이 난다는 점이 이 표의 핵심이다. 이 차이는 알고리즘 성능의 우열이 아니라 각 알고리즘이 기울기 정보를 반영하는 방식이 다르기 때문이다. Momentum은 관성으로 가속하고, RMSprop과 Adam은 기울기 제곱의 크기로 보폭을 스스로 줄이므로, 이 예제처럼 기울기의 절댓값이 처음부터 큰 경우 더 신중하게 움직인다.

자주 틀리는 점: “Adam이 항상 SGD보다 빠르다”고 단정하기 쉽지만, 이 예제에서 보듯 Adam은 오히려 가장 보수적으로 움직였다. Adam의 강점은 특정 예제에서의 속도가 아니라, 다양한 문제와 파라미터마다 학습률을 따로 신경 쓰지 않아도 비교적 안정적으로 잘 작동한다는 범용성에 있다. 또한 학습률 η\eta는 여전히 사람이 정해야 하는 하이퍼파라미터이며, Adam이라고 해서 학습률을 아무렇게나 정해도 되는 것은 아니다.

핵심 정리

  • SGD는 현재 기울기만 보고 wwηgtw \leftarrow w-\eta g_t로 갱신하는 가장 단순한 경사하강법이다.
  • Momentum은 이전 속도 vv를 누적해 같은 방향으로는 가속하고 진동은 줄인다(vt=βvt1+gtv_t=\beta v_{t-1}+g_t).
  • RMSprop은 기울기 제곱의 이동평균 ss로 학습률을 나누어 파라미터마다 보폭을 자동 조절한다.
  • Adam은 모멘텀(1차 모멘트)과 RMSprop(2차 모멘트)을 결합하고 편향 보정을 더한 알고리즘으로, 오늘날 가장 널리 쓰이는 기본 선택지다.
  • 같은 손실 함수·같은 학습률에서도 네 알고리즘의 실제 이동 거리는 크게 다를 수 있으며, 이는 각 알고리즘이 과거 기울기 정보를 반영하는 방식의 차이에서 비롯된다.

마무리 복습

문제 14지선다
손실 함수 L(w)=(w-3)²에서 w0=0일 때 기울기 g0의 값은?
문제 24지선다
Momentum의 갱신 수식 v_t = βv_{t-1} + g_t에서 β를 크게 설정할수록 나타나는 효과로 가장 옳은 것은?
문제 34지선다
RMSprop에서 기울기의 절댓값이 계속 크게 유지되는 파라미터에 대해 일어나는 일로 옳은 것은?
문제 44지선다
Adam에서 편향 보정(bias correction)을 하는 이유로 가장 옳은 것은?
문제 54지선다
같은 손실 함수와 같은 학습률로 2스텝을 진행했을 때, 이 편의 계산 결과 w2 값이 가장 크게(목표에 가장 빠르게 다가간 것처럼) 나온 알고리즘은?
문제 64지선다
이 편의 계산 결과를 근거로 최적화 알고리즘 선택에 대해 옳지 않은 설명은?

참고 자료

Last updated on