對於 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 整篇文章的風格我是很喜歡的:從一般化的理念(互資訊最大化)到估算框架再到實際模型,思路清晰,論證完整,是我心中的理想文章的風格(除了它對先驗分佈的處理用了對抗網路,我認為這是沒有必要的)。期待看到更多的這類文章。