optimizer의 수학적 추론

이정민·2026년 5월 22일

SGD with Momentum

xˉt=x1+x2+...+xtt\bar x_t = \frac{x_1 + x_2 + ... + x_t}{t} 를 우리는 흔히 Average라고 한다.

How to write the average in a RECURSIVE FORM?
xˉt=\bar x_t =
xˉt1+\bar x_{t-1} +

⭐ 위 Normal Average 공식을 사용해서

St=x1+x2+...+xtS_t = x_1 + x_2 + ... + x_t 라고 할 때,

xˉt=Stt\bar x_t = \frac{S_t}{t}

xˉt1=x1+x2+...xt1t1=St1t1\bar x_{t-1} = \frac{x_1 + x_2 + ... x_{t-1}}{t-1} = \frac {S_{t-1}}{t-1}St1=(t1)xˉt1S_{t-1} = (t-1)\bar x_{t-1}

St=x1+x2+...+xt1+xt=St1+xtS_t = x_1 + x_2 + ... +x_{t-1} + x_t = S_{t-1} + x_t

St=(t1)xˉt1+xtS_t = (t-1)\bar x_{t-1} + x_t

xˉt=(t1)xˉt1+xtt\bar x_t = \frac{(t-1)\bar x_{t-1} + x_t}{t} : Time step tt 까지의 평균

Recursive form of average: Memory efficient way

  • 과거의 정보와 현재 정보를 어떤 비율로 섞을 것인가?

xˉt=βtxˉt1+(1βt)xt\bar x_t = \beta_t\bar x_{t-1} + (1-\beta_t)x_t where βt=(t1)t\beta_t = \frac{(t-1)}{t}

  • 이렇게 시간이 지날수록, 앞의 가중치가 더 커짐 (새로들어온 정보 무시당함)

Simple Moving Average (SMA)

  • Specified period 상의 값들의 평균: 그냥 일반적인 평균이라는거

정확히 nn개의 데이터를 더하기 위해서 xtn+1x_{t-n+1} 이 분자의 마지막 항

SMAt=xt+xt1+...+xtn+1n\text{SMA}_t = \frac {x_t + x_{t-1} + ... + x_{t-n+1}}{n}

Time step tt에서의 SMA인데,

  • nn은 window size(평균 구하는 기간) ,
  • xtx_t는 t시점에서의 Value

Exponential Moving Average (EMA)

EMA는 최근 데이터에 더 많은 가중치를 준다.

EMAt=βEMAt1+(1β)xt\text{EMA}_t = \beta\text{EMA}_{t-1} + (1-\beta)x_t

  • β\beta는 smoothing factor로, 0<β10<\beta \le 1 사이의 값을 가진다.

EMAt1xt에대한Convex Combination\text{EMA}_{t-1}과 x_t에 대한 \text{Convex Combination} 이다.

⭐ Recursive form of average 에서 β\beta의 범위와 혼동 주의

최신 데이터를 반영하는 가중치가 시간에 따라 변하느냐, 고정되어 있느냐의 차이이다.

  • 일반 평균: 과거 데이터가 많이 쌓일수록 새로 들어온 데이터는 무시
  • EMA: 새로 들어온 데이터는 무조건 전체 평균의 일정 영향력 행사
Timext (sensor reading)xˉt (EMA, β=0.5)
122.022.0 (initial)
222.50.522.0+0.522.5=22.250.5 \cdot 22.0 + 0.5 \cdot 22.5 = 22.25
323.00.522.25+0.523.0=22.6250.5 \cdot 22.25 + 0.5 \cdot 23.0 = 22.625
422.80.522.625+0.522.8=22.71250.5 \cdot 22.625 + 0.5 \cdot 22.8 = 22.7125

Recursive form of Average 랑 EMA랑 같은 식.

단지 β\betat1t\frac{t-1}{t} 인지, 0과 1 사이의 고정된 상수인지 따라 나뉜다.

Exponential decay in EMA

  • 과거의 데이터가 어떻게 지수적으로 감소하며 잊혀지는가?

[일반적인 EMA 수식] : vtv_t : 현재 tt 시점에서의 EMA 값

vt=βvt1+(1β)xtv_t = \beta v_{t-1} + (1-\beta)x_t

[ t1t-1 시점에서의 EMA: vt1v_{t-1} ]

vt1=βvt2+(1β)xt1v_{t-1} = \beta v_{t-2} + (1-\beta)x_{t-1}

