Entropy, Cross-Entropy, KL Divergence

Entropy는 Cross Entropy Loss라는 이름으로 Deep Learning에서 분류 모델을 하는 이에게는 꽤나 익숙한 함수이다. 식으로는 다음과 같이 쓴다.

$$-{1 \over n}\sum\limits^n_{i=1}\sum\limits^c_{c=1}L_{ic}log(P_{ic})$$

  • $n$ = 데이터 갯수
  • $C$ = 범주 갯수
  • $L$ = 실제 값 (주로 0 또는 1)
  • $P$ = 실제 값에 대한 확률 값 (0~1)

Entropy는 불확실성을 계산하기 위한 Metric이다. 어떤 바구니가 있다고 하고 안에 붉은 공만 있다고 하자. 이러면 공을 꺼내면 항상 붉은 색만 나올테니, 이럴 때는 불확실성이 존재하지 않는다. 이 때 Entropy는 0이다.

일상 문제로 가져와서 생각해보면 이런 경우는 존재하지 않을 때가 더 많다. 앞서 언급한 분류문제를 기반으로 생각해본다면 분류를 하는 것자체가 데이터가 섞여있는 것을 의미하기 때문에 더더욱 그렇다. 엔트로피의 식은 다음과 같다. $$H(q) = -\sum_{c=1}^{C} q(y_c)log(q(y_c))$$ 이 식을 활용해서 분포간의 차이를 보는 것이 Cross Entropy이다. 실제 분포가 $q$가 있고, 우리가 모델로서 만드는 분포 $p$의  있을 때 특정 실제 값 $(y_c)$와 입력한 값 $p(y_c)$간  차이를 보는 것이다.
$$H_p(q) = -\sum_{c=1}^{C} q(y_c)log(p(y_c))$$ Python으로 구현하면 이렇게 쓸 수 있겠다.

import numpy as np
def CrossEntropy(Q, P):
Q = np.float_(Q)
P = np.float_(P)
return -np.sum(Y*np.log(P) + (1-Q)*np.log(1-P))

여기서 확장해서 "차이"들을 모두 Sum해서 이 두 분포간의 전체적인 차이를 보는 것이 바로 Kullback-Leibler Divergence이다. 식은 다음과 같고 이산형 분포를 감안하여 식을 썼지만 $\int$를 쓰면 연속 분포에서도 가능할 것이다.

$$D_{KL}(q||p) = -\sum_{c=1}^{C} q(y_c) [log(p(y_c)) - log(q(y_c))] = H_p(q) - H(q)$$ Entropy부터 Kullback-Leibler Divergence까지 연관성에 대해서 대략 정리해보았다.