1. 程式人生 > >Candidate sampling:NCE loss和negative sample

Candidate sampling:NCE loss和negative sample

在工作中用到了類似於negative sample的方法,才發現我其實並不瞭解candidate sampling。於是看了一些相關資料,在此簡單總結一些相關內容。

主要內容來自tensorflow的candidate_sampling和卡耐基梅隆大學一個學生寫的一份notesNotes on Noise Contrastive Estimation and Negative Sampling,還有一部分參考了tensorflow的nce_loss和sampled_softmax_loss的文件。

What is Candidate Sampling

首先,什麼是candidate sampling呢?假設我們有這樣一個問題,給定一個樣本集,其中每個樣本由(x_i, T_i)

,其中x_i是輸入特徵,T_i是一個target小集合,滿足T \subset L, |T| << |L|。我們的目標是學習一個F(x, y),使得給定一個x,我們可以預測出類別y為正的可能性。

如果我們使用正常的softmax方法,那麼在計算每一個sample時,我們都需要遍歷整個集合|L|,對每一個可能的y計算一次F(x, y),這是非常昂貴的操作。尤其是在NLP的相關預測中,這一操作代價更加高昂。所以candidate sampling的方法被提了出來:在計算每一個sample時,我們從整個標籤集合或者負標籤集合中隨機取樣出一個小的candidate集合S,將ST一起組成當前的candidate集合C = S \cup T,並在C上計算F(x, y)

常見的candidate sampling方法的特性可以見下表:

在這個表中,K(x)是一個不依賴於候選類的任意函式。 由於Softmax涉及歸一化,因此新增這樣的函式不會影響計算的概率。Q(y|x)S_i中類y的期望概率或者期望個數。

NCE和nagetive sample可以適應於T_i是multiset的情況,在這種情況下,P(y|x)等於T_i中類y的期望個數。NCE,negative sampling和sampled logistic可以適應於S_i是multiset的情況,在這種情況下,Q(y|x)等於S_i中類y的期望個數。

Noise Contrastive Estimation (NCE)

我們考慮一種簡單的也是最常用的情況,|T| = 1。以經典的word預測為例,此時T= {t_i}。我們給定經驗分佈\widetilde{P}(x)\widetilde{P}(t|x),則每一個訓練集中的正樣本都相當於從\widetilde{P}(x)

取樣出一個x_i,並在這個x的基礎上在\widetilde{P}(t|x)上取樣出t_i,並標定label d = 1。同時我們從分佈Q(x)中取樣出k個noise samples,則

P(d, t|x)=
\begin{cases}
\frac{k}{1 + k}Q(x) & \text{d=0}\\
\frac{1}{1 + k}\widetilde{P}(t|x)& \text{d=1}
\end{cases}

那麼使用條件概率公式,我們就可以寫出:

P(d = 0| t, x) = \frac{k * Q(x)}{\widetilde{P}(t|x) + k * Q(x)}

P(d = 1| t, x) = \frac{\widetilde{P}(t|x)}{\widetilde{P}(t|x) + k * Q(x)}

在神經網路演算法中,我們使用P_\theta(t,x)來代替\widetilde{P}(t|x),並試圖用梯度下降法來訓練\theta

Negative Sampling

Negative Sampling是NCE的一種近似,比較值得注意的是,negative sampling對於分佈Q有強依賴,NCE則沒有這個問題。

tensorflow實現

NCE loss在tensorflow中的文件可以參考tf.nn.nce_loss。要注意的是,使用這種方法時,標籤必須按照frequency的降序排序,因為預設的取樣方法是tf.nn.log_uniform_candidate_sampler。當然我們也可以實現自己的取樣方法。

Negative sampling則用sampled_softmax_loss來實現,注意sampled_softmax_loss只能處理一個正label的情況。