Noise Contrastive Estimation --- 从 NCE 到 InfoNCE
轉載:https://zhuanlan.zhihu.com/p/334772391
Noise Contrastive Estimation 前世今生——從 NCE 到 InfoNCE
0 前言
作為剛入門自監督學習的小白,在閱讀其中 Contrastive Based 方法的自監督論文時,經常會看到 InfoNCE 這個 loss(在 CPC 的論文中提出),之前只知道它的思想來自于 NCE 以及代表什么含義,但是對其背后的理論推導、以及如何從 NCE 遷移到 InfoNCE 的不太清楚,因此這篇文章就是通過理論推導和自己的理解來對 NCE 和 InfoNCE 的來龍去脈有個了解。(這篇文章著重于原理,因此公式和推導較多)
1 從 NLP 入手
1.1 背景
NCE,也就是 Noise Contrastive Noise(噪聲對比估計), 在 [2] 這篇論文中被提出,但是這篇論文的闡述的不太便于理解,并且論文中估計的是概率密度函數(pdf, probability density function)。而 NLP 中的 word 或 vision 中的 pixel 都是離散的,且我們感興趣的是的概率質量函數(pmf, probability mass function),因此我主要參考了 [4] 這篇論文,它就是在使用 NCE 時假設了離散分布,并用 pmf 代替其中 pdf,然后將 NCE 應用到 NLP 領域。(我對 NLP 領域不是很了解,所以部分闡述方式可能會不嚴謹)。
1.2 n-gram
語言模型(language model)就是假設一門語言所有可能的句子服從一個概率分布,每個句子出現的概率加起來是1,那么語言模型的任務就是預測每個句子在語言中出現的概率。如果把句子看成單詞的序列,那么語言模型就是建模一個來計算這個句子出現的概率,直觀上我們要得到這個語言模型,基于鏈式法則可以表示為每個單詞出現的條件概率的乘積,我們將條件概率的條件稱為單詞的上下文,用表示。
可以看到,language model 就是條件概率的集合,但是直接計算每個在語料庫中的條件概率是需要很大計算量的。因此在統計語言模型中,引入了馬爾可夫假設,即“一個詞出現的概率只與它前面出現的有限的一個或者 n 個詞有關”,將這個詞稱為一個 gram,這就是著名的 n-gram 模型,因此可以將模型簡化為:
1.3 最大似然估計
上面的 n-gram 構建語言模型的方法實際上就是,將一個訓練語料庫中的每個和它的(也就是由前面n個構成)的條件概率計算出來并儲存(實際操作上是統計每個gram出現的次數),然后下一次計算某個句子的出現的概率時,即式,就在存儲中找到這個句子中出現的和的條件概率,然后乘起來即可。
因此,我們是否可以不事先計算并存儲每個和條件概率,而是建立一個模型(或者說函數),給這個模型一組和就能輸出它們的條件概率。
在機器學習領域有一個方法是:對所要考慮的問題建模后為其構造一個目標函數,然后對這個目標函數進行優化,從而求得一組最優的參數,最后利用這組最優參數對應的模型進行預測,也就是最大似然估計。
在建模統計語言模型時,利用最大似然估計,根據式目標函數,我們可以寫出其對數似然函數如下:
然后最大化對數似然函數,實際上這樣就是將看成和的函數,為待定參數集:
這樣一旦最優參數集可以確定,函數就被唯一確定,那么對于任何概率都可以用函數來計算了。
1.4 神經概率語言模型
上面的方法似然看起來很美好,但其中有兩個問題:
如何構造一個好的函數。
最大似然估計雖然理論上簡單可行,但對于某些模型,在實際計算時可能需要很大的計算量,因此未必容易。
首先來看第一個問題,這也就是我們為什么引入神經網絡,因為神經網絡理論上可以表示任何函數,那么通過訓練,肯定能找到這個合適的,因此 Bengio 等人在 2003 年 A Neural Probabilistic Language Model [8] 中提出了神經概率語言模型(NPLM)。其不在受限于 gram 的大小,可以在包含任意大小上下文的情況下建模的條件概率。
具體來看,它把語言模型的建立當作一個多分類問題,我們用表示一個包含所有單詞的單詞庫,其大小為,將當成一對訓練樣本(實際上會轉換成詞向量,這里不做詳解),通過神經網絡后和 softmax 后,輸出一個向量, 其中每一維表示上下文為時 第個單詞是單詞庫中第個單詞的概率,訓練過程要求最后單詞庫中概率最大的單詞就是訓練樣本對中的。這樣訓練結束后,給神經網絡一個上下文,神經網絡就能預測在當前上下文時,下一個 單詞是單詞庫中的各個詞的概率,通過這個我們也就可以構建語言模型。
我們知道,這種方法本質上就是擬合一個和的函數,或者說建立一個參數集為條件概率分布,只要給出當前上下文,我們就能夠直接計算下一個單詞的概率。
假設輸入到 softmax 前的結果用表示,實際上是有含義的,它是一個 socring function ,輸出的分數用來量化在上下文中匹配性,那么條件概率可以表示為以下形式:
式中,表示下一個單詞是這個在單詞庫中的概率;令表示當前單詞庫中所有單詞的概率的累和,通常將這一項叫做“配分函數”或“歸一化因子”。一般來說,單詞庫的數量是非常巨大的,因此計算是非常昂貴、耗時的一件事,這也就是 NCE 要解決的問題。(見附錄1)
如果我們不考慮的具體形式,那么式實際上就可以當作我們在式中所構造的函數的表達式, 既然如此,那我們接著用 1.3 中提到的最大似然估計的方式來試著求解的參數。我們將從句子中取樣的看成經驗分布(數據分布),式中的可以寫成:
現在要最大化,那么將其關于求導:
這里解釋一下上面到最后一步的轉換,因為,其中為單詞庫中所有的單詞,而單詞庫其中每個單詞的概率由產生,因此,與經驗分布不相關,所以可以把期望去掉。
式結果中的計算如下:
將式結果帶回式中得:
最大似然好像很容易,但是實際上還是繞不開對“歸一化常數”的計算,所以就需要 NCE 登場了。
2 什么是 NCE
上一節中說明了計算非常昂貴這個問題需要解決,一個簡單的思路是將也看出模型的一個參數來進行訓練,但是這種方法不適合于上面提到的最大似然估計,因為由式可以看出來,它會直接將趨于來獲得最大似然。因此,有人提利用這個思想提出了一些不定義,直接用估計模型的方法,如contrastive divergence (Hinton, 2002)和score matching (Hyvarinen, 2005)。(見附錄2)
而 NCE 不同于上面兩種方法,它是通過最大化同一個目標函數來估計模型參數和歸一化常數,NCE 的核心思想就是通過學習數據分布樣本和噪聲分布樣本之間的區別,從而發現數據中的一些特性,因為這個方法需要依靠與噪聲數據進行對比,所以稱為“噪聲對比估計(Noise Contrastive Estimation)”。更具體來說,NCE 將問題轉換成了一個二分類問題,分類器能夠對數據樣本和噪聲樣本進行二分類,而這個分類器的參數就等價于1.4中我們想要得到。(見附錄3)
現在假設一個特定上下文的數據分布為,我們稱從它里面取出的樣本為正樣本,令類別;而另一個與無關的噪聲分布為,我們稱從里面取出的樣本為負樣本,令類別為。遵循Gutmann and Hyvrinen (2012) [3]中的設置,假設現在取出了個正樣本和個負樣本,將這些正負樣本混合形成一個混合分布。
我們得到下面這些概率:
所以可以計算后驗概率:
我們令負樣本和正樣本的比例為:,則有:
現在我們觀察式,NCE 所做的事情就是將式中的經驗分布替換成概率模型,使后驗概率成為參數為的函數。但問題是這樣現在這樣的形式還是需要計算,我們只是將原來問題進行了一定的轉換從而引入了噪聲分布。為了解決這個問題,NCE 做了兩個設定:
一個就是前面提到的,將作為一個參數來進行估計,相當于引進了一個新的參數。
第二個是,事實證明(Mnih and Teh, 2012),對于參數很多的神經網絡來說,我們將固定為 1 對每個仍是有效的。
第二個設定,即減少了參數的數量,又使模型的輸出符合”歸一化“的性質(即),是很合理的,如果,由式可以得到, 那么式可以寫成如下形式,即具有參數的后驗概率:
現在我們有了參數為的二元分類問題,假設標簽為伯努利分布,那么很容易寫出他的條件對數似然如下,實際上在它前面加上負號后,也就等價于 logistics 分類里的 log loss,或者說交叉熵損失函數:
而NCE 的目標函數還需要在式的基礎上除以正樣本的數量,即
當數據數量很大時,根據大數定律,上式也可以寫成:
要最大化上述對數似然函數,也就是最大化如下目標函數:
NCE 目標函數中的實際上就是在設置“二分類問題”時,選取的負樣本與正樣本的比例,通常的做法會默認正樣本數量為 1 ,然后將負樣本的數量作為一個手動輸入的參數,從而確定這個比例。在TensorFlow 的相關源碼中,正樣本的數量 num_true 默認值為1,如果設置大于 1,那么會進行一個的歸一化。
可以看到實際上這個比例對我們的 NCE 優化是有影響的,所以 NCE 的作者也考慮了什么樣的比例是最好的,我這里就直接說結論了,有興趣的可以看詳細看下這篇論文Gutmann and Hyvrinen (2012) [3]。
結論是:對于設置的噪聲分布,我們實際上是希望它盡量接近數據分布,否則這個二分類任務就過于簡單了,也就無法很好的學到數據特性。而作者通過實驗和推導證明(我在第三節中也會簡單的證明),當負樣本和正樣本數量之比越大,那么我們的 NCE對于噪聲分布好壞的依賴程度也就越小。換句話說,作者建議我們在計算能力運行的條件下,盡可能的增大比值。也許這也就是大家都默認將正樣本數量設置為 1 的原因:正樣本至少取要 1 個,所以最大化比值,也就是盡可能取更多負樣本的同時,將正樣本數量取最小值 1。
另外,如果我們希望目標函數不是只針對一個特定的上下文,而是使不同的上下文可以共享參數,也就是設置一批上下文的全局目標函數:
到這,NCE 的構建就完成了,總結一下就是:從上下文中取出單詞作為正樣本,從噪聲分布中取出單詞作為負樣本,正負樣本數量比為,然后訓練一個二分類器,通過一個類似于交叉熵損失函數的目標函數進行訓練(如果取正樣本數量為 1,那么式與式等價,NCE 目標函數就等價于交叉熵損失函數)。
3 NCE 的原理
上面雖然推導了那么多公式,但實際只是按照 NCE 的思想進行問題的轉換,那么這樣做究竟是否正確呢?根據附錄 3的描述,直覺上看好像是沒有問題的。
我們再看回式,我們對它關于進行求導:
分布對上面的兩項進行求導:
將上面兩個結果再帶回式中,并根據前面的設定,也就是:
上一節中我們設定了,也就是,因此:
這里的參數依然指的是負樣本與正樣本數量的比例,如果我們令的話,那么:
可以看到,當趨于無窮時,式中 NCE 目標函數的梯度和式中 MLE 對數似然函數梯度是等價的,也就是說我們通過 NCE 轉換后的優化目標,本質上就是對極大似然估計方法的一種近似,并且隨著負樣本和正樣本數量比的增大,這種近似越精確,這也解釋了為什么作者建議我們將設置的越大越好。
4 從 NCE 到 InfoNCE
到目前為止,應該對 NCE 的來龍去脈比較清楚了(公式太多,不知道多少人有耐心看到這里了...)。
InfoNCE 是在Representation Learning with Contrastive Predictive Coding這篇論文中提出的,這里不會具體介紹 CPC ,而是著重說明如何借鑒 NCE 的思想提出 InfoNCE 并用于 CPC 中的,如果還不太了解的可以看我的這篇文章”對 CPC (對比預測編碼) 的理解“。
簡單來說,CPC(對比預測編碼) 就是一種通過無監督任務來學習(編碼)高維數據的特征表示(representation),而通常采取的無監督策略就是根據上下文預測未來或者缺失的信息,NLP 中已經利用這種思想來學習 word 的 representation [1]。
要構建這樣的預測任務,一個方法是直接建模條件生成模型根據當前上下文預測個時刻后的數據(假設是像文本、語音中那樣的序列數據);但作者覺得這樣的方法過于針對細節進行重建,并不是很好,于是引入了互信息的思想,認為我們可以通過最大化當前上下文和要未來的數據之間的互信息來構建預測任務,互信息的表示如下:
我們沒辦法知道和之間的聯合分布,因此要最大化,就需要從入手,即最大化。
那么如何訓練呢?我們可以把這個比例定義為密度比,那么根據附錄 3中的思想,分子就相當于,是我們想得到的目標函數;分母就相當于,是用來進行對比的參考分布(噪聲)。因此,我們就可以根據 NCE 中提供的思路,將問題轉換為一個二分類的問題,更具體來解釋:
從條件中取出數據稱為“正樣本”,它是根據上下文所做出的預測數據,將它和這個上下文一起組成“正樣本對”,類別標簽設為 1。
將從中取出的樣本稱為“負樣本”,它是與當前上下文沒有必然關系的隨機數據,將它和這個上下文一起組成“負樣本對”,類別標簽設為 0。
正樣本也就是與間隔固定步長的數據,根據 NCE 中說明的設定,正樣本選取 1 個;因為在 NCE 中證明了噪聲分布與數據分布越接近越好,所以負樣本就直接在當前序列中隨機選?。ㄖ灰皇悄且粋€正樣本就行),負樣本數量越多越好。
所以要做的就是訓練一個 logistics 分類模型,來區分這兩個正負樣本對。問題轉換后,訓練的模型能夠“成功分辨出每個正負樣本的能力”就等價于“根據預測的能力”。
根據 NCE 中的設置,現在假設給出一組大小為的,其中包含個從中取樣正樣本和從一個指定分布(用于對比的噪聲分布),假設第是正樣本,且,上下文表示之前的數據,那么能夠正確的同時找到那一個正樣本和個負樣本的情況可以寫成如下形式:
我們最大化上面這個式子,即最大化模型“成功分辨出每個正負樣本的能力”,也就是最大化我們定義的密度比,也就是最大化與的互信息。
參考式,可以寫出根據預測的形式:
在上式中,我們知道是一個 socring function ,輸出的分數用來量化在上下文中匹配性;放在這里也就是量化對預測的結果和真實結果的相似程度,CPC 文章中用余弦相似度來量化,并且將定義為,也就是:
現在對比兩個式子,這兩個式子的目標是一致的,也就意味著實際上就可以作為密度比的一種表示形式,它們之間雖不直接等價,但是含義上是正相關的,即:
現在我們的優化目標就是使或式的結果最大,所以可以寫出對應形式的交叉熵損失如下:
上式就是最終得到的InfoNCE 損失函數了,并且最小化 InfoNCE,也就等價于最大化和之間互信息的下限,從而做到了我們所要求的最大化,證明如下,
到底為止,如何從由 NCE 結合互信息的思想構建式中的 InfoNCE 也清楚了,現在 InfoNCE 主要用在自監督學習中作為一個對比損失函數,實際上 InfoNCE 的這個思想也是可以作為互信息的一個估計器,在論文中也有證明它和另一個互信息估計器 MINE 之間的關系,這里就不再詳細說明了。
在使用 InfoNCE 時把它當作一個對比損失,那么分子上的表示正樣本對, 分母上的表示負樣本對,我們只要構建好正負樣本對,然后利用 InfoNCE 的優化過程,就可以做到使正樣本對之間的互信息最大,使負樣本對之間的互信息最小這件事情了:
后記
最初目的只是因為看到很多地方直接使用了 InfoNCE(實際上就是 CPC),但沒有說明詳細的原理,網上除了磊爺的文章[6]之外,很多都是浮于表面的解釋,遠不能解答我的疑惑 ,所以作為一個剛入門的小白,我還是想親自推導一下 InfoNCE 的以及它的來源 NCE 的原理,沒想到這個坑越挖越深,最后花的時間遠遠超出我的預期,導致一堆其他事情沒有做....好在最終還是按照我的理解基本弄清楚了(如果有哪里理解錯的地方,請告訴我),也不知道這樣做有沒有意義。
附錄 1——NCE 要解決的問題
實際上NCE 要解決的是歸一化參數密度估計問題。
假設現在有一組觀測樣本,它遵循一個未知的參數化概率密度函數,參數密度估計問題就是根據觀測樣本找到一組最優參數,通常使用極大似然估計的方法。對于這個密度函數的估計還需要滿足下面兩個約束條件:
如果同時滿足上面兩個約束條件,那么稱建模的密度函數是歸一化的;如果只滿足第 2 個正約束條件,那么稱其未歸一化。
在語言模型中說的在 NCE 實際上就是指,指的是 partition function,這里用表示,假設為估計的未歸一化模型,則,而將模型歸一化的方式就是:。而對于,除非的形式特別簡單,否則是沒辦法寫出積分的解析解形式的,只能通過數值積分的方法來近似。這種數值積分對于低維問題是有較高的精度的,但是對于實際應用中的很多高維問題,在計算上就是非常昂貴甚至不可接受的。
附錄 2——將歸一化常數作為參數
這里解釋一下為什么可以將歸一化常數作為一個附加的參數呢。
附錄1中提到可以通過來對進行歸一化,實際上可以看作對進行了一定的縮放,假設歸一化后的密度函數為,則:
因此我們可以把當成一個參數,也就是:
也就是學習一個參數,來對未歸一化的進行大小為的縮放,最終達到歸一化的效果。
附錄 3——用噪聲進行對比的直覺
這里解釋一下用噪聲的分布進行對比的直覺。
按照Gutmann and Hyvrinen(2012) [3]中的解釋(如果真的先弄懂 NCE,強烈推薦閱讀一下這篇論文),估計數據的密度函數實際上是確定觀測數據的屬性,而這種屬性一般需要相對于另一些參考數據(噪聲)的屬性來體現(描述)出來的。如果我們參考(噪聲)數據是從概率密度函數為的分布中獨立同分布采樣出來的 ,相對于的屬性用它們的密度比來描述。那么如果相對數據的分布已知,也就能通過來獲得的密度函數。話句話說,如果我們知道的屬性,也知道了和之間的差異,那么我們也就知道了 $X$ 的屬性。
所以 NCE 中通過訓練一個二分類器來對和中的數據進行比較,為了區分出這兩個數據,分類器就會比較它們屬性的不同,換句話說,這個二分類也就學到了和之間的差異,而這個差異根據式的推導,也確實符合的形式的,實際上也就是訓練了 logistic 分類器。
參考文獻
[1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781, 2013.
[2] Michael Gutmann and Aapo Hyv?rinen. 2010. Noise-contrastive estimation: A new estimation principle for unnormalized statistical models. In Proc. AISTATS.
[3] Gutmann, M.U. and Hyv¨ arinen, A. Noise-contrastive estimation of unnormalized statistical models, with applications to natural image statistics. Journal of Machine Learning Research, 13:307–361, 2012.
[4] Andriy Mnih and Y ee Whye Teh. 2012. A fast and simple algorithm for training neural probabilistic language models. In Proc. ICML.
[5] Aaron van den Oord, Yazhe Li, and Oriol Vinyals. Representation learning with contrastive predictive coding. arXiv preprint arXiv:1807.03748, 2018.
[6] Leo Mao. 2019. "Noise-Contrastive-Estimation". [online].https://leimao.github.io/article/Noise-Contrastive-Estimation/
[7] Dyer, C. (2014). Notes on Noise Contrastive Estimation and Negative Sampling.arXiv:1410.8251 [cs].
[8] Y. Bengio, R. Ducharme, P. Vincent, and C. Jauvin, “A Neural Probabilistic Language Model,” p. 19.
總結
以上是生活随笔為你收集整理的Noise Contrastive Estimation --- 从 NCE 到 InfoNCE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python矩阵的用法(使用numpy)
- 下一篇: 美国批准首个 L3 系统商用,脱手驾驶,