오늘의 핵심
오늘은 단순히 개념을 외우는 수준보다, 왜 이런 식이 나오는지 수식적으로 연결하는 것에 집중했다.
흐름은 크게 다음과 같다.
BCE → Mini-batch Gradient → 분산 → Xavier Initialization → Entropy → Cross Entropy → KL Divergence → Mutual Information
1. Binary Cross Entropy는 무엇을 보는가?
📌 Binary Classification의 출력
Binary Classification에서 실제 정답은 보통
y∈{0,1}
이다.
예를 들어 스팸 분류라면:
y=1 : 스팸
y=0 : 스팸 아님
하지만 모델은 바로 0 또는 1을 출력하는 것이 아니라, 보통
p=P(y=1∣x)
즉 입력 x가 class 1일 확률을 예측한다.
예를 들어:
p = 0.8
이면 모델은 해당 입력이 class 1일 확률을 80%로 보고 있다는 뜻이다.
최종 class는 필요하다면 threshold를 적용해 결정한다.
p >= 0.5 → class 1
p < 0.5 → class 0
📌 BCE의 목적
Binary Cross Entropy는
실제 정답 y∈{0,1}과 모델이 예측한 확률 p∈[0,1]이 얼마나 잘 맞는지
를 측정하는 Loss다.
수식은 다음과 같다.
L=−[ylogp+(1−y)log(1−p)]
여기서:
y : 실제 정답
p : 모델이 예측한 class 1의 확률
정답이 1이면:
L=−logp
정답이 0이면:
L=−log(1−p)
따라서 모델이 정답 클래스에 높은 확률을 줄수록 Loss가 작아진다.
2. Cross Entropy에서 BCE로 내려오기
일반적인 Cross Entropy는
L=−k=1∑Kyklogpk
이다.
Binary Classification은 class가 두 개뿐이므로 K=2라고 생각하면 된다.
class 1의 확률을 p라고 하면 class 0의 확률은
1−p
이고, 정답도 하나의 binary 값 y로 표현하면
y1=y,y0=1−y
가 된다.
따라서 그대로 대입하면
L=−[ylogp+(1−y)log(1−p)]
즉 BCE가 나온다.
💡 BCE는 Cross Entropy를 Binary Classification에 맞게 표현한 형태라고 볼 수 있다.
3. 왜 마지막 Activation으로 Sigmoid를 사용하는가?
📌 Linear 출력은 확률이 아니다
마지막 Linear Layer는 보통
z=Wx+b
를 출력한다.
이때 z의 범위는
−∞<z<∞
이므로 그대로는 확률로 해석할 수 없다.
Sigmoid는
σ(z)=1+e−z1
이고 출력 범위는
0<σ(z)<1
이다.
즉:
Linear
↓
logit z
↓
Sigmoid
↓
class 1일 확률 p
↓
BCELoss
의 흐름이 만들어진다.
📌 왜 ReLU는 마지막 Activation으로 부적절한가?
ReLU는
ReLU(z)=max(0,z)
이고 출력 범위는
[0,∞)
이다.
하지만 BCE에서 p는 확률이므로
0≤p≤1
이어야 한다.
따라서 2, 10 같은 값도 출력할 수 있는 ReLU는 BCE 앞의 최종 Activation으로 부적절하다.
🎯 BCE가 원하는 것은 class 1의 확률이고, ReLU는 확률 범위를 보장하지 않는다.
4. BCELoss와 BCEWithLogitsLoss
📌 BCELoss
BCELoss는 이미 확률로 변환된 값을 입력으로 받는다.
model = nn.Sequential(
nn.Linear(...,1),
nn.Sigmoid())
criterion = nn.BCELoss()
즉:
logit
↓
Sigmoid
↓
probability
↓
BCELoss
이다.
📌 BCEWithLogitsLoss
PyTorch에서는 보통 다음 형태를 더 많이 사용한다.
model = nn.Linear(...,1)
criterion = nn.BCEWithLogitsLoss()
이 경우 마지막에 Sigmoid()를 직접 붙이지 않는다.
BCEWithLogitsLoss가 내부적으로 Sigmoid + BCE를 수치적으로 더 안정적인 방식으로 계산하기 때문이다.
🚨 BCEWithLogitsLoss를 사용할 때 마지막에 Sigmoid를 중복해서 넣으면 안 된다.
5. Mini-batch Gradient Descent
📌 GD와 SGD 복습
전체 데이터가 N개라고 하자.
전체 Loss는
L(θ)=N1i=1∑NLi(θ)
이다.
여기서:
θ : 모델의 모든 Parameter
Li : i번째 데이터의 Loss
Batch Gradient Descent는 전체 데이터를 사용한다.
g=∇θL=N1i=1∑N∇θLi
Pure SGD는 데이터 하나만 사용한다.
gi=∇θLi
📌 Mini-batch는 둘의 중간
Batch Size가 B라면
LB=B1i∈B∑Li
를 계산한다.
그리고
gB=∇θLB
를 사용한다.
미분은 선형이므로
∇θ(B1i∈B∑Li)=B1i∈B∑∇θLi
이다.
각 데이터의 Gradient를 직접 하나씩 구해서 평균내는 것과, 평균 Loss를 한 번 Backward 하는 것은 같은 결과를 준다.
6. PyTorch에서는 평균 Loss를 통해 Gradient 평균이 만들어진다
PyTorch의 많은 Loss 함수는 기본적으로
reduction="mean"
을 사용한다.
예를 들어:
criterion = nn.MSELoss()
loss = criterion(y_hat, y)
loss.backward()
이면:
각 데이터 Loss 계산
↓
Batch 평균 Loss
↓
Backward
↓
결과적으로 Batch Gradient의 평균
이 만들어진다.
7. Batch Size와 Gradient Variance
Mini-batch Gradient를
gB=B1i=1∑Bgi
라고 하자.
각 데이터의 Gradient가 서로 어느 정도 독립이라고 단순하게 가정하면
Var(gB)≈BVar(gi)
이므로
Var(gB)∝B1
이다.
즉:
Batch Size ↑
↓
더 많은 Gradient를 평균
↓
개별 데이터 때문에 튀는 정도 감소
↓
Gradient Variance ↓
💡 여기서 분산은 Mini-batch를 다르게 뽑았을 때 Gradient 추정값이 얼마나 흔들리는가를 의미한다.
8. Mini-batch의 분산과 초기화의 분산은 다른 이야기다
Mini-batch에서는
gB=Bg1+⋯+gB
처럼 평균을 낸다.
반면 초기화에서는 다음 Layer의 Pre-activation이
z=w1x1+w2x2+⋯+wnxn
처럼 여러 값을 합한다.
여기서:
xi : 이전 Layer의 Activation
wi : Weight
n : Input Feature 수, 즉 fan-in
z : Activation Function을 통과하기 전 값
9. 분산(Variance)이란?
분산은 값 자체가 크냐 작냐가 아니라
값들이 자신의 평균 주변에서 얼마나 퍼져 있는가
를 나타낸다.
Var(X)=E[(X−E[X])2]
예를 들어:
[1000, 1000, 1000]
은 값은 크지만 모두 같으므로 분산은 0이다.
반면:
[-1000, 0, 1000]
은 평균 주변에서 크게 퍼져 있으므로 분산이 크다.
📌 Scale과 분산
중요한 성질은
Var(aX)=a2Var(X)
이다.
즉 Weight 전체의 Scale을 줄이면 Weight 분포의 분산도 자연스럽게 줄어든다.
10. 초기화에서 왜 fan-in이 커지면 Weight를 작게 해야 하는가?
다음 식을 생각하자.
z=i=1∑nwixi
일반적으로는
Var(z)=i∑Var(wixi)+2i<j∑Cov(wixi,wjxj)
이다.
초기화 이론에서는 단순화를 위해 다음과 같은 가정을 둔다.
Weight들이 서로 독립
입력 Activation들도 대략 비상관
평균이 0에 가까움
wi와 xi가 독립
그러면 Covariance 항을 무시할 수 있고
Var(z)≈i∑Var(wixi)
가 된다.
또한
Var(wixi)≈Var(wi)Var(xi)
라고 두면
Var(z)≈nVar(w)Var(x)
가 된다.
즉:
fan-in n ↑
↓
더 많은 w_i x_i 항의 분산이 더해짐
↓
Var(z) ↑ 가능
↓
Weight Scale / Var(w)를 줄일 필요가 있음
11. 좋은 초기화의 핵심
좋은 초기화에는 두 가지 목표가 있다.
📌 1. Symmetry Breaking
모든 Weight가 동일하면 뉴런들이 같은 Feature를 학습할 수 있다.
따라서 Weight들이 서로 다른 값을 가져야 한다.
📌 2. 적절한 Scale
Weight가 너무 크면 Activation과 Gradient가 불안정해질 수 있고, 너무 작으면 Signal이 지나치게 작아질 수 있다.
🎯 좋은 초기화 = 서로 다른 Weight + 적절한 Weight Scale
12. Xavier Initialization
📌 Forward 관점
Forward에서
Var(z)≈faninVar(w)Var(x)
이다.
Layer를 지나도 Activation의 분산을 대략 유지하고 싶다면
Var(z)≈Var(x)
를 목표로 둘 수 있다.
따라서
faninVar(w)Var(x)≈Var(x)
이고 Var(x)=0라면
Var(w)≈fanin1
이 된다.
📌 Backward 관점
Backward에서는 대략
Var(δprev)≈fanoutVar(w)Var(δnext)
라고 볼 수 있다.
Gradient의 분산을 유지하려면
Var(w)≈fanout1
이 필요하다.
Forward와 Backward의 요구가 다를 수 있으므로 Xavier는 둘을 절충해
Var(w)=fanin+fanout2
를 사용한다.
13. Xavier Normal
Xavier Normal은
w∼N(0,fanin+fanout2)
이다.
표준편차는
std=fanin+fanout2
이다.
PyTorch:
nn.init.xavier_normal_(model.weight)
14. Xavier Uniform
Uniform Distribution에서
w∼U(−a,a)
이면
Var(w)=3a2
이다.
Xavier의 목표 분산과 맞추면
3a2=fanin+fanout2
이므로
a=fanin+fanout6
이다.
즉
w∼U(−fanin+fanout6,+fanin+fanout6)
이다.
PyTorch:
nn.init.xavier_uniform_(model.weight)
15. Xavier는 학습 내내 분산을 유지하는 방법인가?
아니다.
Xavier는
학습 시작 시 Activation과 Gradient가 너무 커지거나 작아지지 않도록 안정적인 초기 조건을 만들어주는 초기화 방법
이다.
학습이 시작되면
W←W−η∇WL
에 의해 Weight가 계속 바뀐다.
따라서 Xavier가 처음 설정한 분산이 학습 내내 유지된다는 보장은 없다.
또 Xavier의 유도에는 독립성, 평균 0, 비슷한 분산 등의 가정이 들어가므로 실제 네트워크에서 정확히 분산이 보존되는 것도 아니다.
💡 Xavier의 목적은 학습 가능한 좋은 출발점을 만드는 것이다.
16. Entropy — 정보 하나의 정보량
어떤 사건 x가 발생할 확률이 p(x)라고 하자.
그 사건의 정보량(Self-information)은
I(x)=−log2p(x)
로 정의한다.
확률이 높은 사건은 자주 발생하므로 정보량이 작고, 확률이 낮은 사건은 드물기 때문에 정보량이 크다.
예를 들어:
p(x)=21
이면
I(x)=−log221=1 bit
이다.
또
p(x)=81
이면
I(x)=3 bits
이다.
17. 왜 로그 밑이 2인가?
Binary Code 관점에서 정보를 표현한다면 밑이 2인 로그를 사용한다.
I(x)=−log2p(x)
이 경우 단위는 bit이다.
로그 밑을 e로 사용하면 단위는 nat이다.
💡 로그 밑이 2인 이유는 정보가 반드시 이진이라서가 아니라, 이진 부호화 관점에서 정보량의 단위를 bit로 표현하기 위해서다.
18. Entropy
Entropy는 각 사건의 정보량을 확률적으로 평균낸 값이다.
H(X)=−x∑p(x)log2p(x)
또는 기대값으로
H(X)=Ex∼P[−log2p(x)]
라고 쓸 수 있다.
즉:
Entropy는 실제 확률분포 P를 알고 있을 때, 그 분포에서 발생하는 데이터를 표현하는 데 필요한 평균 정보량이다.
정보이론적으로는 긴 symbol sequence를 이상적으로 부호화할 때 얻을 수 있는 최적 평균 부호 길이의 이론적 하한과 연결되는 값이다.
🚨 Entropy와 정확히 같은 길이의 단일 symbol code가 항상 존재한다는 뜻은 아니다. 긴 sequence를 효율적으로 부호화할수록 평균 code length를 Entropy에 가깝게 만들 수 있다.
19. Cross Entropy
실제 데이터 분포를 P라고 하고, 우리가 모델링한 예측 분포를 Q라고 하자.
Cross Entropy는
H(P,Q)=−x∑p(x)log2q(x)
또는
H(P,Q)=Ex∼P[−log2q(x)]
이다.
중요한 점은:
실제 데이터는 P에서 발생
정보량 계산에는 Q를 사용
한다는 것이다.
즉:
실제 데이터가 P를 따르는데, 우리가 Q라는 확률 모델을 사용해 데이터를 표현할 때 필요한 기대 정보량
이라고 볼 수 있다.
20. Entropy와 Cross Entropy의 차이
Entropy:
H(P)=−x∑p(x)log2p(x)
Cross Entropy:
H(P,Q)=−x∑p(x)log2q(x)
즉:
Entropy : 실제 분포 P를 사용
Cross Entropy : 실제 데이터는 P지만 예측 분포 Q를 사용
모델이 실제 분포를 정확히 맞히면
Q=P
이므로
H(P,Q)=H(P)
가 된다.
21. KL Divergence
Cross Entropy와 Entropy의 차이가 KL Divergence다.
DKL(P∥Q)=H(P,Q)−H(P)
이를 풀어쓰면
DKL(P∥Q)=x∑p(x)log2q(x)p(x)
이다.
📌 의미
Entropy H(P)는 실제 분포를 알고 있을 때의 최적 기대 정보량이고,
Cross Entropy H(P,Q)는 Q를 사용했을 때의 기대 정보량이다.
따라서
H(P,Q)−H(P)
는
잘못되거나 불완전한 분포 Q를 사용해서 생기는 추가적인 기대 정보 비용
으로 해석할 수 있다.
즉:
최적 기대 비용 H(P)
+
분포를 잘못 가정해서 생긴 추가 비용 D_KL(P||Q)
=
실제 기대 비용 H(P,Q)
이다.
📌 중요한 성질
DKL(P∥Q)≥0
이고, 두 분포가 같으면
DKL(P∥Q)=0
이다.
하지만 일반적인 거리함수와 달리
DKL(P∥Q)=DKL(Q∥P)
일 수 있다.
즉 KL Divergence는 대칭적이지 않다.
22. Cross Entropy Loss와 KL Divergence의 관계
실제 데이터 분포 P가 고정되어 있다면
H(P)
는 모델 Parameter와 무관한 상수다.
그리고
H(P,Q)=H(P)+DKL(P∥Q)
이므로 Cross Entropy를 최소화하는 것은 결국
DKL(P∥Q)
를 최소화하는 것과 같다.
즉:
Cross Entropy Loss를 줄인다는 것은 모델의 예측 분포 Q를 실제 데이터 분포 P에 가깝게 만드는 것이라고 볼 수 있다.
23. Mutual Information
이제 KL Divergence를 이용해 두 변수 X, Y가 얼마나 서로 의존하는지를 측정할 수 있다.
두 변수가 독립이라면
P(X,Y)=P(X)P(Y)
이다.
따라서 다음 두 분포를 비교하면 된다.
실제 Joint Distribution:
PXY(x,y)
독립이라고 가정했을 때의 분포:
PX(x)PY(y)
이 둘의 차이를 KL Divergence로 측정한 것이 Mutual Information이다.
I(X;Y)=DKL(PXY∥PXPY)
24. Mutual Information의 수식
풀어쓰면
I(X;Y)=x,y∑p(x,y)logp(x)p(y)p(x,y)
이다.
📌 독립이면?
독립이라면
p(x,y)=p(x)p(y)
이므로
p(x)p(y)p(x,y)=1
이고
log1=0
이다.
따라서
I(X;Y)=0
이다.
즉:
Mutual Information이 0이면 두 변수는 독립이다.
📌 의존성이 강하면?
X를 알았을 때 Y에 대한 불확실성이 크게 줄어든다면 Mutual Information이 커진다.
따라서:
Mutual Information은 X와 Y가 서로 공유하는 정보의 양
이라고 해석할 수 있다.
25. Mutual Information과 Entropy의 관계
Mutual Information은 다음과 같이도 쓸 수 있다.
I(X;Y)=H(X)+H(Y)−H(X,Y)
또는
I(X;Y)=H(X)−H(X∣Y)
이며
I(X;Y)=H(Y)−H(Y∣X)
이기도 하다.
여기서 H(X)는 원래 X에 대한 불확실성이고, H(X∣Y)는 Y를 알고 난 뒤에도 남아 있는 X의 불확실성이다.
따라서
H(X)−H(X∣Y)
는
Y를 알게 됨으로써 X에 대한 불확실성이 얼마나 감소했는가
를 나타낸다.
26. 전체 정보이론 흐름
오늘 배운 정보이론 내용은 다음처럼 하나의 흐름으로 연결할 수 있다.
어떤 사건이 얼마나 놀라운가?
↓
Self-Information
I(x) = -log p(x)
↓
그 정보량을 평균내면?
Entropy
H(P) = E[-log P(x)]
↓
실제 분포 P가 아니라
예측 분포 Q를 사용하면?
Cross Entropy
H(P,Q) = E_P[-log Q(x)]
↓
최적 기대 비용과의 차이는?
KL Divergence
D_KL(P||Q) = H(P,Q) - H(P)
↓
두 변수가 독립이라고 가정한 분포와
실제 Joint Distribution의 차이는?
Mutual Information
I(X;Y) = D_KL(P_XY || P_X P_Y)
27. 오늘의 최종 연결
📌 Optimization
GD
→ 전체 데이터 Gradient
SGD
→ 데이터 하나의 Gradient
Mini-batch SGD
→ 일부 데이터의 평균 Gradient
Batch Size가 증가하면
Var(gB)∝B1
이므로 Gradient 추정이 더 안정적이 된다.
📌 Initialization
다음 Layer의 Pre-activation은
z=i∑wixi
이고, 독립성 등의 단순한 가정 아래
Var(z)≈faninVar(w)Var(x)
이다.
따라서 fan-in이 증가하면 Weight 분산을 작게 조절할 필요가 있다.
Xavier는 Forward / Backward를 함께 고려해
Var(w)=fanin+fanout2
을 사용한다.
📌 Information Theory
Self-Information:
I(x)=−log2p(x)
Entropy:
H(P)=EP[−log2P(x)]
Cross Entropy:
H(P,Q)=EP[−log2Q(x)]
KL Divergence:
DKL(P∥Q)=H(P,Q)−H(P)
Mutual Information:
I(X;Y)=DKL(PXY∥PXPY)
즉:
Entropy는 불확실성 / 평균 정보량을, Cross Entropy는 다른 확률모델을 사용했을 때의 기대 비용을, KL Divergence는 그 추가 비용을, Mutual Information은 두 변수가 독립에서 얼마나 벗어나 서로 정보를 공유하는지를 나타낸다.
28. 오늘의 핵심 한 문장
딥러닝의 Loss, Optimization, Initialization은 서로 떨어진 개념이 아니라 확률·미분·분산이라는 수학적 구조로 연결되어 있으며, 정보이론에서는 Entropy → Cross Entropy → KL Divergence → Mutual Information으로 이어지는 하나의 흐름으로 이해할 수 있다.