如何理解熵、交叉熵、KL散度、JS散度

在機器學習、深度學習中,經常聽見熵(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)

以橫軸表示每個單詞的編碼長度,縱軸表示談論每種動物的頻率。

使用定長編碼時可以得到下圖:

則發送一個單詞所使用編碼長度的期望(也可以看成圖中的面積)爲:
122+142+182+182=2 bits \frac{1}{2}*2+\frac{1}{4}*2+\frac{1}{8}*2+\frac{1}{8}*2=2\ bits

使用變長編碼時可以得到下圖:

則發送一個單詞所使用編碼長度的期望(也可以看成圖中的面積)爲:
121+142+183+183=1.75 bits \frac{1}{2}*1+\frac{1}{4}*2+\frac{1}{8}*3+\frac{1}{8}*3=1.75\ bits
使用哈夫曼編碼定義的變長編碼可以達到最優的期望,證明略。

所以熵可定義爲:最優的平均編碼長度(即期望),也即是圖中的面積

如何計算熵?

長度爲 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…)。在所有編碼種,有 14\frac{1}{4} 的編碼以 01 開頭,所以我們損失了 14\frac{1}{4} 的編碼空間。

以此類推,當我們想使用一個長度爲 LL 的編碼長度時,損失了 12L\frac{1}{2^L} 的編碼空間。
cost(L)=12L cost(L)=\frac{1}{2^L}

L=log2(1cost)=log2(12L) L=log_2(\frac{1}{cost})=log_2(\frac{1}{2^L})

同理,爲了獲得某個單詞 xx 的編碼,花費了 p(x)p(x) (注:p(x)p(x) 爲某一個單詞的概率,這個概率可以看作 costcost )。單詞 xx 的編碼長度爲:

L(x)=log2(1p(x)) L(x)=log_2(\frac{1}{p(x)})

pp 爲單詞詞頻的概率分佈,pp 的最優平均編碼長度定義爲 pp 的 熵 H(p)H(p):
H(p)=xp(x)log2(1p(x))=p(x)log2(p(x)) H(p) = \sum_x p(x)\log_2\left(\frac{1}{p(x)}\right)=- \sum p(x)\log_2(p(x))

交叉熵(Cross-Entropy)

假設我還有一個朋友 Alice,她喜歡貓,她的詞頻概率如下圖 q(x)q(x) 所示:

當 Alice 使用 Bod 的編碼和我進行通信時,她的平均編碼長度爲:
181+122+143+183=2.25 bits \frac{1}{8}*1+\frac{1}{2}*2+\frac{1}{4}*3+\frac{1}{8}*3=2.25\ bits
交叉熵可定義爲:當某一個分佈( 這裏爲 q(x)q(x) )使用另一個分佈( 這裏爲 p(x)p(x))的最優編碼長度進行編碼時的平均編碼長度。
Hp(q)=xq(x)log2(1p(x))=xq(x)log2(p(x)) H_p(q) = \sum_x q(x)\log_2\left(\frac{1}{p(x)}\right)=-\sum_x q(x)\log_2\left(p(x)\right)

有四種情況:

  • Bob 使用他自己的編碼 ( H(p)=1.75 bitsH(p)=1.75\ bits )
  • Alice 使用 Bob 的編碼 ( $Hp(q)=2.25\ bits $)
  • Alice 使用她自己的編碼 ( H(q)=1.75 bitsH(q)=1.75\ bits )
  • Bob 使用 Alice 的編碼 ( Hq(p)=2.375 bitsHq(p)=2.375\ bits )

可以發現:Hp(q)Hq(p)H_p(q) \neq H_q(p) ,即:交叉熵並不對稱

我們爲什麼要關注交叉熵?因爲交叉熵給我們提供了一個方式來度量兩個概率分佈有多相同。

如果概率分佈 ppqq 越不相似,ppqq 的交叉熵比 pp 自己的熵更大,即:

同理,qqpp 的交叉熵比 qq 自己的熵更大

KL散度( Kullback–Leibler divergence )

ppqq 的KL散度定義爲:分佈 pp 使用 qq 的最優編碼進行編碼時的平均編碼長度( ppqq 的交叉熵 )與 分佈 pp 的最優平均編碼長度( pp 的熵 )的差值。
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \begin{split} …
KL散度有點像一種距離,用來度量兩個分佈之間的差距。如果 ppqq 相同,則KL散度爲0。ppqq 越不相同,KL散度越大。

KL散度也是不對稱的。

JS散度( Jensen-Shannon divergence )

JS散度基於KL散度,是一個對稱平滑版本的KL散度。

ppqq 的JS散度定義爲:
DJS(pq)=12DKL(pm)+12DKL(qm), where m=12(p+q) D_{JS}(p||q)=\frac{1}{2}D_{KL}(p||m)+\frac{1}{2}D_{KL}(q||m),\ where\ m=\frac{1}{2}(p+q)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章