兩個視角給你解讀 熵、交叉熵、KL散度

語言: CN / TW / HK

theme: condensed-night-purple

持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第20天,點選檢視活動詳情


本文從兩方面進行解釋:數學和編碼方面。總有一個角度能讓你更好理解。

數學解釋

熵 Entropy

熵用於計算一個離散隨機變數的資訊量。對於一個概率分佈$X$,$X$的熵就是它的不確定性。 用大白話來說,假設你預測一個東西,有時候結果會出乎意料,熵就表示出乎意料的程度。熵越大你越不容易預測對,事情就越容易出乎意料。

離散型概率分佈$X$的熵定義為自資訊的平均值: $$ H(X)=E_{p(x)}[I(x)]=-\sum_{x} p(x) \log p(x) $$

注意: 熵的單位可以是位元(bits)也可以是奈特(nats)。二者區別在於前者是用$\log_2$計算,後者是用$\log_e$計算。我們這裡是用$\log_2$計算。

舉個栗子算一下熵。

兩個城市明天的天氣狀況如下:

在這裡插入圖片描述 現在有兩個事件:

  • A市明天的天氣狀況
  • B市明天的天氣狀況

$H(A)=-0.8 \times \log 0.8-0.15 \times \log 0.15-0.05 \times \log 0.05=0.884$

$H(B)=-0.4 \times \log 0.4-0.3 \times \log 0.3-0.3 \times \log 0.3=1.571$

可以看到B的熵比A大,因此B城市的天氣具有更大的不確定性。

交叉熵 Cross-Entropy

交叉熵用於度量兩個概率分佈間的差異性資訊。 再用大白話說一下,比如你認為一件事有六成概率能成功,實際上你去做的時候你又八成概率能成功。這時候結果出乎意料的程度就是交叉熵。

交叉熵的數學定義:

$$ H(A, B)=-\Sigma_{i} P_{A}\left(x_{i}\right) \log \left(P_{B}\left(x_{i}\right)\right) $$

舉個栗子算一下交叉熵。

改了一下表頭。 在這裡插入圖片描述 現在還是有兩個事件: - $P$實際A城市明天的天氣狀況 - $Q$你以為的A城市的天氣狀況

$H(P,Q)=-0.8 \times \log0.4-0.15 \times \log0.3 - 0.05 \times \log 0.3 = 1.405$

KL散度 Kullback-Leibler divergence

KL散度又稱相對熵、資訊增益,相對於交叉熵來說,是從另一個角度計算兩個分佈的差異程度。相對於分佈X,分佈Y有多大的不同?這個不同的程度就是KL散度。

注意,KL散度是不對稱的,也就是說X關於Y的KL散度 不等於 Y關於X的KL散度。

若 $A$ 和 $B$ 為定義在同一概率空間的兩個概率測度,定義 $A$ 相對於 $B$ 的相對熵為 $$ D(A \| B)=\sum_{x} P_A(x) \log \frac{P_A(x)}{P_B(x)} $$

舉個栗子算一下KL散度。

還是用這個例子:

在這裡插入圖片描述 現在還是有兩個事件: - $P$實際A城市明天的天氣狀況 - $Q$你以為的A城市的天氣狀況

$D(P \|Q) = 0.8 \times \log(0.8 \div0.4) + 0.15 \times \log(0.15 \div 0.3) + 0.05 \times \log(0.0.5\div 0.3) =0.521$

熵、KL散度和交叉熵的關係

我們從上邊三個例子中可以看到: - A城市明天實際天氣狀況的熵$H(A)=0.884$ - A城市明天實際天氣狀況和你預測的天氣狀況的交叉熵為$H(P,Q)=1.405$ - A城市明天實際天氣狀況和你預測的天氣狀況的KL散度為$D(P \|Q) =0.521$

然後我們可以發現:$0.884+0.521=1.405$

這裡可以引出一個結論 $$ 熵 + KL散度 = 交叉熵 $$

從編碼的角度解釋

注意:下邊這個舉的例子是能整除的情況下,不能整除的情況下是算不出來的。

