兩個視角給你解讀 熵、交叉熵、KL散度
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$
後邊不算了。可以看到不能整除情況下因為一些誤差是不相等的。
- 【翻譯】最近興起的擴散模型
- 深扒torch.autograd原理
- 用一個影象分類例項拿捏Pytorch使用方法
- 帶你瞭解自然語言處理文字生成方向
- 你們居然還在用負樣本做對比學習?
- 4個例子幫你梳理PyTorch的nn module
- 幾個例子幫你梳理PyTorch知識點(張量、autograd)
- SimCSE,丹琦女神把對比學習用到了NLP中了!
- 兩個視角給你解讀 熵、交叉熵、KL散度
- 你們那種對比學習是辣雞,我SwAV今天就要開啟新局面!
- “軍備競賽”時期的對比學習
- 怎麼用PyTorch實現一個Encoder-Decoder框架?
- 公式程式碼都有了,速來學LSTM 長短期記憶網路
- 【翻譯】圖解自注意力機制
- 用pytorch寫個RNN 迴圈神經網路
- 用pytorch寫個 GRU 門控迴圈單元
- 手把手教你實現 seq2seq
- 突然火起來的diffusion model是什麼?
- TensorBoard 一行程式碼實現指標視覺化
- 【翻譯】圖解transformer