본문 바로가기

ML-DL/Base

KL Divergence [Kullback-Leibler Divergence]

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 를 최소화 하는 것과 같다.