TIL — Momentum Optimizer와 Kaiming Initialization

정승민·3일 전

TIL

목록 보기
6/6

오늘의 핵심
오늘은 어제까지 공부한 GD → SGD → Mini-batch SGD 흐름에서 이어서 Momentum을 공부했고,
초기화에서는 Zero / Constant / Random → Xavier → Kaiming으로 이어지는 이유를 정리했다.

특히 오늘은 단순히 공식을 외우기보다,

  • 왜 Momentum이 필요한지
  • Momentum을 기하학적으로 어떻게 이해해야 하는지
  • Xavier와 Kaiming의 차이가 왜 생기는지
  • ReLU의 어떤 특성이 Kaiming을 필요하게 만드는지
  • 초기화의 목표가 왜 Var(W) 자체가 아니라 activation / gradient scale 유지인지

를 연결해서 이해하는 데 집중했다.


1. 지금까지 최적화 흐름

📌 Gradient Descent

Gradient Descent는 현재 Parameter에서 Loss가 가장 빠르게 증가하는 방향의 반대쪽으로 이동하는 방법이다.

θt+1=θt−η∇θL\theta_{t+1} = \theta_t - \eta \nabla_\theta L

여기서:

  • θ\theta : Weight, Bias 등 학습 가능한 Parameter
  • η\eta : Learning Rate
  • ∇θL\nabla_\theta L : Loss를 Parameter로 미분한 Gradient

Gradient는 단순히 "얼마나 움직여라"는 값이 아니라,

현재 위치에서 Loss가 어느 방향으로, 얼마나 가파르게 증가하는지

를 나타낸다.

Learning Rate는 그 방향으로 실제로 얼마나 이동할지 결정한다.


📌 Batch Gradient Descent

전체 데이터가 NN개라면:

L(θ)=1N∑i=1NLi(θ)L(\theta) = \frac{1}{N} \sum_{i=1}^{N} L_i(\theta)

이고 전체 Gradient는:

∇θL=1N∑i=1N∇θLi\nabla_\theta L = \frac{1}{N} \sum_{i=1}^{N} \nabla_\theta L_i

이다.

즉:

전체 데이터
↓
평균 Loss
↓
전체 데이터 기준 Gradient
↓
Parameter 1회 Update

📌 Pure SGD

SGD는 데이터 하나를 사용해 Gradient를 계산하고 바로 Parameter를 업데이트한다.

θt+1=θt−η∇θLi\theta_{t+1} = \theta_t - \eta\nabla_\theta L_i

즉:

데이터 1개
↓
Loss
↓
Gradient
↓
바로 Update

전체 Gradient를 정확히 계산하지 않고 하나의 Sample Gradient로 추정하므로 빠르지만 Gradient가 많이 흔들릴 수 있다.


📌 Mini-batch SGD

실제 딥러닝에서는 Pure SGD보다 Mini-batch를 가장 많이 사용한다.

Batch Size가 BB라면:

LB=1B∑i∈BLiL_B = \frac{1}{B} \sum_{i\in\mathcal B}L_i

이고:

∇θLB=1B∑i∈B∇θLi\nabla_\theta L_B = \frac{1}{B} \sum_{i\in\mathcal B} \nabla_\theta L_i

이다.

즉:

각 데이터의 Loss를 계산한 뒤 평균 Loss를 만들고, 그 평균 Loss를 Backward하면 결과적으로 각 데이터 Gradient의 평균을 얻는다.


2. Mini-batch와 Gradient Variance

Mini-batch Gradient를:

gB=1B∑i=1Bgig_B = \frac{1}{B} \sum_{i=1}^{B}g_i

라고 하자.

각 Sample Gradient가 서로 어느 정도 독립이라고 단순하게 가정하면:

Var(gB)≈Var(gi)BVar(g_B) \approx \frac{Var(g_i)}{B}

따라서:

Var(gB)∝1BVar(g_B)\propto\frac{1}{B}

이다.

즉:

Batch Size ↑
↓
더 많은 Sample Gradient를 평균
↓
개별 데이터 때문에 튀는 영향 감소
↓
Gradient Variance ↓
↓
전체 Gradient에 가까운 안정적인 추정

