Cross-entropy 의 이해: 정보이론과의 관계



1. 손실함수로서의 Cross-entropy


딥러닝에서 분류 모델에 대한 손실 함수로 cross-entropy 혹은 binary entropy 나 log loss 라는 것을 사용하게 된다. 손실함수로서의 cross-entropy 는 아래 식으로 계산할 수 있다. 

$$ - \frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} L_{ic}log(P_{ic}) $$ 

이 때, 

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

만약 k = 3 이면 L_1 = [0, 0, 1] P_1 = [0.1, 0.2, 0.7] 과 같이 정의 될 수 있다. 이 때, 해당 데이터 포인트 (1) 에서 cross entropy 는 0*log(0.1) + 0*log(0.2) + 1*log(0.7) = -log(0.7) = 0.35 이다. 만약 L_2 = [0, 0, 1] P_2 = [0.5, 0.3, 0.2] 라면, 예측 모델은 상당히 잘못 예측했다는 것을 알 수 있고, 이 데이터 포인트 (2) 에서의 cross-entropy 는 -log(0.2) = 1.6 이다. 


딥러닝을 통한 예측 모델링에 있어, 실제 값과 예측값의 차이 (dissimilarity) 계산한다는 관점에서 cross-entropy 사용하는 것의 의미를 직관적으로 이해할 수 있다. 하지만 본 포스팅에서 이러한 식이 나오게 된 배경을 정보 이론 (Information theory) 을 기반으로 알아보려고한다. 


2. entropy 란 무엇인가?


entropy 란 불확실성 (uncertainty) 에 대한 척도이다. 결국 예측 모형으로 하고자 하는 것은 불확실성을 제어하고자 하는 것이다. 가방 안에 빨간공만 들어있다고 하자. 이 경우, 불확실성은 없다. 왜냐하면 어떤공을 꺼내도 빨간 공이기 때문이다. 따라서 이 경우 entropy 는 0이다. 우리가 신경써야하는 부분은 가방 안에서 꺼내는 공에 불확실성이 있는 경우이다. 


만약, 어떠한 사건이 같은 비율로 발생한다고 하고, 사건의 갯수를 n이라고 하면 entropy 는 log(n) 이다. 예를 들어, 가방 안에 빨간공과 녹색 공이 50:50으로 들어있다면 이 경우 entropy 는 log(2)=0.69 이다. 두 색깔의 공만 들어있는 경우, 50:50 으로 들어있을 때, 가장 entropy (불확실성) 이 크다. 이를 직관적으로 이해하면, 우리가 공을 꺼낼 때, 반반으로 들어있다면, 어떤 공이 더 자주 관찰될지 예측할 수 없기 때문에 entropy 가 크다고 이해할 수 있다.


하지만 일반적으로 가방 안에 각기 다른색의 공들이 다른 비율로 들어있는 경우가 많을 것이다. 이 때는 위와 같은 공식으로 구할 수 없으며, entropy 를 아래와 같은 식으로 구하게 된다. 

$$ H(q) = -\sum_{c=1}^{C} q(y_c)log(q(y_c)) $$ 


이 때, C는 범주의 갯수이고, q는 사건의 확률질량함수 (probability mass function) 이다. 예를 들어, 가방 안에 빨간공과 녹색공이 20:80 으로 들어있는 경우, H(q)=-(0.2log(0.2)+0.8log(0.8))=0.5 이다. 더욱 쉬운 이해를 위해 가방에서 공을 꺼낼 때, 더 많은 경우의 수가 존재한다고 해보자. 가령 100개의 각기 다른 색깔과 모양의 공이 가방 안에 들어있다. 이 경우, 가방에서 공을 꺼냈을 때 어떤 색과 모양을 갖는 공이 관찰될지 알기 매우 힘들다. 각 공이 동일한 확률로 관찰된다고 가정할 때 entropy = log(100) = 4.6 이다. 하지만 100개의 공이 들어있다고 하더라도, 한 종류의 공이 99 %를 차지하고 있으면 어떨까? 이 경우, 위 식에 의해 entropy는 매우 작아진다 (-(0.99*log(0.99)+99*(0.01/99*log(0.01/99))) = 0.1). 즉, entropy 는 예측하기 쉬운 일에서보다, 예측하기 힘든일에서 더 높다. 


