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. 從條件 [公式] 中取出數據稱為“正樣本”,它是根據上下文 [公式] 所做出的預測數據,將它和這個上下文一起組成“正樣本對”,類別標簽設為 1。
  2. 將從 [公式] 中取出的樣本稱為“負樣本”,它是與當前上下文 [公式] 沒有必然關系的隨機數據,將它和這個上下文 [公式] 一起組成“負樣本對”,類別標簽設為 0。
  3. 正樣本也就是與 [公式] 間隔固定步長 [公式] 的數據,根據 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 要解決的是歸一化參數密度估計問題。

假設現在有一組觀測樣本 [公式] ,它遵循一個未知的參數化概率密度函數 [公式] ,參數密度估計問題就是根據觀測樣本 [公式] 找到一組最優參數 [公式] ,通常使用極大似然估計的方法。對於這個密度函數 [公式] 的估計還需要滿足下面兩個約束條件:

  1. [公式]
  2. [公式]

如果同時滿足上面兩個約束條件,那么稱建模的密度函數是歸一化的;如果只滿足第 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]. 

[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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM