DAY38 - 교차엔트로피, 쿨백 라이블러 발산
교차엔트로피
- 분류 문제의 성능을 평가하는 데에 유용한 지표로 두 확률분포의 교차엔트로피는 다음과 같이 정의합니다.
$$ H[p,q] = - \sum_{k=1}^K p(y_k) \log_2 q(y_k) $$
$$ H[p,q] = -\int_{y} p(y) \log_2 q(y) \,dy $$
교차 엔트로피가 어떻게 분류 문제의 성능을 측정하는 지표가 될 수 있을까요?
Y가 0 또는 1이라는 값만 가지는 이진분류 문제를 예로 생각해보겠습니다.
우선 첫 번째 확률분포인 $p$는 "X가 정해졌을 때 실제 정답인 Y의 확률분포" 입니다. 우리가 가진 데이터에서 이미 특정 $X$값에 따라 $Y$는 정해져있기 때문에 만약 정답이 $ Y = 1 $ 이라면 $p$는 다음과 같아집니다.
$$ p(Y=0) = 0,\ p(Y=1) = 1 $$
만약 또 다른 $X$값에 대해서 정답이 $ Y = 0 $이라면 $p$는 다음과 같아집니다.
$$ p(Y=0) = 1,\ p(Y=1) = 0 $$
그리고 두 번째 확률분포인 $q$는 "X가 정해졌을 때 예측값의 확률분포"입니다. 예측값은 1 또는 0으로만 나오므로 모수가 $\mu$인 베르누이 확률분포라고 할 수 있습니다.
$$ p(Y=0) = 1 - \mu,\ p(Y=1) = \mu $$
이를 종합해보면 $p$와 $q$의 교차엔트로피는 정답이 $Y = 1$일 때는
$$ H[p,q] = - \log_2 \mu $$
정답이 $Y = 0$일 때는
$$ H[p,q] = - \log_2 (1-\mu) $$
가 됩니다.
이를 종합해보면 어떤 임의의 데이터 $X$가 있을 때 $p$와 $q$의 교차엔트로피는
$$ H[p,q] = -(y\log_2 \mu + (1-y)\log_2(1-\mu)) $$
가 되는데 이 값은 정답이 1인 데이터에 대해서는 $\mu$를 높게 잡을 수록, 정답이 0인 데이터에 대해서는 $\mu$를 낮게 잡을수록 작아지는 성질이 있습니다.
따라서 예측을 잘 할 수록 교차엔트로피값이 작아지게 되는 것이고, 교차엔트로피가 분류 예측을 얼마나 잘 하였는가를 나타낼 수 있는 지표가 되는 것입니다.
이를 가지고 있는 데이터 $N$개에 대해 평균을 계산하게되면
$$ -\frac{1}{N} \sum_{i=1}^N y_i\log_2 \mu_i + (1-y_i) \log_2 (1-\mu_i) $$
고 이를 "Log Loss"라고도 합니다.
이진분류가 아니라 카테고리가 더 많이 있을 경우 "categorial log loss"값을 통해 분류 성능을 파악합니다.
$$ \text{categorical log loss} = -\dfrac{1}{N} \sum_{i=1}^N \sum_{k=1}^K \left( \mathbb{I}(y_i=k) \log_2 p(y_i=k) \right) $$
$ \mathbb{I}(y_i = k) $는 $y_i$가 $k$인 경우에만 1이고 그렇지 않으면 0이 되는 지시함수입니다.
파이썬에서는 sklearn.metrics의 log_loss함수로 계산할 수 있습니다.
쿨백 라이블러 발산
- 교차엔트로피를 이용해 두 확률분포의 분포 모양이 얼마나 다른지를 숫자로 계산한 값입니다.
$$ \begin{split} \begin{align} \begin{aligned} KL(p||q) &= H[p,q] - H[p] \\ &= \sum_{i=1}^{K} p(y_i) \log_2 \left(\dfrac{p(y_i)}{q(y_i)}\right) \end{aligned} \end{align} \end{split} $$
$$ \begin{split} \begin{align} \begin{aligned} KL(p || q) &= H[p, q] - H[p] \\ &= \int p(y) \log_2 \left(\dfrac{p(y)}{q(y)}\right) dy \end{aligned} \end{align} \end{split} $$
- 다음과 같은 관계가 성립합니다.
$$ KL(p || q) = 0 \; \leftrightarrow \; p = q $$
$$ KL(p || q) \neq KL(q || p) $$