javascript
如何理解熵、交叉熵、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)
以橫軸表示每個單詞的編碼長度,縱軸表示談論每種動物的頻率。
使用定長編碼時可以得到下圖:
則發送一個單詞所使用編碼長度的期望(也可以看成圖中的面積)為:
12?2+14?2+18?2+18?2=2bits\frac{1}{2}*2+\frac{1}{4}*2+\frac{1}{8}*2+\frac{1}{8}*2=2\ bits 21??2+41??2+81??2+81??2=2?bits
使用變長編碼時可以得到下圖:
則發送一個單詞所使用編碼長度的期望(也可以看成圖中的面積)為:
12?1+14?2+18?3+18?3=1.75bits\frac{1}{2}*1+\frac{1}{4}*2+\frac{1}{8}*3+\frac{1}{8}*3=1.75\ bits 21??1+41??2+81??3+81??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}41? 的編碼以 01 開頭,所以我們損失了 14\frac{1}{4}41? 的編碼空間。
以此類推,當我們想使用一個長度為 LLL 的編碼長度時,損失了 12L\frac{1}{2^L}2L1? 的編碼空間。
cost(L)=12Lcost(L)=\frac{1}{2^L} cost(L)=2L1?
L=log2(1cost)=log2(12L)L=log_2(\frac{1}{cost})=log_2(\frac{1}{2^L}) L=log2?(cost1?)=log2?(2L1?)
同理,為了獲得某個單詞 xxx 的編碼,花費了 p(x)p(x)p(x) (注:p(x)p(x)p(x) 為某一個單詞的概率,這個概率可以看作 costcostcost )。單詞 xxx 的編碼長度為:
L(x)=log2(1p(x))L(x)=log_2(\frac{1}{p(x)}) L(x)=log2?(p(x)1?)
設 ppp 為單詞詞頻的概率分布,ppp 的最優平均編碼長度定義為 ppp 的 熵 H(p)H(p)H(p):
H(p)=∑xp(x)log?2(1p(x))=?∑p(x)log?2(p(x))H(p) = \sum_x p(x)\log_2\left(\frac{1}{p(x)}\right)=- \sum p(x)\log_2(p(x)) H(p)=x∑?p(x)log2?(p(x)1?)=?∑p(x)log2?(p(x))
交叉熵(Cross-Entropy)
假設我還有一個朋友 Alice,她喜歡貓,她的詞頻概率如下圖 q(x)q(x)q(x) 所示:
當 Alice 使用 Bod 的編碼和我進行通信時,她的平均編碼長度為:
18?1+12?2+14?3+18?3=2.25bits\frac{1}{8}*1+\frac{1}{2}*2+\frac{1}{4}*3+\frac{1}{8}*3=2.25\ bits 81??1+21??2+41??3+81??3=2.25?bits
交叉熵可定義為:當某一個分布( 這里為 q(x)q(x)q(x) )使用另一個分布( 這里為 p(x)p(x)p(x))的最優編碼長度進行編碼時的平均編碼長度。
Hp(q)=∑xq(x)log?2(1p(x))=?∑xq(x)log?2(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) Hp?(q)=x∑?q(x)log2?(p(x)1?)=?x∑?q(x)log2?(p(x))
有四種情況:
- Bob 使用他自己的編碼 ( H(p)=1.75bitsH(p)=1.75\ bitsH(p)=1.75?bits )
- Alice 使用 Bob 的編碼 ( $Hp(q)=2.25\ bits $)
- Alice 使用她自己的編碼 ( H(q)=1.75bitsH(q)=1.75\ bitsH(q)=1.75?bits )
- Bob 使用 Alice 的編碼 ( Hq(p)=2.375bitsHq(p)=2.375\ bitsHq(p)=2.375?bits )
可以發現:Hp(q)≠Hq(p)H_p(q) \neq H_q(p)Hp?(q)?=Hq?(p) ,即:交叉熵并不對稱。
我們為什么要關注交叉熵?因為交叉熵給我們提供了一個方式來度量兩個概率分布有多相同。
如果概率分布 ppp 和 qqq 越不相似,ppp 對 qqq 的交叉熵比 ppp 自己的熵更大,即:
同理,qqq 對 ppp 的交叉熵比 qqq 自己的熵更大
KL散度( Kullback–Leibler divergence )
ppp 對 qqq 的KL散度定義為:分布 ppp 使用 qqq 的最優編碼進行編碼時的平均編碼長度( ppp 對 qqq 的交叉熵 )與 分布 ppp 的最優平均編碼長度( ppp 的熵 )的差值。
KaTeX parse error: No such environment: equation at position 8: \begin{?e?q?u?a?t?i?o?n?}? \begin{split} …
KL散度有點像一種距離,用來度量兩個分布之間的差距。如果 ppp 和 qqq 相同,則KL散度為0。ppp 和 qqq 越不相同,KL散度越大。
KL散度也是不對稱的。
JS散度( Jensen-Shannon divergence )
JS散度基于KL散度,是一個對稱平滑版本的KL散度。
ppp 對 qqq 的JS散度定義為:
DJS(p∣∣q)=12DKL(p∣∣m)+12DKL(q∣∣m),wherem=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) DJS?(p∣∣q)=21?DKL?(p∣∣m)+21?DKL?(q∣∣m),?where?m=21?(p+q)
總結
以上是生活随笔為你收集整理的如何理解熵、交叉熵、KL散度、JS散度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac OS 使用终端连接到Linux
- 下一篇: 30个外贸业务员常用邮件模板案例分享