深度学习中的互信息:无监督提取特征
作者丨蘇劍林
單位丨廣州火焰信息科技有限公司
研究方向丨NLP,神經網絡
個人主頁丨kexue.fm
對于 NLP 來說,互信息是一個非常重要的指標,它衡量了兩個東西的本質相關性。筆者曾多次討論過互信息,本人也對各種利用互信息的文章頗感興趣。前段時間看到了最近提出來的 Deep INFOMAX 模型 [1],用最大化互信息來對圖像做無監督學習,自然也頗感興趣,研讀了一番,就得到了本文。?
本文整體思路源于 Deep INFOMAX 的原始論文,但并沒有照搬原始模型,而是按照這自己的想法改動了模型(主要是先驗分布部分),并且會在相應的位置進行注明。
▲?隨機采樣的KNN樣本
我們要做什么
自編碼器
特征提取是無監督學習中很重要且很基本的一項任務,常見形式是訓練一個編碼器將原始數據集編碼為一個固定長度的向量。自然地,我們對這個編碼器的基本要求是:保留原始數據的(盡可能多的)重要信息。?
我們怎么知道編碼向量保留了重要信息呢?一個很自然的想法是這個編碼向量應該也要能還原出原始圖片出來,所以我們還訓練一個解碼器,試圖重構原圖片,最后的 loss 就是原始圖片和重構圖片的 mse。這導致了標準的自編碼器的設計。后來,我們還希望編碼向量的分布盡量能接近高斯分布,這就導致了變分自編碼器。?
重構的思考
然而,值得思考的是“重構”這個要求是否合理??
首先,我們可以發現通過低維編碼重構原圖的結果通常是很模糊的,這可以解釋為損失函數 mse 要求“逐像素”重建過于苛刻。又或者可以理解為,對于圖像重構事實上我們并沒有非常適合的 loss 可以選用,最理想的方法是用對抗網絡訓練一個判別器出來,但是這會進一步增加任務難度。?
其次,一個很有趣的事實是:我們大多數人能分辨出很多真假幣,但如果要我們畫一張百元大鈔出來,我相信基本上畫得一點都不像。這表明,對于真假幣識別這個任務,可以設想我們有了一堆真假幣供學習,我們能從中提取很豐富的特征,但是這些特征并不足以重構原圖,它只能讓我們分辨出這堆紙幣的差異。也就是說,對于數據集和任務來說,合理的、充分的特征并不一定能完成圖像重構。
最大化互信息
互信息
上面的討論表明,重構不是好特征的必要條件。好特征的基本原則應當是“能夠從整個數據集中辨別出該樣本出來”,也就是說,提取出該樣本(最)獨特的信息。如何衡量提取出來的信息是該樣本獨特的呢?我們用“互信息”來衡量。?
讓我們先引入一些記號,用 X 表示原始圖像的集合,用 x∈X 表示某一原始圖像,Z 表示編碼向量的集合,z∈Z 表示某個編碼向量,p(z|x) 表示 x 所產生的編碼向量的分布,我們設它為高斯分布,或者簡單理解它就是我們想要尋找的編碼器。那么可以用互信息來表示 X,Z 的相關性。
這里的 p?(x) 原始數據的分布,p(z) 是在 p(z|x) 給定之后整個 Z 的分布,即:
那么一個好的特征編碼器,應該要使得互信息盡量地大,即:
互信息越大意味著(大部分的)應當盡量大,這意味著 p(z|x) 應當遠大于 p(z),即對于每個 x,編碼器能找出專屬于 x 的那個 z,使得 p(z|x) 的概率遠大于隨機的概率 p(z)。這樣一來,我們就有能力只通過 z 就從中分辨出原始樣本來。
注意:(1) 的名稱為互信息,而對數項我們稱為“點互信息”,有時也直接稱為互信息。兩者的差別是:(1) 計算的是整體關系,比如回答“前后兩個詞有沒有關系”的問題;計算的是局部關系,比如回答“‘忐’和‘忑’是否經常連在一起出現”的問題。
先驗分布
前面提到,相對于自編碼器,變分自編碼器同時還希望隱變量服從標準正態分布的先驗分布,這有利于使得編碼空間更加規整,甚至有利于解耦特征,便于后續學習。因此,在這里我們同樣希望加上這個約束。?
Deep INFOMAX 論文中通過類似 AAE 的思路通過對抗來加入這個約束,但眾所周知對抗是一個最大最小化過程,需要交替訓練,不夠穩定,也不夠簡明。這里提供另一種更加端到端的思路:設 q(z) 為標準正態分布,我們去最小化 p(z) 與先驗分布 q(z) 的 KL 散度。
將 (1) 與 (4) 加權混合起來,我們可以得到最小化的總目標:
看起來很清晰很美好,但是我們還不知道 p(z) 的表達式,也就沒法算下去了,因此這事還沒完。
逐個擊破
簡化先驗項
有意思的是式 (5) 的 loss 進行稍加變換得到:
注意上式正好是互信息與的加權求和,而 KL(p(z|x)‖q(z)) 這一項是可以算出來的(正好是 VAE 的那一項 KL 散度),所以我們已經成功地解決了整個 loss 的一半,可以寫為:
下面我們主攻互信息這一項。
互信息本質
現在只剩下了互信息這一項沒解決了,怎么才能最大化互信息呢?我們把互信息的定義 (1) 稍微變換一下:
這個形式揭示了互信息的本質含義:p(z|x)p?(x) 描述了兩個變量 x,z 的聯合分布,p(z)p?(x) 則是隨機抽取一個 x 和一個 z 時的分布(假設它們兩個不相關時),而互信息則是這兩個分布的 KL 散度。而所謂最大化互信息,就是要拉大 p(z|x)p?(x) 與 p(z)p?(x) 之間的距離。?
注意 KL 散度理論上是無上界的,我們要去最大化一個無上界的量,這件事情有點危險,很可能得到無窮大的結果。所以,為了更有效地優化,我們抓住“最大化互信息就是拉大 p(z|x)p?(x) 與 p(z)p?(x) 之間的距離”這個特點,我們不用 KL 散度,而換一個有上界的度量:JS 散度(當然理論上也可以換成 Hellinger 距離,請參考 f-GAN簡介:GAN模型的生產車間 [2]),它定義為:
JS 散度同樣衡量了兩個分布的距離,但是它有上界,我們最大化它的時候,同樣能起到類似最大化互信息的效果,但是又不用擔心無窮大問題。于是我們用下面的目標取代式 (7):
當然,這并沒有改變問題的本質和難度,JS 散度也還是沒有算出來。下面到了攻關的最后一步。
攻克互信息
在文章?f-GAN簡介:GAN模型的生產車間?[2]?中,我們介紹了一般的 f 散度的局部變分推斷,即那篇文章中的式 (13):
對于 JS 散度,給出的結果是:
代入 p(z|x)p?(x),p(z)p?(x) 就得到:
你沒看錯,除去常數項不算,它就完全等價于 deep INFOMAX 論文中的式 (5)。我很奇怪,為什么論文作者放著上面這個好看而直觀的形式不用,非得故弄玄虛搞個讓人茫然的形式。
其實 (12) 式的含義非常簡單,它就是“負采樣估計”:引入一個判別網絡 σ(T(x,z)),x 及其對應的 z 視為一個正樣本對,x 及隨機抽取的 z 則視為負樣本,然后最大化似然函數,等價于最小化交叉熵。?
這樣一來,通過負采樣的方式,我們就給出了估計 JS 散度的一種方案,從而也就給出了估計 JS 版互信息的一種方案,從而成功攻克了互信息。現在,對應式 (9),具體的 loss 為:
現在,理論已經完備了,剩下的就是要付諸實踐了。
從全局到局部
batch內打亂
從實驗上來看,式 (13) 就是要怎么操作呢?先驗分布的 KL 散度那一項不難辦,照搬 VAE 的即可。而互信息那一項呢??
首先,我們隨機選一張圖片 x,通過編碼器就可以得到 z 的均值和方差,然后重參數就可以得到 zx,這樣的一個 (x,zx) 對構成一個正樣本。
負樣本呢?為了減少計算量,我們直接在 batch 內對圖片進行隨機打亂,然后按照隨機打亂的順序作為選擇負樣本的依據,也就是說,如果 x 是原來 batch 內的第 4 張圖片,將圖片打亂后第 4 張圖片是 x? ,那么 (x,zx) 就是正樣本,(x?,zx) 就是負樣本。?
局部互信息
上面的做法,實際上就是考慮了整張圖片之間的關聯,但是我們知道,圖片的相關性更多體現在局部中(也就是因為這樣所以我們才可以對圖片使用 CNN)。換言之,圖片的識別、分類等應該是一個從局部到整體的過程。因此,有必要把“局部互信息”也考慮進來。?
通過 CNN 進行編碼的過程一般是:
我們已經考慮了 x 和 z 的關聯,那么中間層特征(feature map)和 z 的關聯呢?我們記中間層特征為 {Cij(x)|i=1,2,…,h;j=1,2,…,w} 也就是視為 h×w 個向量的集合,我們也去算這 h×w 個向量跟 zx 的互信息,稱為“局部互信息”。?
估算方法跟全局是一樣的,將每一個 Cij(x) 與 zx 拼接起來得到 [Cij(x),zx],相當于得到了一個更大的 feature map,然后對這個 feature map 用多個 1x1 的卷積層來作為局部互信息的估算網絡 Tlocal。負樣本的選取方法也是用在 batch 內隨機打算的方案。?
現在,加入局部互信息的總 loss 為:
其他信息
其實,還有很多其他的信息可以考慮進去。?
比如我們已經考慮了 Cij 與 z 的互信息,還可以考慮的是 Cij 之間的互信息,即同一張圖片之間的 Cij 應當是有關聯的,它們的互信息應該盡可能大(正樣本),而不同圖片之間的 Cij 應當是沒關聯的,它們的互信息應該盡可能小。不過我實驗過,這一項的提升不是特別明顯。?
還有多尺度信息,可以手動在輸入圖片那里做多尺度的數據擴增,又或者是在編碼器這些引入多尺度結構、Attention 結構。諸如此類的操作,都可以考慮引入到無監督學習中,提高編碼質量。
類似的word2vec
其實,熟悉 NLP 中的 word2vec 模型原理的讀者應該會感覺到:這不就是圖像中的 word2vec 嗎??
沒錯,在原理和做法上 deep INFOMAX 跟 word2vec 大體都一樣。在 word2vec 中,也是隨機采集負樣本,然后通過判別器來區分兩者的過程。這個過程我們通常稱為“噪聲對比估計”,我們之前也提到過,word2vec 的噪聲對比估計過程(負采樣)的實際優化目標就是互信息,細節請參考“噪聲對比估計”雜談:曲徑通幽之妙。
word2vec 中,固定了一個窗口大小,然后在窗口內統計詞的共現(正樣本)。而 deep INFOMAX 呢?因為只有一張圖片,沒有其他“詞”,所以它干脆把圖片分割為一個個小塊,然后把一張圖片當作一個窗口,圖片的每個小塊就是一個個詞了。當然,更準確地類比的話,deep INFOMAX 更像類似 word2vec 的那個 doc2vec 模型。?
換個角度來想,也可以這樣理解:局部互信息的引入相當于將每個小局部也看成了一個樣本,這樣就相當于原來的 1 個樣本變成了 1+hw 個樣本,大大增加了樣本量,所以能提升效果。
同時這樣做也保證了圖片的每一個“角落”都被用上了,因為低維壓縮編碼,比如 32×32×3 編碼到 128 維,很可能左上角的 8×8×3>128 的區域就已經能夠唯一分辨出圖片出來了,但這不能代表整張圖片,因此要想辦法讓整張圖片都用上。
開源和效果圖
參考代碼
其實上述模型的實現代碼應當說還是比較簡單的,總比我復現 Glow 模型容易幾十倍。不管用哪個框架都不困難,下面是用 Keras 實現的一個版本:
https://github.com/bojone/infomax
來,上圖片
無監督的算法好壞比較難定量判斷,一般都是通過做很多下游任何看效果的。就好比當初詞向量很火時,怎么定量衡量詞向量的質量也是一個很頭疼的問題。deep INFOMAX 論文中做了很多相關實驗,我這里也不重復了,只是看看它的 KNN 效果(通過一張圖片查找最相近的 k 張圖片)。?
總的來說效果差強人意,我覺得精調之后做一個簡單的以圖搜圖問題不大。原論文中的很多實驗效果也都不錯,進一步印證了該思路的威力。
CIFAR-10
每一行的左邊第一張是原始圖片,右邊 9 張是最鄰近圖片,用的是 cos 相似度。用歐氏距離的排序結果類似。
Tiny ImageNet
每一行的左邊第一張是原始圖片,右邊 9 張是最鄰近圖片,用的是 cos 相似度。用歐氏距離的排序結果類似。
全局 vs 局部
局部互信息的引入是很必要的,下面比較了只有全局互信息和只有局部互信息時的 KNN 的差異。
又到終點站
作為無監督學習的成功,將常見于 NLP 的互信息概念一般化、理論化,然后用到了圖像中。當然,現在看來它也可以反過來用回 NLP 中,甚至用到其他領域,因為它已經被抽象化了,適用性很強。?
deep INFOMAX 整篇文章的風格我是很喜歡的:從一般化的理念(互信息最大化)到估算框架再到實際模型,思路清晰,論證完整,是我心中的理想文章的風格(除了它對先驗分布的處理用了對抗網絡,我認為這是沒有必要的)。期待看到更多的這類文章。
參考文獻
[1].?Learning Deep Representations by Mutual Information Estimation and Maximization R Devon Hjelm, Alex Fedorov, Samuel Lavoie, Karan Grewal, Phil Bachman, Adam Trischler, Yoshua Bengio. ArXiv 1808.06670.
[2].?https://kexue.fm/archives/6016
點擊以下標題查看作者其他文章:?
變分自編碼器VAE:原來是這么一回事 | 附開源代碼
再談變分自編碼器VAE:從貝葉斯觀點出發
變分自編碼器VAE:這樣做為什么能成?
RealNVP與Glow:流模型的傳承與升華
全新視角:用變分推斷統一理解生成模型
細水長flow之NICE:流模型的基本概念與實現
細水長flow之f-VAEs:Glow與VAEs的聯姻
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點擊 |?閱讀原文?| 查看作者博客
總結
以上是生活随笔為你收集整理的深度学习中的互信息:无监督提取特征的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本周六与您相约 | 计算未来轻沙龙:让机
- 下一篇: 岗位推荐 | 百度视觉技术部招聘移动端视