能整除的例子

假設我們現在有一條訊息皮皮卡皮,皮卡丘

讓我們對這條訊息統計一下:

字| 皮 | 卡 | 丘 |,| -|-|-|-|- 數量|4|2|1|1| 比例| $\frac{4}{8}$ |$\frac{2}{8}$|$\frac{1}{8}$|$\frac{1}{8}$|

畫個哈夫曼樹:

在這裡插入圖片描述 字| 皮 | 卡 | 丘 |,| -|-|-|-|- 數量|4|2|1|1| 比例| $\frac{4}{8}$ |$\frac{2}{8}$|$\frac{1}{8}$|$\frac{1}{8}$| 哈夫曼編碼| 0|11|100|101| 編碼長度|1|2|3|3|

最短編碼平均長度:

$\frac{4}{8} \times 1+\frac{2}{8} \times 2+\frac{1}{8} \times 3+\frac{1}{8} \times 3=1.75$

上述編碼的熵:

$-\frac{4}{8} \times \log \frac{4}{8}-\frac{2}{8} \times \log \frac{2}{8}-\frac{1}{8} \times \log \frac{1}{8}-\frac{1}{8} \times \log \frac{1}{8}=1.75$

從編碼角度看,一串編碼的熵等於它的最短編碼平均長度。 字| 皮 | 卡 | 丘 |,| -|-|-|-|- 數量|4|2|1|1| 比例| $\frac{4}{8}$ |$\frac{2}{8}$|$\frac{1}{8}$|$\frac{1}{8}$| 哈夫曼編碼| 0|11|100|101| 錯誤的哈夫曼編碼| 11|0|100|101|

如果你編碼時候寫錯了

現在的平均編碼長度是:

$\frac{4}{8} \times 2+\frac{2}{8} \times 1+\frac{1}{8} \times 3+\frac{1}{8} \times 3=2$

此時交叉熵為:

$-\frac{4}{8} \times \log \frac{2}{8}-\frac{2}{8} \times \log \frac{4}{8}-\frac{1}{8} \times \log \frac{1}{8}-\frac{1}{8} \times \log \frac{1}{8}=2$

使用錯誤的編碼時候,編碼平均長度就是交叉熵。

而KL散度呢?

$\frac{4}{8} \times \log(\frac{4}{8}\div\frac{2}{8})+\frac{2}{8} \times \log (\frac{2}{8} \div \frac{4}{8})+\frac{1}{8} \times \log (\frac{1}{8} \div \frac{1}{8})+\frac{1}{8} \times \log (\frac{1}{8} \div \frac{1}{8})=0.25$

KL散度就是錯誤編碼平均長度和正確編碼平均長度的差異。

不能整除的例子

注意:你看,不能整除的情況下是算不出來的。

假設我們現在有一條訊息皮卡皮卡,皮卡皮,皮卡丘

讓我們對這條訊息統計一下:

字| 皮 | 卡 | 丘 |,| -|-|-|-|- 數量|5|4|1|2| 比例| $\frac{5}{12}$ |$\frac{4}{12}$|$\frac{1}{12}$|$\frac{2}{12}$|

畫個哈夫曼樹:

在這裡插入圖片描述

字| 皮 | 卡 |,| 丘 | -|-|-|-|- 數量|5|4|2|1| 比例| $\frac{5}{12}$ |$\frac{4}{12}$|$\frac{2}{12}$|$\frac{1}{12}$| 哈夫曼編碼| 0|11|101|100| 編碼長度|1|2|3|3|

最短編碼平均長度:

$\frac{5}{12} \times 1 +\frac{4}{12} \times 2+\frac{2}{12} \times 3+\frac{1}{12} \times 3 = 1.83$

上述編碼的熵:

$-\frac{5}{12} \times \log\frac{5}{12} -\frac{4}{12} \times \log\frac{4}{12}-\frac{2}{12} \times \log\frac{2}{12}-\frac{1}{12} \times \log\frac{1}{12} = 1.78$

後邊不算了。可以看到不能整除情況下因為一些誤差是不相等的。