오늘의 핵심
오늘은 어제까지 공부한 GD → SGD → Mini-batch SGD 흐름에서 이어서 Momentum을 공부했고,
초기화에서는 Zero / Constant / Random → Xavier → Kaiming으로 이어지는 이유를 정리했다.특히 오늘은 단순히 공식을 외우기보다,
- 왜 Momentum이 필요한지
- Momentum을 기하학적으로 어떻게 이해해야 하는지
- Xavier와 Kaiming의 차이가 왜 생기는지
- ReLU의 어떤 특성이 Kaiming을 필요하게 만드는지
- 초기화의 목표가 왜
Var(W)자체가 아니라 activation / gradient scale 유지인지를 연결해서 이해하는 데 집중했다.
Gradient Descent는 현재 Parameter에서 Loss가 가장 빠르게 증가하는 방향의 반대쪽으로 이동하는 방법이다.
여기서:
Gradient는 단순히 "얼마나 움직여라"는 값이 아니라,
현재 위치에서 Loss가 어느 방향으로, 얼마나 가파르게 증가하는지
를 나타낸다.
Learning Rate는 그 방향으로 실제로 얼마나 이동할지 결정한다.
전체 데이터가 개라면:
이고 전체 Gradient는:
이다.
즉:
전체 데이터
↓
평균 Loss
↓
전체 데이터 기준 Gradient
↓
Parameter 1회 Update
SGD는 데이터 하나를 사용해 Gradient를 계산하고 바로 Parameter를 업데이트한다.
즉:
데이터 1개
↓
Loss
↓
Gradient
↓
바로 Update
전체 Gradient를 정확히 계산하지 않고 하나의 Sample Gradient로 추정하므로 빠르지만 Gradient가 많이 흔들릴 수 있다.
실제 딥러닝에서는 Pure SGD보다 Mini-batch를 가장 많이 사용한다.
Batch Size가 라면:
이고:
이다.
즉:
각 데이터의 Loss를 계산한 뒤 평균 Loss를 만들고, 그 평균 Loss를 Backward하면 결과적으로 각 데이터 Gradient의 평균을 얻는다.
Mini-batch Gradient를:
라고 하자.
각 Sample Gradient가 서로 어느 정도 독립이라고 단순하게 가정하면:
따라서:
이다.
즉:
Batch Size ↑
↓
더 많은 Sample Gradient를 평균
↓
개별 데이터 때문에 튀는 영향 감소
↓
Gradient Variance ↓
↓
전체 Gradient에 가까운 안정적인 추정
💡 여기서 분산은 "입력 데이터 값의 분산"이 아니라,
Mini-batch를 다르게 뽑았을 때 Gradient 추정값이 얼마나 흔들리는가를 의미한다.
Mini-batch SGD는 Gradient가 noisy하다.
예를 들어 Loss Surface가 길고 좁은 골짜기 형태라면 SGD는:
↘
↙
↘
↙
↘
처럼 가파른 방향으로 계속 지그재그 진동할 수 있다.
이때 자연스럽게 다음 질문이 생긴다.
현재 Gradient만 보지 말고, 이전에 이동하던 방향도 기억하면 더 안정적으로 움직일 수 있지 않을까?
이 아이디어가 Momentum이다.
가장 기본적인 Momentum 형태는:
이다.
여기서:
보통 정도를 많이 사용한다.
SGD:
현재 Gradient만 사용
Momentum:
현재 Gradient
+
과거에 계속 가던 방향
↓
새로운 Update 방향
즉 Momentum은 물리적인 관성과 비슷한 직관을 가진다.
Momentum에서 가장 중요한 기하학적 이해는 다음과 같다.
Loss Surface가 한쪽 방향으로는 가파르고, 다른 방향으로는 완만하다고 하자.
SGD는 가파른 방향의 Gradient 부호가 계속 바뀌면서:
왼쪽 ↔ 오른쪽
왼쪽 ↔ 오른쪽
으로 진동할 수 있다.
반면 실제 Minimum을 향하는 방향의 Gradient는 여러 Step 동안 비슷한 방향을 유지할 수 있다.
Momentum에서는:
계속 방향이 바뀌는 Gradient
→ 서로 상쇄
→ Oscillation 감소
계속 같은 방향으로 나오는 Gradient
→ Velocity에 누적
→ 이동 가속
이 발생한다.
🎯 Momentum의 핵심은 가파른 축의 불필요한 진동은 줄이고, 일관된 진행 방향은 가속하는 것이다.
를 계속 펼치면:
가 된다.
즉:
현재 Gradient → 가중치 1
1 Step 전 Gradient → 가중치 β
2 Step 전 Gradient → 가중치 β²
3 Step 전 Gradient → 가중치 β³
과거 Gradient일수록 영향력이 지수적으로 감소한다.
따라서 Momentum은 본질적으로:
과거 Gradient의 지수적으로 감소하는 가중 누적
이라고 볼 수 있다.
Learning Rate:
는 Update의 전체 Scale을 조절한다.
Momentum:
는 과거 방향 정보를 이용해 Update 방향을 Smooth하게 만들고 일관된 방향을 가속한다.
둘의 역할은 다르다.
초기화에서 가장 먼저 배운 핵심은 두 가지였다.
1. Weight들이 서로 다른 값을 가져야 한다.
2. Weight의 Scale이 적절해야 한다.
모든 Weight를 동일하게 초기화하면:
같은 Weight
↓
같은 Activation
↓
같은 Gradient
↓
같은 Update
↓
같은 Feature 학습
이 발생할 수 있다.
이를 Symmetry Problem이라고 한다.
따라서 Hidden Layer의 Weight 전체를 같은 값으로 초기화하는 것은 좋지 않다.
Uniform / Normal Distribution에서 Weight를 랜덤하게 뽑으면 각 뉴런이 서로 다른 Weight로 시작할 수 있다.
즉 Symmetry는 깨진다.
하지만 새로운 문제가 생긴다.
Random하게 뽑기는 했는데, 얼마나 큰 값으로 뽑아야 하는가?
한 뉴런의 Pre-activation을:
라고 하자.
여기서:
일반적으로:
이다.
초기화 이론에서는 단순화를 위해:
등을 가정한다.
그러면:
이고 더 단순화하면:
가 된다.
초기화의 목표는:
Var(W)를 최대한 작게 만들기 ❌
가 아니다.
목표는:
Layer를 지나도 Activation과 Gradient의 Scale이 너무 커지거나 작아지지 않도록 유지하는 것
이다.
즉 대략:
와 같은 상태를 좋은 출발점으로 만들고 싶은 것이다.
Weight Variance를 조절하는 것은 이 목표를 달성하기 위한 수단이다.
중요한 성질:
이다.
따라서 Weight 전체 Scale을 절반으로 줄이면:
가 된다.
즉:
Weight 값을 동일한 비율로 작게 만들면 Weight 분포의 분산도 자연스럽게 작아진다.
그래서 fan-in이 많을수록 각 의 분산이 많이 더해지므로 Weight Scale을 줄일 필요가 있다.
Xavier는 Forward와 Backward에서 Signal / Gradient Scale을 동시에 고려한다.
Forward 관점에서:
정도가 필요하다.
Backward 관점에서는:
정도가 필요하다.
하지만 일반적으로:
이므로 두 조건을 동시에 정확히 만족하기 어렵다.
Xavier는 둘 사이를 절충해:
을 사용한다.
Forward Activation Scale
↘
적절한 Weight Variance
↗
Backward Gradient Scale
즉:
Forward와 Backward 모두 한쪽으로 크게 망가지지 않도록 중간 지점을 잡는 초기화
라고 볼 수 있다.
아니다.
Xavier는:
학습 시작 시 Activation과 Gradient Scale이 폭발하거나 소실되지 않도록 좋은 초기 조건을 만드는 방법
이다.
학습이 시작되면:
에 의해 Weight가 계속 바뀌므로 Xavier가 처음 만든 분포가 그대로 유지되지는 않는다.
또 독립성, 평균 0 등 여러 가정이 사용되므로 실제 네트워크에서 분산이 정확히 보존되는 것도 아니다.
Xavier를 이해한 다음 ReLU를 생각하면 새로운 문제가 생긴다.
ReLU:
는 음수 입력을 모두 0으로 만든다.
가 0을 중심으로 대칭적인 분포라고 가정하면:
z > 0 → 그대로 통과
z < 0 → 0
이므로 대략 절반의 Activation이 0이 된다.
🚨 여기서 0이 되는 것은 Weight의 절반이 아니라 Pre-activation / Activation의 음수 절반이다.
Kaiming 관점에서 ReLU의 중요한 특성은 두 가지다.
에서 음수 Signal이 0이 된다.
0 중심 대칭 분포라는 가정 아래:
즉 Signal의 Second Moment가 대략 절반으로 감소한다.
ReLU의 미분은:
이다.
따라서 음수 영역에서는 Gradient 역시 0이 된다.
즉 ReLU는:
Forward
→ 음수 Activation 제거
Backward
→ 해당 위치 Gradient 제거
라는 특성을 가진다.
ReLU 때문에 Forward Signal이 대략 절반 줄어든다고 생각하면:
이다.
우리는 입력과 비슷한 Scale을 유지하고 싶으므로:
라고 둔다.
를 약분하면:
따라서:
이 나온다.
즉:
ReLU가 Signal 일부를 0으로 없애므로, 그 손실을 보상하기 위해 Xavier보다 Weight Scale을 더 크게 잡을 수 있다.
"ReLU가 대략 절반을 0으로 만든다"는 말은 아무 분포에서나 성립하는 것이 아니다.
Pre-activation 가:
0을 중심으로 대략 대칭적인 분포
라고 가정해야 한다.
이 유도와 잘 맞도록 Weight를 보통 평균 0의 대칭적인 Normal / Uniform Distribution에서 초기화한다.
즉 흐름은:
Weight Distribution이 Zero-centered
↓
Pre-activation z도 0 주변 대칭이라고 가정
↓
z의 절반 정도가 음수
↓
ReLU가 그 절반을 0으로 만듦
↓
Signal 감소
↓
Weight Variance를 키워 보상
여기서 내가 가장 헷갈렸던 질문:
Xavier는 fan_in과 fan_out을 같이 보는데, 왜 Kaiming은 fan_in만 쓰는가?
정확히는:
Kaiming이 fan_in만 쓸 수 있는 것은 아니다.
Forward Scale을 유지하려면:
을 사용한다.
Backward Gradient Scale을 유지하려면:
을 사용할 수 있다.
PyTorch에서도:
nn.init.kaiming_normal_(
weight,
mode="fan_in",
nonlinearity="relu"
)
또는:
nn.init.kaiming_normal_(
weight,
mode="fan_out",
nonlinearity="relu"
)
가 가능하다.
Forward를 정확히 유지하려는 조건과 Backward를 정확히 유지하려는 조건이 일반적으로 다르기 때문이다.
예를 들어:
이라면:
Forward 기준:
Backward 기준:
이다.
하나의 Weight Tensor는 하나의 초기 분산만 가질 수 있으므로:
와
를 동시에 정확히 만족할 수 없다.
그래서:
fan_in
→ Forward Activation Scale 유지 우선
fan_out
→ Backward Gradient Scale 유지 우선
중 하나를 선택할 수 있다.
Forward와 Backward의 요구 조건 사이에서 절충한다.
ReLU의 Signal / Gradient gating 특성을 고려한 뒤 한 방향의 Scale 보존을 우선한다.
대표적으로 Forward를 우선하면:
을 사용한다.
💡 Kaiming이 "Forward만 중요해서" fan_in을 쓰는 것이 아니라,
fan_in과 fan_out 조건을 동시에 정확히 만족할 수 없기 때문에 어떤 방향을 우선할지 선택하는 것이다.
큰 기준으로는 다음처럼 기억하면 된다.
| Activation | 대표 초기화 |
|---|---|
| Linear | Xavier |
| tanh | Xavier |
| Sigmoid 계열 | Xavier 계열을 고려 |
| ReLU | Kaiming |
| LeakyReLU | Kaiming |
핵심 차이는 ReLU의 특성이다.
ReLU는:
음수 Activation → 0
음수 영역 Gradient → 0
으로 Signal 전달 특성을 바꾸므로 이를 초기화에 반영한 것이 Kaiming이다.
🚨 단, "ReLU가 아니면 무조건 Xavier"라고 외우면 안 된다.
GELU, SiLU 등 현대 Activation은 구조와 구현에 따라 다른 초기화 전략을 사용할 수 있다.
| 항목 | Xavier | Kaiming |
|---|---|---|
| 핵심 목적 | Forward/Backward Scale 절충 | ReLU 특성을 반영한 Scale 유지 |
| 대표 Activation | Linear, tanh | ReLU, LeakyReLU |
| 대표 Variance | ||
| Forward 우선 | 절충 | fan_in |
| Backward 우선 | 절충 | fan_out 선택 가능 |
| 핵심 아이디어 | 양방향 균형 | ReLU가 제거하는 Signal 보상 |
미분
↓
현재 Parameter에서 Loss의 변화율
↓
Gradient
↓
Gradient 반대 방향으로 이동
Batch GD
→ 전체 데이터의 Gradient
Pure SGD
→ 데이터 1개의 Gradient
Mini-batch SGD
→ 일부 데이터의 평균 Gradient
Mini-batch는 계산 효율과 Gradient 안정성 사이의 균형을 잡는다.
Batch Size ↑
↓
Gradient 평균에 포함되는 Sample 수 ↑
↓
Gradient Noise ↓
↓
Gradient Variance ↓
Mini-batch Gradient는 여전히 noisy
↓
현재 Gradient만 보면 지그재그 이동
↓
과거 이동 방향을 기억하자
↓
Momentum
결과:
Oscillation 감소
+
일관된 방향 가속
Zero / Constant
↓
Symmetry 문제
Random Initialization
↓
Symmetry 해결
하지만 Weight Scale은?
↓
Activation / Gradient Scale 문제
fan-in이 커질수록 여러 항의 분산이 누적되므로 Weight Scale을 적절하게 줄일 필요가 있다.
목표는:
Weight Variance를 작게 만드는 것 ❌
Layer 간 Activation / Gradient Scale을
안정적으로 유지하는 것 ✅
이다.
Forward 안정성
+
Backward 안정성
↓
둘 사이의 절충
ReLU 사용
↓
음수 Signal / Gradient 제거
↓
Signal Scale 감소
↓
Weight Scale을 키워 보정
Forward 기준:
Backward 기준:
아니다.
기하학적으로:
가파른 방향의 Oscillation을 줄이고, 일관된 방향의 이동을 가속한다
는 의미를 이해해야 한다.
아니다.
ReLU에 의해 Pre-activation / Activation의 음수 절반 정도가 0이 된다.
Weight 자체의 절반이 0이 되는 것이 아니다.
아니다.
Layer를 지나도 Activation / Gradient Scale이 안정적으로 유지되도록 적절한 Weight Variance를 정하는 것이 목적이다.
Xavier:
Forward와 Backward Scale의 절충
Kaiming:
ReLU의 gating 특성을 고려해 Forward 또는 Backward Scale 보존을 우선
ReLU가 음수 Signal을 0으로 만들어 Signal의 Second Moment를 줄이기 때문이다.
이를 보정하기 위해:
처럼 Weight Scale을 키운다.
Optimization에서는 Gradient를 어떻게 더 안정적이고 효율적으로 사용할지를 고민한다.
GD → SGD → Mini-batch → Momentum으로 갈수록 계산 효율과 Gradient Noise를 다루는 방식이 발전한다.Initialization에서는 학습 시작 시 Signal이 어떻게 안정적으로 전달되게 만들지를 고민한다.
Random Initialization → Xavier → Kaiming으로 갈수록 Layer 구조와 Activation Function의 특성까지 초기 Weight Scale에 반영한다.결국 두 흐름 모두 같은 목표를 가진다.
Gradient와 Activation이 지나치게 폭발하거나 사라지지 않도록 만들어, 신경망이 안정적으로 학습될 수 있게 하는 것.