💡 여기서 분산은 "입력 데이터 값의 분산"이 아니라,
Mini-batch를 다르게 뽑았을 때 Gradient 추정값이 얼마나 흔들리는가를 의미한다.


3. Momentum은 왜 필요한가?

Mini-batch SGD는 Gradient가 noisy하다.

예를 들어 Loss Surface가 길고 좁은 골짜기 형태라면 SGD는:

↘
  ↙
    ↘
      ↙
        ↘

처럼 가파른 방향으로 계속 지그재그 진동할 수 있다.

이때 자연스럽게 다음 질문이 생긴다.

현재 Gradient만 보지 말고, 이전에 이동하던 방향도 기억하면 더 안정적으로 움직일 수 있지 않을까?

이 아이디어가 Momentum이다.


4. Momentum 수식

가장 기본적인 Momentum 형태는:

vt=βvt−1+gtv_t = \beta v_{t-1} + g_t
θt+1=θt−ηvt\theta_{t+1} = \theta_t - \eta v_t

이다.

여기서:

  • gtg_t : 현재 Step의 Gradient
  • vtv_t : 과거 Gradient 방향이 누적된 Velocity
  • β\beta : 과거 방향을 얼마나 유지할지 결정하는 Momentum 계수
  • η\eta : Learning Rate

보통 β=0.9\beta=0.9 정도를 많이 사용한다.


📌 Momentum의 직관

SGD:

현재 Gradient만 사용

Momentum:

현재 Gradient
+
과거에 계속 가던 방향
↓
새로운 Update 방향

즉 Momentum은 물리적인 관성과 비슷한 직관을 가진다.


5. Momentum을 기하학적으로 이해하기

Momentum에서 가장 중요한 기하학적 이해는 다음과 같다.

Loss Surface가 한쪽 방향으로는 가파르고, 다른 방향으로는 완만하다고 하자.

SGD는 가파른 방향의 Gradient 부호가 계속 바뀌면서:

왼쪽 ↔ 오른쪽
왼쪽 ↔ 오른쪽

으로 진동할 수 있다.

반면 실제 Minimum을 향하는 방향의 Gradient는 여러 Step 동안 비슷한 방향을 유지할 수 있다.

Momentum에서는:

계속 방향이 바뀌는 Gradient
→ 서로 상쇄
→ Oscillation 감소

계속 같은 방향으로 나오는 Gradient
→ Velocity에 누적
→ 이동 가속

이 발생한다.

🎯 Momentum의 핵심은 가파른 축의 불필요한 진동은 줄이고, 일관된 진행 방향은 가속하는 것이다.


6. Momentum을 전개해보면

vt=βvt−1+gtv_t = \beta v_{t-1}+g_t

를 계속 펼치면:

vt=gt+βgt−1+β2gt−2+β3gt−3+⋯v_t = g_t + \beta g_{t-1} + \beta^2g_{t-2} + \beta^3g_{t-3} +\cdots

가 된다.

즉:

현재 Gradient      → 가중치 1
1 Step 전 Gradient → 가중치 β
2 Step 전 Gradient → 가중치 β²
3 Step 전 Gradient → 가중치 β³

과거 Gradient일수록 영향력이 지수적으로 감소한다.

따라서 Momentum은 본질적으로:

과거 Gradient의 지수적으로 감소하는 가중 누적

이라고 볼 수 있다.


7. Momentum에서 꼭 기억할 점

📌 Momentum은 Learning Rate를 크게 만드는 것이 아니다

Learning Rate:

η\eta

는 Update의 전체 Scale을 조절한다.

Momentum:

vtv_t

는 과거 방향 정보를 이용해 Update 방향을 Smooth하게 만들고 일관된 방향을 가속한다.

둘의 역할은 다르다.


📌 Momentum 핵심 5줄

  1. Mini-batch Gradient는 noisy해서 Parameter Update가 지그재그로 움직일 수 있다.
  2. Momentum은 과거 Gradient 방향을 Velocity에 누적한다.
  3. 방향이 계속 바뀌는 Gradient 성분은 서로 상쇄된다.
  4. 계속 같은 방향의 Gradient는 누적되어 가속된다.
  5. 즉 Momentum은 Oscillation 감소 + 일관된 방향 가속을 위한 방법이다.

