---
# System prepended metadata

title: 交叉熵

---

# 交叉熵

## 信息量
* **f(x) := 信息量**

假設有8個隊伍, 且每隊的實力相當, 所以他們個別的奪冠機率是1/8.

今天我說：阿根廷奪冠了.
這句話的信息量應當要等於
今天我說：阿根廷打進決賽, 並且贏了決賽.

所以可以有以下式子：
* **f(1/8) = f(1/4) + f(1/2)** -(1)
1/8奪冠的機率, 1/4為進決賽的機率, 1/2為贏了決賽的機率.

可以理解成下圖
![](https://hackmd.io/_uploads/Hko3x1W-6.png)

而這個 f 函數為了能保證自洽, 還需要符合另一個式子. 由於x是機率, 所以
* **P(a奪冠) = P(a進決賽) * P(a贏了決賽)** -(2)
a=阿根廷

f 函數需要符合的式子即為：
* **f(x1 * x2) = f(x1) + f(x2)** -(3)

所以可以想像 f 函數大概長這樣：
* **f(x) := ?log_?(x)** -(4)
底線為下標之意

接著問題是 ? 是什麼, 首先知道 log 是單調遞增函數, 而**信息量應當是機率越小, 信息量越大, 反之亦然**

根據公式(1), 機率1/8的信息量 = 機率1/4的信息量 + 機率1/2的信息量, 所以機率越小, 信息量應當越大

舉個例子, 假設今天 a 隊和 b 隊比賽, a 隊贏的機率為99%, b 隊贏的機率為1%
今天 b 隊贏了, 你會覺得：哇, b 隊竟然贏了, 你會很震驚, 這信息量很大
今天 a 隊贏了, 你會覺得：當然啊, a隊那麼強, 信息量很小, 因為 a 隊會贏對你來說是理所應當的事

所以在公式(4)中的前面的問號, 我們取負值, 讓整個log函數反轉過, 讓 f 函數形成單調遞減, 至於log的底數, 可以取喜歡的數字, 通常為2或是e, 所以 f 函數為：
* **f(x) := -log_2(x)** -(5)

結論：**信息量**可以理解成, 一個事件從 *不確定狀態* 變成 *確定狀態* 的難度有多大, 信息量較高, 代表這個難度也較大

## 熵
**熵** 為衡量一個系統中所有事件從 *不確定狀態* 變成 *確定狀態* 的難度有多大, 也就是所有事件的信息量加總, 當然目標要相同
比如說, 所有隊伍贏球的信息量的加總可以當作 熵, 而 有些隊伍贏的信息量加上其他隊伍輸的信息量不能當作 熵

以下圖為例子, 來理解熵公式的定義
![](https://hackmd.io/_uploads/BkxrOJb-p.png)

可以看到, 右邊的信息量總合為 6.6584, 左邊為 2

問題：信息量的總和可以直接當作熵嗎?

顯然是不能的, 根據定義, 右邊的系統, 從不確定性變成確定性的難度比較低, 左邊的系統難度較高

我們可以仔細得想一下, 在右邊的系統中, 中國隊要贏了球才能提供 6.6439 的信息量, 如果法國隊贏了, 則不再提供 6.6439 的信息量了.
所以每個事件所貢獻的信息量應當要乘上該事件發生的機率, 即為：
![](https://hackmd.io/_uploads/SyBR51-Wa.png)

右邊系統的熵為 0.08079, 左邊系統為 1. 加總一個實際的值乘上該值在一個系統中的佔比, 這即為**期望**

所以 熵 的定義給出：
* **H( P ) := E( P_f )** -(6)

也就等於

![](https://hackmd.io/_uploads/SJZxpkWbT.png)

第二步為代入式(5)

結論：熵可以對一個概率模型進行衡量, 值計衡量出來的值反映了該概率模型的不確定程度

## 相對熵(KL散度)

**相對熵**是用來比較兩個系統的熵

以下圖為例, 有兩個概率系統
![](https://hackmd.io/_uploads/H1YLAy-ba.png)
f 函數為信息量

我們先給出KL散度的公式
![](https://hackmd.io/_uploads/B1GpCkbZT.png)

* **D_KL(P||Q)**
p 放前面代表以p為基準

KL散度實際意義為這兩個概率系統的相似程度, 也就是這兩個概率系統的差值, 值越小代表越相近

第一個等式的意義為對 Q 的信息量 減去 P 的信息量 求期望值, 如果 Q 和 P 很相像, 則可以求出值很接近 0.

第三個式子中, 減號的後半部![](https://hackmd.io/_uploads/BymQggZW6.png), 即為**P 系統的熵**, 而前半部分![](https://hackmd.io/_uploads/r1qPeg-Zp.png), 即為**交叉熵**H(P, Q), 一樣, P 放前面代表以 P 為基準

根據[*吉布斯不等式*](https://zh.wikipedia.org/zh-tw/%E5%90%89%E5%B8%83%E6%96%AF%E4%B8%8D%E7%AD%89%E5%BC%8F), 給出![](https://hackmd.io/_uploads/SklTGx--T.png)

交叉熵H(P, Q)大於等於H( P ), 所以其實只需要交叉熵H(P, Q)越小即可, 此外交叉熵H(P, Q)也可以單獨當作loss function, 因為只要H(P, Q)越小, 我們即能得出 P 和 Q 越相似

也是因為吉布斯不等式, 所以KL散度為一個大於等於 0 的值

下圖為把交叉熵轉變為loss function的過程
![](https://hackmd.io/_uploads/SkejNlWZa.png)
xi 為人為判斷一個事件是 a 的機率, yi 為神經網路判斷一個事件是 a 的機率, 我們需要取這個 H 函數的最小值

第一個等式到第二個等式中, m 換成了 n, 是因為這個值(m 或 n)式跟隨 p_i 或 x_i 的i大小的

第二個等式到第三個等式中, 由於考慮 xi 判斷為 a 概率是多少以外, 還需要加上 xi 判斷不是 a 的概率為多少
原因是第二個等式中, 當 xi 為0時, qi 會給出神經網路判斷為非 a 的概率, 但因為 xi 是0, 所以這項就沒了, 所以在第三個等式中, 才需要加上後面(1 - xi)那項

教學：[“交叉熵”如何做损失函数？打包理解“信息量”、“比特”、“熵”、“KL散度”、“交叉熵”](https://www.youtube.com/watch?v=NgMa8H_8p8M)