3. Cross-entropy 


예측 모형은 실제 분포인 q 를 모르고, 모델링을 하여 q 분포를 예측하고자 하는 것이다. 예측 모델링을 통해 구한 분포를 p(x) 라고 해보자. 실제 분포인 q를 예측하는 p 분포를 만들었을 때, 이 때 cross-entropy 는 아래와 같이 정의된다. 

$$ H_p(q) = -\sum_{c=1}^{C} q(y_c)log(p(y_c)) $$ 


이 때, q와 p가 모두 식에 들어가기 때문에, cross-entropy 라는 이름이 붙었다고 할 수 있다. 머신러닝을 통한 예측 모형에서 훈련 데이터에서는 실제 분포인 p 를 알 수 있기 때문에 cross-entropy 를 계산할 수 있다. 즉, 훈련 데이터를 사용한 예측 모형에서 cross-entropy 는 실제 값과 예측값의 차이 (dissimilarity) 를 계산하는데 사용할 수 있다는 것이다. 또한, Cross-entropy > entropy 이다. 


예를 들어, 가방에 0.8/0.1/0.1 의 비율로, 빨간/녹색/노랑 공이 들어가 있다고 하자, 하지만 직감에는 0.2/0.2/0.6의 비율로 들어가 있을 것 같다. 이 때, entropy 와 cross-entropy 는 아래와 같이 계산된다. 


$$ H(q) = -[0.8log(0.8) + 0.1log(0.1) + 0.1log(0.1)] = 0.63 $$

$$ H_p(q) = -[0.8log(0.2) + 0.1log(0.2) + 0.1log(0.6)] = 1.50 $$


4. Kullback-Leibler Divergence


 “KL Divergence” 라고 주로 부르는 서로 다른 두 분포의 차이 (dissimilarity) 를 측정하는데 쓰이는 measure 이다. 이를 entropy 와 cross-entropy 개념에 대입하면 두 entropy 의 차이로 계산된다. KL Divergence 의 정의는 아래와 같다 (아래 정의는 p와 q가 이산분포일 때 정의되는 것이며, 연속 분포일 때는 sum 대신 integral 이 들어갈 것임을 예상해볼 수 있다.). 두 분포, q (실제)와 p (예측)가 있을 때, 


$$ D_{KL}(q||p) = -\sum_{c=1}^{C} q(y_c) [log(p(y_c)) - log(q(y_c))] = H_p(q) - H(q) $$ 


cross-entropy = H_p(q) 는 실제 entropy = H(q) 보다 항상 크기 때문에 KL Divergence 는 항상 0보다 큰 값을 갖게된다. 예측 분포인 p 를 실제분포 q에 가깝게 하는 것이, 예측모형이 하고자하는 것이며, p가 q에 가까이갈 수록 KL Divergence 0에 가까워질 것이다. 그리고 H(q) 는 고정이기 때문에, H_p(q)를 최소화 시키는 것이 예측 모형을 최적화 시키는 것이라고 할 수 있다. 따라서 cross-entropy 를 최소화 시키는 것이 KL Divergenece 를 최소화 시키는 것이며, 이것이 불확실성을 제어하고자하는 예측모형의 실질적인 목적이라고 볼 수 있다. 


5. Cross-entropy 를 통한 loss function 


예를 들어, 이미지를 읽어들여 개/고양이/물고기를 분류하는 3개의 클래스를 갖는 다중 분류 문제를 생각해보자. 가방에 개/고양이/물고기라고 쓰인 공이 들어있다. 이 공은 해당 이미지에 대한 정답을 사람이 적어 놓은 것이다. 예측 모형은 주어진 정보 (이미지) 를 살펴본 후, 예측 분포를 산출했는데, p(y) = [0.2, 0.3, 0.5] 으로 예측했다. 즉, 공 (실제 정답) 을 꺼냈을 때, 개/고양이/물고기를 관찰할 확률이 각각 0.2/0.3/0.5 일 것이라고 예측 한 것이다. 하지만 실제 분포, q(y) = [0, 0, 1] 이다. 이 때, cross-entropy 는 매우 간단하게, -log(0.5) 이다.