8. 지금까지 초기화 흐름

초기화에서 가장 먼저 배운 핵심은 두 가지였다.

1. Weight들이 서로 다른 값을 가져야 한다.
2. Weight의 Scale이 적절해야 한다.


📌 Zero / Constant Initialization

모든 Weight를 동일하게 초기화하면:

같은 Weight
↓
같은 Activation
↓
같은 Gradient
↓
같은 Update
↓
같은 Feature 학습

이 발생할 수 있다.

이를 Symmetry Problem이라고 한다.

따라서 Hidden Layer의 Weight 전체를 같은 값으로 초기화하는 것은 좋지 않다.


📌 Random Initialization

Uniform / Normal Distribution에서 Weight를 랜덤하게 뽑으면 각 뉴런이 서로 다른 Weight로 시작할 수 있다.

즉 Symmetry는 깨진다.

하지만 새로운 문제가 생긴다.

Random하게 뽑기는 했는데, 얼마나 큰 값으로 뽑아야 하는가?


9. 초기화에서 분산이 중요한 이유

한 뉴런의 Pre-activation을:

z=w1x1+w2x2+⋯+wnxnz = w_1x_1+w_2x_2+\cdots+w_nx_n

라고 하자.

여기서:

  • xix_i : 이전 Layer의 Activation
  • wiw_i : Weight
  • nn : Input Feature 수, 즉 fan-in
  • zz : Activation Function 적용 전 값

일반적으로:

Var(z)=∑iVar(wixi)+2∑i<jCov(wixi,wjxj)Var(z) = \sum_iVar(w_ix_i) + 2\sum_{i<j}Cov(w_ix_i,w_jx_j)

이다.

초기화 이론에서는 단순화를 위해:

  • Weight들이 독립
  • 입력들이 대략 비상관
  • 평균이 0에 가까움
  • Weight와 Activation이 독립

등을 가정한다.

그러면:

Var(z)≈∑iVar(wixi)Var(z) \approx \sum_iVar(w_ix_i)

이고 더 단순화하면:

Var(z)≈faninVar(w)Var(x)\boxed{ Var(z) \approx fan_{in}Var(w)Var(x) }

가 된다.


10. 초기화의 진짜 목표

초기화의 목표는:

Var(W)를 최대한 작게 만들기 ❌

가 아니다.

목표는:

Layer를 지나도 Activation과 Gradient의 Scale이 너무 커지거나 작아지지 않도록 유지하는 것

이다.

즉 대략:

Var(zl+1)≈Var(xl)Var(z_{l+1}) \approx Var(x_l)

와 같은 상태를 좋은 출발점으로 만들고 싶은 것이다.

Weight Variance를 조절하는 것은 이 목표를 달성하기 위한 수단이다.


11. Weight Scale과 Variance

중요한 성질:

Var(aW)=a2Var(W)Var(aW) = a^2Var(W)

이다.

따라서 Weight 전체 Scale을 절반으로 줄이면:

Var(0.5W)=0.25Var(W)Var(0.5W) = 0.25Var(W)

가 된다.

즉:

Weight 값을 동일한 비율로 작게 만들면 Weight 분포의 분산도 자연스럽게 작아진다.

그래서 fan-in이 많을수록 각 wixiw_ix_i의 분산이 많이 더해지므로 Weight Scale을 줄일 필요가 있다.


12. Xavier Initialization

Xavier는 Forward와 Backward에서 Signal / Gradient Scale을 동시에 고려한다.

Forward 관점에서:

Var(w)≈1faninVar(w) \approx \frac{1}{fan_{in}}

정도가 필요하다.

Backward 관점에서는:

Var(w)≈1fanoutVar(w) \approx \frac{1}{fan_{out}}

정도가 필요하다.

하지만 일반적으로:

fanin≠fanoutfan_{in}\neq fan_{out}

이므로 두 조건을 동시에 정확히 만족하기 어렵다.

Xavier는 둘 사이를 절충해:

Var(w)=2fanin+fanout\boxed{ Var(w) = \frac{2} {fan_{in}+fan_{out}} }

을 사용한다.


📌 Xavier의 의미

Forward Activation Scale
        ↘
         적절한 Weight Variance
        ↗
Backward Gradient Scale

즉:

Forward와 Backward 모두 한쪽으로 크게 망가지지 않도록 중간 지점을 잡는 초기화

라고 볼 수 있다.


13. Xavier는 학습 내내 분산을 유지하는가?

아니다.

Xavier는:

학습 시작 시 Activation과 Gradient Scale이 폭발하거나 소실되지 않도록 좋은 초기 조건을 만드는 방법

이다.

학습이 시작되면:

W←W−η∇WLW \leftarrow W - \eta\nabla_WL

에 의해 Weight가 계속 바뀌므로 Xavier가 처음 만든 분포가 그대로 유지되지는 않는다.

또 독립성, 평균 0 등 여러 가정이 사용되므로 실제 네트워크에서 분산이 정확히 보존되는 것도 아니다.


14. Kaiming Initialization은 왜 필요한가?

Xavier를 이해한 다음 ReLU를 생각하면 새로운 문제가 생긴다.

ReLU:

ReLU(z)=max⁡(0,z)ReLU(z) = \max(0,z)

는 음수 입력을 모두 0으로 만든다.

zz가 0을 중심으로 대칭적인 분포라고 가정하면:

z > 0 → 그대로 통과
z < 0 → 0

이므로 대략 절반의 Activation이 0이 된다.

🚨 여기서 0이 되는 것은 Weight의 절반이 아니라 Pre-activation / Activation의 음수 절반이다.


15. ReLU의 중요한 특성

Kaiming 관점에서 ReLU의 중요한 특성은 두 가지다.

📌 Forward

a=ReLU(z)a=ReLU(z)

에서 음수 Signal이 0이 된다.

0 중심 대칭 분포라는 가정 아래:

E[ReLU(z)2]≈12E[z2]E[ReLU(z)^2] \approx \frac{1}{2}E[z^2]

즉 Signal의 Second Moment가 대략 절반으로 감소한다.


📌 Backward

ReLU의 미분은:

ReLU′(z)={1z>00z<0ReLU'(z) = \begin{cases} 1 & z>0\\ 0 & z<0 \end{cases}

이다.

따라서 음수 영역에서는 Gradient 역시 0이 된다.

즉 ReLU는:

Forward
→ 음수 Activation 제거

Backward
→ 해당 위치 Gradient 제거

라는 특성을 가진다.


16. 왜 Weight를 Xavier보다 크게 잡는가?

ReLU 때문에 Forward Signal이 대략 절반 줄어든다고 생각하면:

출력 Signal Scale≈12faninVar(w)Var(x)\text{출력 Signal Scale} \approx \frac12 fan_{in}Var(w)Var(x)

이다.

우리는 입력과 비슷한 Scale을 유지하고 싶으므로:

12faninVar(w)Var(x)≈Var(x)\frac12 fan_{in}Var(w)Var(x) \approx Var(x)

라고 둔다.

Var(x)Var(x)를 약분하면:

12faninVar(w)≈1\frac12fan_{in}Var(w) \approx1

따라서:

Var(w)≈2fanin\boxed{ Var(w) \approx \frac{2}{fan_{in}} }

이 나온다.

즉:

ReLU가 Signal 일부를 0으로 없애므로, 그 손실을 보상하기 위해 Xavier보다 Weight Scale을 더 크게 잡을 수 있다.


17. Zero-centered 가정은 어디에 필요한가?

"ReLU가 대략 절반을 0으로 만든다"는 말은 아무 분포에서나 성립하는 것이 아니다.

Pre-activation zz가:

0을 중심으로 대략 대칭적인 분포

라고 가정해야 한다.

이 유도와 잘 맞도록 Weight를 보통 평균 0의 대칭적인 Normal / Uniform Distribution에서 초기화한다.

즉 흐름은:

Weight Distribution이 Zero-centered
↓
Pre-activation z도 0 주변 대칭이라고 가정
↓
z의 절반 정도가 음수
↓
ReLU가 그 절반을 0으로 만듦
↓
Signal 감소
↓
Weight Variance를 키워 보상

18. 왜 Kaiming은 fan_in만 쓰는가?

여기서 내가 가장 헷갈렸던 질문:

Xavier는 fan_in과 fan_out을 같이 보는데, 왜 Kaiming은 fan_in만 쓰는가?

정확히는:

Kaiming이 fan_in만 쓸 수 있는 것은 아니다.

Forward Scale을 유지하려면:

Var(w)≈2fanin\boxed{ Var(w) \approx \frac{2}{fan_{in}} }

을 사용한다.

Backward Gradient Scale을 유지하려면:

Var(w)≈2fanout\boxed{ Var(w) \approx \frac{2}{fan_{out}} }

을 사용할 수 있다.

PyTorch에서도:

nn.init.kaiming_normal_(
    weight,
    mode="fan_in",
    nonlinearity="relu"
)

또는:

nn.init.kaiming_normal_(
    weight,
    mode="fan_out",
    nonlinearity="relu"
)

가 가능하다.


19. 왜 둘 중 하나를 선택해야 하는가?

Forward를 정확히 유지하려는 조건과 Backward를 정확히 유지하려는 조건이 일반적으로 다르기 때문이다.

예를 들어:

fanin=100fan_{in}=100
fanout=50fan_{out}=50

이라면:

Forward 기준:

Var(w)=2100=0.02Var(w)=\frac{2}{100}=0.02

Backward 기준:

Var(w)=250=0.04Var(w)=\frac{2}{50}=0.04

이다.

하나의 Weight Tensor는 하나의 초기 분산만 가질 수 있으므로:

0.020.02

와

0.040.04

를 동시에 정확히 만족할 수 없다.

그래서:

fan_in
→ Forward Activation Scale 유지 우선

fan_out
→ Backward Gradient Scale 유지 우선

중 하나를 선택할 수 있다.


20. Xavier와 Kaiming의 관점 차이

📌 Xavier

Forward와 Backward의 요구 조건 사이에서 절충한다.

Var(w)=2fanin+fanoutVar(w) = \frac{2} {fan_{in}+fan_{out}}

📌 Kaiming

ReLU의 Signal / Gradient gating 특성을 고려한 뒤 한 방향의 Scale 보존을 우선한다.

대표적으로 Forward를 우선하면:

Var(w)=2faninVar(w) = \frac{2}{fan_{in}}

을 사용한다.

💡 Kaiming이 "Forward만 중요해서" fan_in을 쓰는 것이 아니라,
fan_in과 fan_out 조건을 동시에 정확히 만족할 수 없기 때문에 어떤 방향을 우선할지 선택하는 것이다.


21. Xavier와 Kaiming은 언제 사용하는가?

큰 기준으로는 다음처럼 기억하면 된다.

Activation대표 초기화
LinearXavier
tanhXavier
Sigmoid 계열Xavier 계열을 고려
ReLUKaiming
LeakyReLUKaiming

핵심 차이는 ReLU의 특성이다.

ReLU는:

음수 Activation → 0
음수 영역 Gradient → 0

으로 Signal 전달 특성을 바꾸므로 이를 초기화에 반영한 것이 Kaiming이다.

🚨 단, "ReLU가 아니면 무조건 Xavier"라고 외우면 안 된다.
GELU, SiLU 등 현대 Activation은 구조와 구현에 따라 다른 초기화 전략을 사용할 수 있다.


22. Xavier vs Kaiming 핵심 비교

항목XavierKaiming
핵심 목적Forward/Backward Scale 절충ReLU 특성을 반영한 Scale 유지
대표 ActivationLinear, tanhReLU, LeakyReLU
대표 Variance2fanin+fanout\frac{2}{fan_{in}+fan_{out}}2fanin\frac{2}{fan_{in}}
Forward 우선절충fan_in
Backward 우선절충fan_out 선택 가능
핵심 아이디어양방향 균형ReLU가 제거하는 Signal 보상

23. 지금까지 전체 학습 흐름

📌 1단계 — Gradient

미분
↓
현재 Parameter에서 Loss의 변화율
↓
Gradient
↓
Gradient 반대 방향으로 이동
θ←θ−η∇L\theta \leftarrow \theta-\eta\nabla L

📌 2단계 — GD / SGD / Mini-batch

Batch GD
→ 전체 데이터의 Gradient

Pure SGD
→ 데이터 1개의 Gradient

Mini-batch SGD
→ 일부 데이터의 평균 Gradient

Mini-batch는 계산 효율과 Gradient 안정성 사이의 균형을 잡는다.


📌 3단계 — Gradient Variance

Batch Size ↑
↓
Gradient 평균에 포함되는 Sample 수 ↑
↓
Gradient Noise ↓
↓
Gradient Variance ↓
Var(gB)∝1BVar(g_B) \propto \frac1B

📌 4단계 — Momentum

Mini-batch Gradient는 여전히 noisy
↓
현재 Gradient만 보면 지그재그 이동
↓
과거 이동 방향을 기억하자
↓
Momentum
vt=βvt−1+gtv_t = \beta v_{t-1}+g_t
θt+1=θt−ηvt\theta_{t+1} = \theta_t-\eta v_t

결과:

Oscillation 감소
+
일관된 방향 가속

📌 5단계 — 초기화

Zero / Constant
↓
Symmetry 문제

Random Initialization
↓
Symmetry 해결

하지만 Weight Scale은?
↓
Activation / Gradient Scale 문제

📌 6단계 — 분산 유지

Var(z)≈faninVar(w)Var(x)Var(z) \approx fan_{in}Var(w)Var(x)

fan-in이 커질수록 여러 wixiw_ix_i 항의 분산이 누적되므로 Weight Scale을 적절하게 줄일 필요가 있다.

목표는:

Weight Variance를 작게 만드는 것 ❌

Layer 간 Activation / Gradient Scale을
안정적으로 유지하는 것 ✅

이다.


📌 7단계 — Xavier

Forward 안정성
+
Backward 안정성
↓
둘 사이의 절충
Var(w)=2fanin+fanoutVar(w) = \frac{2} {fan_{in}+fan_{out}}

📌 8단계 — Kaiming

ReLU 사용
↓
음수 Signal / Gradient 제거
↓
Signal Scale 감소
↓
Weight Scale을 키워 보정

Forward 기준:

Var(w)=2faninVar(w) = \frac{2}{fan_{in}}

Backward 기준:

Var(w)=2fanoutVar(w) = \frac{2}{fan_{out}}

24. 오늘의 핵심 질문과 답

📌 Q. Momentum은 수식만 알면 되는가?

아니다.

기하학적으로:

가파른 방향의 Oscillation을 줄이고, 일관된 방향의 이동을 가속한다

는 의미를 이해해야 한다.


📌 Q. Kaiming에서 Weight 절반이 0이 되는가?

아니다.

ReLU에 의해 Pre-activation / Activation의 음수 절반 정도가 0이 된다.

Weight 자체의 절반이 0이 되는 것이 아니다.


📌 Q. 초기화의 목적은 Variance를 0으로 만드는 것인가?

아니다.

Layer를 지나도 Activation / Gradient Scale이 안정적으로 유지되도록 적절한 Weight Variance를 정하는 것이 목적이다.


📌 Q. Xavier와 Kaiming의 가장 큰 차이는?

Xavier:

Forward와 Backward Scale의 절충

Kaiming:

ReLU의 gating 특성을 고려해 Forward 또는 Backward Scale 보존을 우선


📌 Q. ReLU에서는 왜 Weight를 더 크게 잡는가?

ReLU가 음수 Signal을 0으로 만들어 Signal의 Second Moment를 줄이기 때문이다.

이를 보정하기 위해:

Var(w)≈2faninVar(w) \approx \frac{2}{fan_{in}}

처럼 Weight Scale을 키운다.


25. 최종 핵심 정리

Optimization에서는 Gradient를 어떻게 더 안정적이고 효율적으로 사용할지를 고민한다.
GD → SGD → Mini-batch → Momentum으로 갈수록 계산 효율과 Gradient Noise를 다루는 방식이 발전한다.

Initialization에서는 학습 시작 시 Signal이 어떻게 안정적으로 전달되게 만들지를 고민한다.
Random Initialization → Xavier → Kaiming으로 갈수록 Layer 구조와 Activation Function의 특성까지 초기 Weight Scale에 반영한다.

결국 두 흐름 모두 같은 목표를 가진다.

Gradient와 Activation이 지나치게 폭발하거나 사라지지 않도록 만들어, 신경망이 안정적으로 학습될 수 있게 하는 것.

profile
매일 꾸준히

0개의 댓글