위 식 (t1t-1)시점을 현재 시점 수식에 집어넣어보자

vt=β(βvt2+(1β)xt1)+(1β)xtv_t = \beta (\beta v_{t-2} + (1-\beta)x_{t-1}) + (1-\beta)x_t
=β2vt2+β(1β)xt1+(1β)xt= \beta^2v_{t-2} + \beta (1-\beta)x_{t-1} + (1-\beta)x_t

이런 식으로 β\beta의 지수가 점점 커진다.

무한히 반복하게 되면

vt=βtv0+(1β)i=1tβtixiv_t= \beta^tv_0 + (1-\beta)\sum\limits_{i=1}^t\beta^{t-i}x_i

  • βtv0\beta^tv_0: 맨 처음 초기값(v0v_0)이 현재에 미치는 영향이다. 시간이 지나 tt가 커지면 βt\beta^t는 거의 0이 되므로, 초기값의 영향력은 완전히 사라진다
  • βti\beta^{t-i}: 과거 시점 ii의 데이터 xix_i에 곱해지는 가중치이다.

SGD with Momentum

  • wt\vec w_t: tt-step 에서의 최적화 변수
  • gt=g(wt)\vec g_t = \vec g(\vec w_t) : tt-step 에서의 Gradient 추정치

mt=μ mt1+gt\vec m_t = \mu\ \vec m_{t-1} + \vec g_t

  • η*\eta 는 0~1 사이의 값이기 때문에 Gradient에 더 가중치가 쏠림*

wt+1=wtη mt\vec w_{t+1} = \vec w_t -\eta \ \vec m_t


  • Higher μ\mu : Smoother but slower to adapt
    μ\mu가 크면 과거의 기억을 잘 가져간다. 노이즈를 다 무시해서 smooth하지만, 관성 때문에 코너를 크게 돈다. (Slower to adapt)
  • lower μ\mu : More responsive but more jittery
    μ\mu가 작으면 새로운 기울기에 즉각 반응하여 방향을 휙휙 틈
    하지만 불필요 노이즈에도 반응해서 jittery함

μ\mu가 0이면 SGD랑 다를바가 없음

Exponential decay in Momentum update

mt=μ mt1+gt\vec m_t = \mu \ \vec m_{t-1} + \vec g_t

k=0tμkgtk\sum \limits_{k=0}^t\mu^k \vec g_{t-k}

  • μk\mu^kkk가 커지면 커질수록 0으로 가까워짐 (μ:(0,1)\mu : (0, 1))
  • kktt일 때에는, μtg0\mu^t \vec g_0
    → 맨 처음 계산한 GD 효과를 죽이고, 최근 것에 가중치 올림

EMA랑 다를게 뭔데?

최근 데이터에 가중치 주고, 과거 데이터는 줄이는 아이디어는 동일

가중치 합을 1로 맞추는 정규화 여부에 따른 차이가 존재함

vt=(1μ)k=0tμkgtkv_t = (1-\mu)\sum \limits_{k=0}^t\mu^kg_{t-k} : EMA 수식

여기서는 앞에 (1μ)(1-\mu)가 곱해져 있어서 가중치들의 총합이 1.
→ 과거 데이터를 많이 섞어도 결과값의 크기는 원래 데이터(gg)들의 평균적인 크기를 유지함 (1이 되는건 등비수열의 합 공식 생각하기)

mt=k=0tμkgtkm_t = \sum \limits_{k=0}^t\mu^kg_{t-k} : SGD의 모멘텀

앞에 (1μ1-\mu)가 없어서 가중치 총합은 11μ\frac{1}{1-\mu}.
단순 평균이 아니라 과거 값들의 누적이 되어 스케일이 커짐

Adaptive Optimizers

Noisy Quadratic model

f(w)=12(h1w12+h2w22)f(\vec w) = \frac{1}{2}(h_1w^2_1 + h_2w_2^2)

  • h1,h2h_1, h_2는 곡률을 의미한다. (Hessian Matrix HH 의 고윳값)

AdaGrad

AdaGrad는 ‘과거의 기울기’를 모두 기억하는 방식을 선택했다.

