SGD with Momentum
xˉt=tx1+x2+...+xt 를 우리는 흔히 Average라고 한다.
How to write the average in a RECURSIVE FORM?
xˉt= ◻xˉt−1+ ▵
⭐ 위 Normal Average 공식을 사용해서
St=x1+x2+...+xt 라고 할 때,
xˉt=tSt
xˉt−1=t−1x1+x2+...xt−1=t−1St−1 → St−1=(t−1)xˉt−1
St=x1+x2+...+xt−1+xt=St−1+xt
St=(t−1)xˉt−1+xt
⇒ xˉt=t(t−1)xˉt−1+xt : Time step t 까지의 평균
- 과거의 정보와 현재 정보를 어떤 비율로 섞을 것인가?
xˉt=βtxˉt−1+(1−βt)xt where βt=t(t−1)

- 이렇게 시간이 지날수록, 앞의 가중치가 더 커짐 (새로들어온 정보 무시당함)
Simple Moving Average (SMA)
- Specified period 상의 값들의 평균: 그냥 일반적인 평균이라는거
정확히 n개의 데이터를 더하기 위해서 xt−n+1 이 분자의 마지막 항
SMAt=nxt+xt−1+...+xt−n+1
Time step t에서의 SMA인데,
- n은 window size(평균 구하는 기간) ,
- xt는 t시점에서의 Value
Exponential Moving Average (EMA)
EMA는 최근 데이터에 더 많은 가중치를 준다.
EMAt=βEMAt−1+(1−β)xt
- β는 smoothing factor로, 0<β≤1 사이의 값을 가진다.
EMAt−1과xt에대한Convex Combination 이다.
최신 데이터를 반영하는 가중치가 시간에 따라 변하느냐, 고정되어 있느냐의 차이이다.
- 일반 평균: 과거 데이터가 많이 쌓일수록 새로 들어온 데이터는 무시
- EMA: 새로 들어온 데이터는 무조건 전체 평균의 일정 영향력 행사
| Time | xt (sensor reading) | xˉt (EMA, β=0.5) |
|---|
| 1 | 22.0 | 22.0 (initial) |
| 2 | 22.5 | 0.5⋅22.0+0.5⋅22.5=22.25 |
| 3 | 23.0 | 0.5⋅22.25+0.5⋅23.0=22.625 |
| 4 | 22.8 | 0.5⋅22.625+0.5⋅22.8=22.7125 |
단지 β가 tt−1 인지, 0과 1 사이의 고정된 상수인지 따라 나뉜다.
Exponential decay in EMA
- 과거의 데이터가 어떻게 지수적으로 감소하며 잊혀지는가?
[일반적인 EMA 수식] : vt : 현재 t 시점에서의 EMA 값
vt=βvt−1+(1−β)xt
[ t−1 시점에서의 EMA: vt−1 ]
vt−1=βvt−2+(1−β)xt−1
위 식 (t−1)시점을 현재 시점 수식에 집어넣어보자
vt=β(βvt−2+(1−β)xt−1)+(1−β)xt
=β2vt−2+β(1−β)xt−1+(1−β)xt
이런 식으로 β의 지수가 점점 커진다.
무한히 반복하게 되면
vt=βtv0+(1−β)i=1∑tβt−ixi
- βtv0: 맨 처음 초기값(v0)이 현재에 미치는 영향이다. 시간이 지나 t가 커지면 βt는 거의 0이 되므로, 초기값의 영향력은 완전히 사라진다
- βt−i: 과거 시점 i의 데이터 xi에 곱해지는 가중치이다.
SGD with Momentum
- wt: t-step 에서의 최적화 변수
- gt=g(wt) : t−step 에서의 Gradient 추정치
mt=μ mt−1+gt
- ∗η 는 0~1 사이의 값이기 때문에 Gradient에 더 가중치가 쏠림*
wt+1=wt−η mt
- Higher μ : Smoother but slower to adapt
→ μ가 크면 과거의 기억을 잘 가져간다. 노이즈를 다 무시해서 smooth하지만, 관성 때문에 코너를 크게 돈다. (Slower to adapt)
- lower μ : More responsive but more jittery
→ μ가 작으면 새로운 기울기에 즉각 반응하여 방향을 휙휙 틈
하지만 불필요 노이즈에도 반응해서 jittery함
μ가 0이면 SGD랑 다를바가 없음

