1. KL Divergence ?
두 확률 분포 간의 차이를 측정하는 함수로, 모델이 예측한 확률 분포와 실제 데이터 분포 간의 차이를 최소화 할 때 사용된다. 예측 분포와 실제 분포의 차이를 정량적으로 평가할 수 있으며 분류 모델에서 손실 함수로 사용 되기도 한다.
KL Divergence 값이 0에 가까울 수록 두 개의 분포가 비슷하다는 것을 의미하며, 크면 클수록 두 분포가 차이가 크기 때문에 정보 손실이 크다고 해석할 수 있다.
2. 수식
이산확률분포 :
$\mathit{D}_{KL}(P\left| \right|Q)=\sum_{i}P(i)\cdot log(\frac{P(i)}{Q(i)})$
$=\sum_{i}P(i)logP(i)-\sum_{i}P(i)logQ(i)$
$=-H(P)+H(P, Q)$
- $P(i)$ 와 $Q(i)$ 는 각각 실제 확률 값과 근사된 확률 값을 의미한다.
- 결국 KL Divergence 는 정보 엔트로피에서 크로스 엔트로피를 뺀 값을 의미한다.
- 다른 용어로 상대 엔트로피 [Relative Entropy] 라고 불린다.
연속확률분포 :
$\mathit{D}_{KL}(P\left| \right|Q)=\int_{-\infty }^{\infty}P(x)\cdot log(\frac{P(x)}{Q(x)})dx$
-> $P(x)$ 와 $Q(x)$ 는 확률 밀도 함수를 의미한다.
import torch
def kl_divergence(P, Q):
# P와 Q가 0인 경우 로그 연산 시 문제가 발생하므로, 작은 값을 추가 (수치적 안정성을 위해 필요)
epsilon = 1e-10
P = P + epsilon
Q = Q + epsilon
# KL Divergence 수식을 적용
kl_div = P * torch.log(P / Q)
# 모든 요소에 대해 합산하여 최종 KL Divergence 계산
return torch.sum(kl_div)
# 예제
P = torch.tensor([0.4, 0.4, 0.2]) # 실제 분포
Q = torch.tensor([0.5, 0.3, 0.2]) # 모델의 예측 분포
# KL Divergence 계산
kl_div = kl_divergence(P, Q)
print("KL Divergence:", kl_div.item())
3. 특징
- 항상 0 이상의 값을 갖고
- 비대칭 [Asymmetric] 하다. $KL(P\left| \right|Q)$ \neq $KL(Q\left| \right|P)$
- KL Divergence 는 두 분포의 거리라고는 할 수 없다. 거리 [Distance] 라고 한다면, Symmetic 해야 하는데 비대칭이기 때문이다.
- Cross-Entropy Loss 는 KL Divergence 에 속하는 형태이며, 실제 분포가 원-핫 벡터일 때 KL-Divergence 를 최소화 하는 것과 같다.
'ML-DL > Base' 카테고리의 다른 글
Massage passing (0) | 2024.11.08 |
---|---|
파라미터와 하이퍼파라미터 차이 (0) | 2024.10.08 |
패딩, 스트라이드, 파라미터 개수 계산, 배치 정규화, 드롭아웃 (0) | 2024.08.20 |
representation, likelyhood, 활성화 함수, 손실함수, optimizer, 배치 사이즈 (0) | 2024.08.15 |