Kullback-Leibler Divergence
,即K-L散度
,是一種量化兩種概率分布P和Q之間差異的方式,又叫相對熵
。在概率學和統計學上,我們經常會使用一種更簡單的、近似的分布
來替代觀察數據
或太復雜的分布
。K-L散度能幫助我們度量使用一個分布來近似另一個分布時所損失的信息量。
K-L散度定義見文末附錄1。另外在附錄5中解釋了為什么在深度學習中,訓練模型時使用的是Cross Entropy
而非K-L Divergence
。
我們從下面這個問題出發思考K-L散度。
假設我們是一群太空科學家,經過遙遠的旅行,來到了一顆新發現的星球。在這個星球上,生存著一種長有牙齒的蠕蟲,引起了我們的研究興趣。我們發現這種蠕蟲生有10顆牙齒,但是因為不注意口腔衛生,又喜歡嚼東西,許多蠕蟲會掉牙。收集大量樣本之后,我們得到關于蠕蟲牙齒數量的經驗分布,如下圖所示
這些數據很有價值,但是也有點問題。我們距離地球??太遠了,把這些概率分布數據發送回地球過于昂貴。還好我們是一群聰明的科學家,用一個只有一兩個參數的簡單模型來近似原始數據會減小數據傳送量。最簡單的近似模型是均分布
,因為蠕蟲牙齒不會超過10顆,所以有11個可能值,那蠕蟲的牙齒數量概率都為 1/11
。分布圖如下:
顯然我們的原始數據并非均分布的,但也不是我們已知的分布,至少不是常見的分布。作為備選,我們想到的另一種簡單模型是二項式分布binomial distribution
。蠕蟲嘴里面共有n=10
個牙槽,每個牙槽出現牙齒與否為獨立事件,且概率均為p
。則蠕蟲牙齒數量即為期望值E[x]=n*p
,真實期望值即為觀察數據的平均值,比如說5.7
,則p=0.57
,得到如下圖所示的二項式分布:
對比一下原始數據,可以看出均分布和二項分布都不能完全描述原始分布。
可是,我們不禁要問,哪一種分布更加接近原始分布呢?
已經有許多度量誤差的方式存在,但是我們所要考慮的是減小發送的信息量。上面討論的均分布和二項式分布都把問題規約到只需要兩個參數,牙齒數量和概率值(均分布只需要牙齒數量即可)。那么哪個分布保留了更多的原始數據分布的信息呢?這個時候就需要K-L散度登場了。
數據的熵
K-L散度源于信息論。信息論主要研究如何量化數據中的信息。最重要的信息度量單位是熵
Entropy,一般用H
表示。分布的熵的公式如下:
上面對數沒有確定底數,可以是2
、e
或10
,等等。如果我們使用以2
為底的對數計算H值的話,可以把這個值看作是編碼信息所需要的最少二進制位個數bits。上面空間蠕蟲的例子中,信息指的是根據觀察所得的經驗分布給出的蠕蟲牙齒數量。計算可以得到原始數據概率分布的熵值為3.12 bits
。這個值只是告訴我們編碼蠕蟲牙齒數量概率的信息需要的二進制位bit
的位數。
可是熵值并沒有給出壓縮數據到最小熵值的方法,即如何編碼數據才能達到最優(存儲空間最優)。優化信息編碼是一個非常有意思的主題,但并不是理解K-L散度所必須的。熵的主要作用是告訴我們最優編碼信息方案的理論下界(存儲空間),以及度量數據的信息量的一種方式。理解了熵,我們就知道有多少信息蘊含在數據之中,現在我們就可以計算當我們用一個帶參數的概率分布來近似替代原始數據分布的時候,到底損失了多少信息。請繼續看下節內容。↓↓↓
K-L散度度量信息損失
只需要稍加修改熵H
的計算公式就能得到K-L散度
的計算公式。設p
為觀察得到的概率分布,q
為另一分布來近似p
,則p
、q
的K-L散度
為:
顯然,根據上面的公式,K-L散度其實是數據的原始分布p和近似分布q之間的對數差值的期望。如果繼續用2
為底的對數計算,則K-L散度值表示信息損失的二進制位數。下面公式以期望表達K-L散度:
一般,K-L散度以下面的書寫方式更常見:
注:log a - log b = log (a/b)
OK,現在我們知道當用一個分布來近似另一個分布時如何計算信息損失量了。接下來,讓我們重新回到最開始的蠕蟲牙齒數量概率分布的問題。
對比兩種分布
首先是用均分布來近似原始分布的K-L散度:
接下來計算用二項式分布近似原始分布的K-L散度:
通過上面的計算可以看出,使用均分布近似原始分布的信息損失要比用二項式分布近似小。所以,如果要從均分布和二項式分布中選擇一個的話,均分布更好些。
散度并非距離
很自然地,一些同學把K-L散度看作是不同分布之間距離的度量。這是不對的,因為從K-L散度的計算公式就可以看出它不符合對稱性(距離度量應該滿足對稱性)。如果用我們上面觀察的數據分布來近似二項式分布,得到如下結果:
所以,Dkl (Observed || Binomial) != Dkl (Binomial || Observed)
。
也就是說,用p
近似q
和用q
近似p
,二者所損失的信息并不是一樣的。
使用K-L散度優化模型
前面使用的二項式分布的參數是概率 p=0.57
,是原始數據的均值。p
的值域在 [0, 1] 之間,我們要選擇一個p
值,建立二項式分布,目的是最小化近似誤差,即K-L散度。那么0.57
是最優的嗎?
下圖是原始數據分布和二項式分布的K-L散度變化隨二項式分布參數p
變化情況:
通過上面的曲線圖可以看出,K-L散度值在圓點處最小,即p=0.57
。所以我們之前的二項式分布模型已經是最優的二項式模型了。注意,我已經說了,是而像是模型,這里只限定在二項式模型范圍內。
前面只考慮了均分布模型和二項式分布模型,接下來我們考慮另外一種模型來近似原始數據。首先把原始數據分成兩部分,1)0-5顆牙齒的概率和 2)6-10顆牙齒的概率。概率值如下:
即,一只蠕蟲的牙齒數量
x=i
的概率為p/5
; x=j
的概率為(1-p) / 6
,i=0,1,2,3,4,5
; j=6,7,8,9,10
。Aha,我們自己建立了一個新的(奇怪的)模型來近似原始的分布,模型只有一個參數
p
,像前面那樣優化二項式分布的時候所做的一樣,讓我們畫出K-L散度值隨p
變化的情況:
當p=0.47
時,K-L值取最小值0.338
。似曾相識嗎?對,這個值和使用均分布的K-L散度值是一樣的(這并不能說明什么)!下面我們繼續畫出這個奇怪模型的概率分布圖,看起來確實和均分布的概率分布圖相似:
我們自己都說了,這是個奇怪的模型,在K-L值相同的情況下,更傾向于使用更常見的、更簡單的均分布模型。
回頭看,我們在這一小節中使用K-L散度作為目標方程,分別找到了二項式分布模型的參數p=0.57
和上面這個隨手建立的模型的參數p=0.47
。是的,這就是本節的重點:使用K-L散度作為目標方程來優化模型。當然,本節中的模型都只有一個參數,也可以拓展到有更多參數的高維模型中。
變分自編碼器VAEs和變分貝葉斯法
如果你熟悉神經網絡,你肯能已經猜到我們接下來要學習的內容。除去神經網絡結構的細節信息不談,整個神經網絡模型其實是在構造一個參數數量巨大的函數(百萬級,甚至更多),不妨記為f(x)
,通過設定目標函數,可以訓練神經網絡逼近非常復雜的真實函數g(x)
。訓練的關鍵是要設定目標函數,反饋給神經網絡當前的表現如何。訓練過程就是不斷減小目標函數值的過程。
我們已經知道K-L散度用來度量在逼近一個分布時的信息損失量。K-L散度能夠賦予神經網絡近似表達非常復雜數據分布的能力。變分自編碼器(Variational Autoencoders,VAEs)是一種能夠學習最佳近似數據集中信息的常用方法,Tutorial on Variational Autoencoders 2016是一篇關于VAEs的非常不錯的教程,里面講述了如何構建VAE的細節。 What are Variational Autoencoders? A simple explanation簡單介紹了VAEs,Building Autoencoders in Keras介紹了如何利用Keras庫實現幾種自編碼器。
變分貝葉斯方法(Variational Bayesian Methods)是一種更常見的方法。這篇文章介紹了強大的蒙特卡洛模擬方法能夠解決很多概率問題。蒙特卡洛模擬能夠幫助解決許多貝葉斯推理問題中的棘手積分問題,盡管計算開銷很大。包括VAE在內的變分貝葉斯方法,都能用K-L散度生成優化的近似分布,這種方法對棘手積分問題能進行更高效的推理。更多變分推理(Variational Inference)的知識可以訪問Edward library for python。
因為本人沒有學習過VAE和變分推理,所以本節內容質量無法得到保證,我會聯系這方面的朋友來改善本節內容,也歡迎大家在評論區給出建議
譯自:Kullback-Leibler Divergence Explained
作者:Will Kurt
If you enjoyed this post please subscribe to keep up to date and follow @willkurt!
If you enjoyed this writing and also like programming languages, you might like the book on Haskell I just finished due in print July 2017 (though nearly all the content is available online today).
附錄
-
K-L 散度的定義
define K-L divergence -
計算K-L的注意事項
notice -
遇到
log 0
時怎么辦
example for K-L smoothing 信息熵、交叉熵、相對熵
- 信息熵,即熵,香濃熵。編碼方案完美時,最短平均編碼長度。
- 交叉熵,cross-entropy。編碼方案不一定完美時(由于對概率分布的估計不一定正確),平均編碼長度。是神經網絡常用的損失函數。
- 相對熵,即K-L散度,relative entropy。編碼方案不一定完美時,平均編碼長度相對于最小值的增加值。
更詳細對比,見知乎如何通俗的解釋交叉熵與相對熵?
- 為什么在神經網絡中使用交叉熵損失函數,而不是K-L散度?
K-L散度=交叉熵-熵,即DKL( p||q )=H(p,q)?H(p)
。
在神經網絡所涉及到的范圍內,H(p)
不變,則DKL( p||q )
等價H(p,q)
。
更多討論見Why do we use Kullback-Leibler divergence rather than cross entropy in the t-SNE objective function?和Why train with cross-entropy instead of KL divergence in classification?