Exponential decay in Momentum update
mt=μ mt−1+gt
k=0∑tμkgt−k
- μk는 k가 커지면 커질수록 0으로 가까워짐 (μ:(0,1))
- k가 t일 때에는, μtg0
→ 맨 처음 계산한 GD 효과를 죽이고, 최근 것에 가중치 올림
EMA랑 다를게 뭔데?
최근 데이터에 가중치 주고, 과거 데이터는 줄이는 아이디어는 동일
가중치 합을 1로 맞추는 정규화 여부에 따른 차이가 존재함
vt=(1−μ)k=0∑tμkgt−k : EMA 수식
여기서는 앞에 (1−μ)가 곱해져 있어서 가중치들의 총합이 1.
→ 과거 데이터를 많이 섞어도 결과값의 크기는 원래 데이터(g)들의 평균적인 크기를 유지함 (1이 되는건 등비수열의 합 공식 생각하기)
mt=k=0∑tμkgt−k : SGD의 모멘텀
앞에 (1−μ)가 없어서 가중치 총합은 1−μ1.
→ 단순 평균이 아니라 과거 값들의 누적이 되어 스케일이 커짐
Adaptive Optimizers
Noisy Quadratic model
f(w)=21(h1w12+h2w22)
- h1,h2는 곡률을 의미한다. (Hessian Matrix H 의 고윳값)
AdaGrad
AdaGrad는 ‘과거의 기울기’를 모두 기억하는 방식을 선택했다.
ht=ht−1+gt⊙gt :
→ 기울기 제곱의 누적 [매 스탭 t 마다 현재 기울기 gt 구하고 제곱해서 과거 누적에 더하기
wt+1=wt−ht+ϵη⊙gt
→ 파라미터 업데이트: 누적값 ht를 사용해 파라미터 w 업데이트하기
gt=∣Bt∣1∑i∈Bt∇fi(wt) : 이건 그냥 기울기 구하는거
GD 제곱을 계속 축적시켜서 ht가 무한히 커져서 실제 적용되는 학습률이 0에 수렴해버려서 멈춰버림
- AdaGrad는 Convex에서만 작동 잘 함
- Non-Convex에서는 Local Minima에 빠짐
RMSProp
AdaGrad가 과거를 너무 다 기억해서 학습이 멈추는 문제가 있음
→ AdaGrad 수식에 EMA를 섞어서 옛 기울기는 잊도록 만든 것
ht=βht−1+(1−β)gt⊙gt
wt+1=wt−ht+ϵη⊙gt
Adam: RMSProp + Momentum
mt=β1mt−1+(1−β)gt : EMA of Gradients (1차 모멘트)
vt=β2vt−1+(1−β2)(gt⊙gt)
→ 2차 모멘트
m^=1−β1tmt,v^=1−β2tvt : 편향 조정
→ 학습 극초반, t가 작을 때 mt,vt가 0에 가깝게 계산되는 것을 막기 위함
wt+1=wt−ϵ+v^η⊙m^ : Weight update
- 분자: 순수하게 요동치는 현재 기울기 gt대신 모멘텀을 사용
- 분모: 무한히 커지는 누적합 대신, 2차 모멘트로 파라미터별로 η를 나눠줌
- ϵ: 분모가 완전히 0이 되어 폭발 방지
Adam: Bias Correction
EMA에서 이전 시점의 평균값이 필요한데, 학습 막 시작한 단계(t=1)일 때에는 과거 데이터가 없음
→ m0,v0을 0벡터로 초기화하고 시작함
- 문제는 이 ‘0’이라는 값이 비어있다는 것이 아닌, 수학적으로 “과거 평균 기울기가 0” 이라는 잘못된 정보로 작용함

실제 기울기는 g1인데, 계산된 이동 평균 m1은 실제의 10%의 값으로 되어버림
해결 방안: Bias correction
m^:=1−β1tmt
분모에 있는 t는 단순 변수가 아닌, 지수이다.
→ 학습 스텝이 진행될수록 β1을 t번 거듭제곱 하는 것
- 학습 극초반 (t=1) 일 때: 분모는 1−0.91=0.1이 된다.
따라서 보정된 값 m^1=0.10.1g1=g1이 된다.
정확히 실제 기울기 g1로 100% 복귀되었다.
- 학습 중반 이후(t=1000)일 때: β1은 1보다 작은 소수(0.9)이기 때문에, 1000번 거듭제곱을 하면 0.91000≈0으로 사실상 완전 소멸한다.
분모는 1−0=1이 되고, 보정된 값 m^1000=1m1000=m1000 이 된다.
즉, 데이터가 부족해서 0의 영향을 강하게 받는 극초반에는 강제로 스케일을 키워주고, 데이터가 충분히 쌓인 0의 영향력이 희석된 후반부에는 스스로 사라지는 장치이다.