如何理解K-L散度(相對熵)

轉自於:https://www.jianshu.com/p/43318a3dc715?from=timeline&isappinstalled=0,如有侵權,請聯繫我刪除。

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。分佈圖如下:

uniform distribution

顯然我們的原始數據並非均分佈的,但也不是我們已知的分佈,至少不是常見的分佈。作爲備選,我們想到的另一種簡單模型是二項式分佈binomial distribution。蠕蟲嘴裏面共有n=10個牙槽,每個牙槽出現牙齒與否爲獨立事件,且概率均爲p。則蠕蟲牙齒數量即爲期望值E[x]=n*p,真實期望值即爲觀察數據的平均值,比如說5.7,則p=0.57,得到如下圖所示的二項式分佈:

binomial

對比一下原始數據,可以看出均分佈和二項分佈都不能完全描述原始分佈。

 

all distributions

可是,我們不禁要問,哪一種分佈更加接近原始分佈呢?
已經有許多度量誤差的方式存在,但是我們所要考慮的是減小發送的信息量。上面討論的均分佈和二項式分佈都把問題規約到只需要兩個參數,牙齒數量和概率值(均分佈只需要牙齒數量即可)。那麼哪個分佈保留了更多的原始數據分佈的信息呢?這個時候就需要K-L散度登場了。

數據的熵

K-L散度源於信息論。信息論主要研究如何量化數據中的信息。最重要的信息度量單位是Entropy,一般用H表示。分佈的熵的公式如下:

Entropy

上面對數沒有確定底數,可以是2e10,等等。如果我們使用以2爲底的對數計算H值的話,可以把這個值看作是編碼信息所需要的最少二進制位個數bits。上面空間蠕蟲的例子中,信息指的是根據觀察所得的經驗分佈給出的蠕蟲牙齒數量。計算可以得到原始數據概率分佈的熵值爲3.12 bits。這個值只是告訴我們編碼蠕蟲牙齒數量概率的信息需要的二進制位bit的位數。

可是熵值並沒有給出壓縮數據到最小熵值的方法,即如何編碼數據才能達到最優(存儲空間最優)。優化信息編碼是一個非常有意思的主題,但並不是理解K-L散度所必須的。熵的主要作用是告訴我們最優編碼信息方案的理論下界(存儲空間),以及度量數據的信息量的一種方式。理解了熵,我們就知道有多少信息蘊含在數據之中,現在我們就可以計算當我們用一個帶參數的概率分佈來近似替代原始數據分佈的時候,到底損失了多少信息。請繼續看下節內容。↓↓↓

K-L散度度量信息損失

只需要稍加修改熵H的計算公式就能得到K-L散度的計算公式。設p爲觀察得到的概率分佈,q爲另一分佈來近似p,則pqK-L散度爲:

entropy-p-q

顯然,根據上面的公式,K-L散度其實是數據的原始分佈p和近似分佈q之間的對數差值的期望。如果繼續用2爲底的對數計算,則K-L散度值表示信息損失的二進制位數。下面公式以期望表達K-L散度:

DKL1

一般,K-L散度以下面的書寫方式更常見:

DKL2

注:log a - log b = log (a/b)

OK,現在我們知道當用一個分佈來近似另一個分佈時如何計算信息損失量了。接下來,讓我們重新回到最開始的蠕蟲牙齒數量概率分佈的問題。

對比兩種分佈

首先是用均分佈來近似原始分佈的K-L散度:

DKL-uniform

接下來計算用二項式分佈近似原始分佈的K-L散度:

DKL-binomial

通過上面的計算可以看出,使用均分佈近似原始分佈的信息損失要比用二項式分佈近似小。所以,如果要從均分佈和二項式分佈中選擇一個的話,均分佈更好些。

散度並非距離

很自然地,一些同學把K-L散度看作是不同分佈之間距離的度量。這是不對的,因爲從K-L散度的計算公式就可以看出它不符合對稱性(距離度量應該滿足對稱性)。如果用我們上面觀察的數據分佈來近似二項式分佈,得到如下結果:

DKL-notdistance

所以,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值變化曲線

通過上面的曲線圖可以看出,K-L散度值在圓點處最小,即p=0.57。所以我們之前的二項式分佈模型已經是最優的二項式模型了。注意,我已經說了,是而像是模型,這裏只限定在二項式模型範圍內。

前面只考慮了均分佈模型和二項式分佈模型,接下來我們考慮另外一種模型來近似原始數據。首先把原始數據分成兩部分,1)0-5顆牙齒的概率和 2)6-10顆牙齒的概率。概率值如下:

 

ad hoc model


即,一隻蠕蟲的牙齒數量x=i的概率爲p/5; x=j的概率爲(1-p) / 6i=0,1,2,3,4,5; j=6,7,8,9,10
Aha,我們自己建立了一個新的(奇怪的)模型來近似原始的分佈,模型只有一個參數p,像前面那樣優化二項式分佈的時候所做的一樣,讓我們畫出K-L散度值隨p變化的情況:

 

finding an optimal parameter value for our ad hoc model

p=0.47時,K-L值取最小值0.338。似曾相識嗎?對,這個值和使用均分佈的K-L散度值是一樣的(這並不能說明什麼)!下面我們繼續畫出這個奇怪模型的概率分佈圖,看起來確實和均分佈的概率分佈圖相似:

ad hoc model distribution

我們自己都說了,這是個奇怪的模型,在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).

附錄

  1. K-L 散度的定義

     

    define K-L divergence

  2. 計算K-L的注意事項

     

    notice

  3. 遇到log 0時怎麼辦

    example for K-L smoothing

     

  4. 信息熵、交叉熵、相對熵

  • 信息熵,即熵,香濃熵。編碼方案完美時,最短平均編碼長度。
  • 交叉熵,cross-entropy。編碼方案不一定完美時(由於對概率分佈的估計不一定正確),平均編碼長度。是神經網絡常用的損失函數。
  • 相對熵,即K-L散度,relative entropy。編碼方案不一定完美時,平均編碼長度相對於最小值的增加值。
    更詳細對比,見知乎如何通俗的解釋交叉熵與相對熵?
  1. 爲什麼在神經網絡中使用交叉熵損失函數,而不是K-L散度?
    K-L散度=熵-交叉熵,即 DKL( p||q )=H(p)-H(p,q)
    在神經網絡所涉及到的範圍內,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?

 



作者:Aspirinrin
鏈接:https://www.jianshu.com/p/43318a3dc715
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

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