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解決了歸一化項(中積分,或太多項和)無法計算的問題。