ht=ht1+gtgt\vec h_t = \vec h_{t-1} + g_t \odot g_t :
기울기 제곱의 누적 [매 스탭 tt 마다 현재 기울기 gtg_t 구하고 제곱해서 과거 누적에 더하기

wt+1=wtηht+ϵgt\vec w_{t+1} = \vec w_t - \frac{\eta}{\sqrt{\vec h_t} + \epsilon} \odot \vec g_t
→ 파라미터 업데이트: 누적값 ht\vec h_t를 사용해 파라미터 w\vec w 업데이트하기


gt=1BtiBtfi(wt)\vec g_t = \frac{1}{|B_t|} \sum_{i\in B_t} \nabla f_i(\vec w_t) : 이건 그냥 기울기 구하는거

GD 제곱을 계속 축적시켜서 ht\vec h_t가 무한히 커져서 실제 적용되는 학습률이 0에 수렴해버려서 멈춰버림

  • AdaGrad는 Convex에서만 작동 잘 함
    • Non-Convex에서는 Local Minima에 빠짐

RMSProp

AdaGrad가 과거를 너무 다 기억해서 학습이 멈추는 문제가 있음
→ AdaGrad 수식에 EMA를 섞어서 옛 기울기는 잊도록 만든 것

ht=βht1+(1β)gtgt\vec h_t = \beta\vec h_{t-1} + (1-\beta)\vec g_t \odot \vec g_t

wt+1=wtηht+ϵgt\vec w_{t+1} = \vec w_t - \frac{\eta}{\sqrt{\vec h_t} + \epsilon} \odot \vec g_t

Adam: RMSProp + Momentum

mt=β1mt1+(1β)gt\vec m_t = \beta_1 \vec m_{t-1} + (1-\beta)\vec g_t : EMA of Gradients (1차 모멘트)

vt=β2vt1+(1β2)(gtgt)\vec v_t = \beta_2\vec v_{t-1} + (1-\beta_2)(\vec g_t \odot \vec g_t)
→ 2차 모멘트

m^=mt1β1t,v^=vt1β2t\hat{\vec m} = \frac{\vec m_t}{1 - \beta^t_1}, \hat{\vec v} = \frac{\vec v_t}{1-\beta^t_2} : 편향 조정

→ 학습 극초반, tt가 작을 때 mt,vtm_t, v_t가 0에 가깝게 계산되는 것을 막기 위함

wt+1=wtηϵ+v^m^\vec w_{t+1} = \vec w_t - \frac{\eta}{\epsilon + \sqrt{\hat{\vec v}}} \odot \hat{\vec m} : Weight update

  • 분자: 순수하게 요동치는 현재 기울기 gtg_t대신 모멘텀을 사용
  • 분모: 무한히 커지는 누적합 대신, 2차 모멘트로 파라미터별로 η\eta를 나눠줌
  • ϵ\epsilon: 분모가 완전히 0이 되어 폭발 방지

Adam: Bias Correction

EMA에서 이전 시점의 평균값이 필요한데, 학습 막 시작한 단계(t=1t=1)일 때에는 과거 데이터가 없음

m0,v0m_0, v_0을 0벡터로 초기화하고 시작함

  • 문제는 이 ‘0’이라는 값이 비어있다는 것이 아닌, 수학적으로 “과거 평균 기울기가 0” 이라는 잘못된 정보로 작용함

실제 기울기는 g1g_1인데, 계산된 이동 평균 m1m_1은 실제의 10%의 값으로 되어버림

해결 방안: Bias correction

m^:=mt1β1t\hat m:= \frac{m_t}{1-\beta^t_1}

분모에 있는 tt는 단순 변수가 아닌, 지수이다.

→ 학습 스텝이 진행될수록 β1\beta_1tt번 거듭제곱 하는 것

  • 학습 극초반 (t=1t=1) 일 때: 분모는 10.91=0.11-0.9^1 = 0.1이 된다.
    따라서 보정된 값 m^1=0.1g10.1=g1\hat m_1 = \frac{0.1g_1}{0.1} = g_1이 된다.
    정확히 실제 기울기 g1g_1로 100% 복귀되었다.
  • 학습 중반 이후(t=1000t=1000)일 때: β1\beta_1은 1보다 작은 소수(0.9)이기 때문에, 1000번 거듭제곱을 하면 0.9100000.9^{1000} \approx 0으로 사실상 완전 소멸한다.
    분모는 10=11-0 = 1이 되고, 보정된 값 m^1000=m10001=m1000\hat m_{1000} = \frac{m_{1000}}{1} = m_{1000} 이 된다.

    즉, 데이터가 부족해서 0의 영향을 강하게 받는 극초반에는 강제로 스케일을 키워주고, 데이터가 충분히 쌓인 0의 영향력이 희석된 후반부에는 스스로 사라지는 장치이다.

0개의 댓글