2에서 예로 든, 빨간공 녹색공 예제와 다른점은, 빨간공 녹색공 예제에서는 공이 어떠한 확률질량함수를 갖고 가방 안에 들어있을 것이라고 가정한 것이지만, 현실의 분류 문제에서는 정답이 있다고 가정하고 하기 때문에 (즉, 공을 꺼낼 때 관찰하는 것이 100 % 정해져 있다.), 실제 분포인 q(y)가 [0,0,1], [1,0,0] .. 과 같은 one-hot encoding 된 벡터로 나타내어진다는 것이다. 왜냐하면 실제 이미지가 0.2 의 확률로 개일 수는 없다. 왜냐하면 그 이미지가 개라는 것이 "정답" 이라고 사람이 정의했기 때문이다. 즉, 어떠한 이미지가 무엇이냐는 것은 확률적이지 않다는 것이기 때문에 실제 분포의 entropy = H(q) = 0 이다. 하지만 cross-entropy 는 p와 q에서 정의되는 것이므로 구할 수 있다. 실제 분포의 entropy 가 0이기 때문에, cross-entropy = KL(q||p) 이다. 


이 경우, p와 q의 cross-entropy 는 실제로 아래와 같이 계산된다. 

$$ -\sum_{c=1}^{C} L_{c}log(P_{c}) $$  

$$ L_{c} = q(y_c)  $$

$$ P_{c} = p(y_c) $$ 


그리고 n 개의 데이터포인트에 대해 cross-entropy 의 평균을 구하는 것이 아래의 식이다. 

$$ - \frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} L_{ic}log(P_{ic}) $$ 


지금까지 손실함수로 cross-entropy 를 사용한다는 것이 무엇을 의미하는 것인지, entropy 를 기반으로 설명하였다. 손실함수로서의 cross-entropy 를 정보 이론의 관점, entropy 의 관점에서 이러한 관련성을 갖고 있다는 것을 이해하는데 도움이 되었으면 한다.  


참고

https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181a 


  • 민성 2019.10.18 11:46

    3. cross entropy 세션에서 H(q) 와 H_p(q) 두수식에서 두번재 텀부터 - 부호를 붙여야하거나 아니면 첫번째 - 부호 다음에 () 로 씌워야 할 것 같아요.

  • 김건호 2020.01.13 11:32

    좋은 글입니다. 잘 봤습니다:)

  • 이화 2020.04.20 11:29

    안녕하세요. 5. Cross-entropy 를 통한 loss function 섹션에서 '실제 분포의 cross-entropy가 0이기 때문에' 이 부분에서 그냥 entropy로 수정하셔야 할 것 같습니다. 글 잘봤습니다 :)

  • 지나가다 2020.10.26 12:14

    머신러닝을 통한 예측 모형에서 훈련 데이터에서는 실제 분포인 p 를 알 수 있기 때문에 cross-entropy 를 계산할 수 있다.

    에서 실제분포인 p --> 실제 분포인 q로 변경해야 하지 않을까 싶습니다.

  • 질문 2021.04.06 18:56

    안녕하세요 99개의 공과 1개의 공이 있는경우가
    (-(0.99*log(0.99)+99*(0.01/99*log(0.01/99))) = 0.1)

    라고 하셨는데

    1개의 공이 나올 확률은 1/100 이고
    99개의 공이 나올 확률은 99/100 아닌가요?
    따라서 계산이
    -(0.01*log(0.01) + 0.99 * log(0.99) ) = 0.08
    이어야 되는게 아닌가 질문 드립니다.

  • 2021.07.14 14:14

    안녕하세요. 위 댓글들처럼 어색한 부분이 조금 있지만
    정말 잘 정리된 글인 것 같습니다.

    오랜만에 Xent를 다시 머릿속에 새겨 넣고자 검색했는데, 정말 좋은 글을 발견해서 다행이네요.
    잘 읽고 갑니다. 감사합니다