通俗易懂的NCE Loss

NCE loss : Noise Contrastive Estimation

他的直觀想法:把多分類問題轉化成二分類。

之前計算softmax的時候class數量太大,NCE索性就把分類縮減爲二分類問題。

之前的問題是計算某個類的歸一化概率是多少,二分類的問題是input和label正確匹配的概率是多少。

問題:

通常訓練例如word2vec的時候,我們最後用full softmax預測出下一個詞,真實的值通常是一小部分context words,也就是一小部分target classes,在非常大的語料庫中(通常維度爲百萬),softmax需要對每一個class預測出probability,那麼類別總數非常大的時候,這個計算量就非常大。

優化:

我們可不可以針對這麼昂貴的計算 進行優化,不計算所有class的probability,但同時給我們一個合理的loss? 這裏就引入了NCE(Noise-contrastive estimation):

對於每一個訓練樣本(x, T),我們訓練binary classification,而不是multiclass classification。具體一點,我們對於每個樣本,拆分成一個真實的(x,y)pair,另外我們隨機產生k個Noise的(x,y)pair,這樣我們就可以用來訓練處這樣的binary classifier。

(from Stephan Gouws' PhD Dissertation)

用概率來表示,這個問題由之前的P(y|x) 通過x預測所有y,換成了P(x,y),計算x,y同時存在的概率。

具體到Tensorflow

nce_loss裏面有一個參數:

num_sampled: Anint. The number of negative classes to randomly sample per batch. This single sample of negative classes is evaluated for each element in the batch.

這一個參數就是用來控制我這裏說到的k的hyperparameter.

另外training和testing的時候,還不一樣,在於:

training的時候我們使用nce loss,可以減少計算量,但testing的時候,我們通常使用sigmoid cross entropy,因爲我們還是要衡量所有可能class的probability,在所有可能結果中做選擇。

 

更深入的拓展:

我們求和的其實也是下面的分母,也就是一個歸一化常數

NCE解決了歸一化項(中積分,或太多項和)無法計算的問題。

 

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