在機器學習、深度學習中,經常聽見熵(entropy)、交叉熵(cross-entropy)、KL散度( Kullback–Leibler divergence )、JS散度( Jensen-Shannon divergence )這些概念。初次聽見這些概念肯定一頭霧水,在很多地方都能見到對這些概念 high-level
的解釋,但 high-level
的解釋並不能對這些概念更深入的理解。比如熵是信息的度量,但是爲什麼熵可以用來作爲信息的度量,則不知其緣由。接下來則由淺入深,深入理解這些概念。
編碼(Codes)
在計算機中,任何信息都是用0、1來存儲。所以爲了將信息存儲在計算機中,我們要將信息編碼爲 0、1串以便存儲在計算機中。
假設 Bob 是一個動物愛好者,住在美國,他只談論四種動物:dog、cat、fish、bird
爲了和 Bob 進行交流,我們之間需要建立一個 code
把單詞映射爲 0、1 串。
這些0、1串在網絡上傳輸需要消耗一定的帶寬,所以我們希望0、1串越小越好,這樣消耗的帶寬就越小。如何對信息進行編碼呢?
第一種方案:定長編碼
發送信息時,只需要將相應的單詞替換爲對應的編碼就行,例如:
第二種方案:變長編碼
假設 Bob 非常喜歡狗,他談論狗的頻率比其它動物要高,假設談論每個動物的概率如下所示。
爲了減少帶寬,一個直覺的編碼方式爲:對頻率比較高的單詞用較短的編碼長度,頻率比較低的單詞使用較長的編碼長度,這樣最後得到的總長度是最小的。使用變長編碼時,爲了讓解碼唯一,可以使用哈夫曼編碼來實現。一種變長編碼方式爲:
熵(Entropy)
以橫軸表示每個單詞的編碼長度,縱軸表示談論每種動物的頻率。
使用定長編碼時可以得到下圖:
則發送一個單詞所使用編碼長度的期望(也可以看成圖中的面積)爲:
使用變長編碼時可以得到下圖:
則發送一個單詞所使用編碼長度的期望(也可以看成圖中的面積)爲:
使用哈夫曼編碼定義的變長編碼可以達到最優的期望,證明略。
所以熵可定義爲:最優的平均編碼長度(即期望),也即是圖中的面積。
如何計算熵?
長度爲 1 的有 2 種編碼:0、1
長度爲 2 的有 4 種編碼:00、01、10、11
長度爲 3 的有 8 種編碼:000、001、010、011、100、101、110、111
以此類推…
爲了獲得最優編碼長度常使用變長編碼,而使用變長編碼時,會損失一部分編碼空間。例如:使用 01 作爲某一個編碼時,以 01 開頭的那些編碼都不能用(例:010、011、0100、0110…)。在所有編碼種,有 的編碼以 01 開頭,所以我們損失了 的編碼空間。
以此類推,當我們想使用一個長度爲 的編碼長度時,損失了 的編碼空間。
同理,爲了獲得某個單詞 的編碼,花費了 (注: 爲某一個單詞的概率,這個概率可以看作 )。單詞 的編碼長度爲:
設 爲單詞詞頻的概率分佈, 的最優平均編碼長度定義爲 的 熵 :
交叉熵(Cross-Entropy)
假設我還有一個朋友 Alice,她喜歡貓,她的詞頻概率如下圖 所示:
當 Alice 使用 Bod 的編碼和我進行通信時,她的平均編碼長度爲:
交叉熵可定義爲:當某一個分佈( 這裏爲 )使用另一個分佈( 這裏爲 )的最優編碼長度進行編碼時的平均編碼長度。
有四種情況:
- Bob 使用他自己的編碼 ( )
- Alice 使用 Bob 的編碼 ( $Hp(q)=2.25\ bits $)
- Alice 使用她自己的編碼 ( )
- Bob 使用 Alice 的編碼 ( )
可以發現: ,即:交叉熵並不對稱。
我們爲什麼要關注交叉熵?因爲交叉熵給我們提供了一個方式來度量兩個概率分佈有多相同。
如果概率分佈 和 越不相似, 對 的交叉熵比 自己的熵更大,即:
同理, 對 的交叉熵比 自己的熵更大
KL散度( Kullback–Leibler divergence )
對 的KL散度定義爲:分佈 使用 的最優編碼進行編碼時的平均編碼長度( 對 的交叉熵 )與 分佈 的最優平均編碼長度( 的熵 )的差值。
KaTeX parse error: No such environment: equation at position 8:
\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲
\begin{split}
…
KL散度有點像一種距離,用來度量兩個分佈之間的差距。如果 和 相同,則KL散度爲0。 和 越不相同,KL散度越大。
KL散度也是不對稱的。
JS散度( Jensen-Shannon divergence )
JS散度基於KL散度,是一個對稱平滑版本的KL散度。
對 的JS散度定義爲: