在工做中用到了相似於negative sample的方法,才發現我其實並不瞭解candidate sampling。因而看了一些相關資料,在此簡單總結一些相關內容。python
主要內容來自tensorflow的candidate_sampling和卡耐基梅隆大學一個學生寫的一份notesNotes on Noise Contrastive Estimation and Negative Sampling,還有一部分參考了tensorflow的nce_loss和sampled_softmax_loss的文檔。git
首先,什麼是candidate sampling呢?假設咱們有這樣一個問題,給定一個樣本集,其中每一個樣本由,其中是輸入特徵,是一個target小集合,知足。咱們的目標是學習一個,使得給定一個,咱們能夠預測出類別爲正的可能性。github
若是咱們使用正常的softmax方法,那麼在計算每個sample時,咱們都須要遍歷整個集合,對每個可能的計算一次,這是很是昂貴的操做。尤爲是在NLP的相關預測中,這一操做代價更加高昂。因此candidate sampling的方法被提了出來:在計算每個sample時,咱們從整個標籤集合或者負標籤集合中隨機採樣出一個小的candidate集合,將和一塊兒組成當前的candidate集合,並在上計算。算法
常見的candidate sampling方法的特性能夠見下表: api
在這個表中,是一個不依賴於候選類的任意函數。 因爲Softmax涉及歸一化,所以添加這樣的函數不會影響計算的機率。是中類y的指望機率或者指望個數。網絡
NCE和nagetive sample能夠適應於是multiset的狀況,在這種狀況下,等於中類y的指望個數。NCE,negative sampling和sampled logistic能夠適應於是multiset的狀況,在這種狀況下,等於中類y的指望個數。ide
咱們考慮一種簡單的也是最經常使用的狀況,。以經典的word預測爲例,此時。咱們給定經驗分佈和,則每個訓練集中的正樣本都至關於從採樣出一個,並在這個的基礎上在上採樣出,並標定label 。同時咱們從分佈中採樣出個noise samples,則函數
那麼使用條件機率公式,咱們就能夠寫出:學習
在神經網絡算法中,咱們使用來代替,並試圖用梯度降低法來訓練。3d
Negative Sampling是NCE的一種近似,比較值得注意的是,negative sampling對於分佈Q有強依賴,NCE則沒有這個問題。
NCE loss在tensorflow中的文檔能夠參考tf.nn.nce_loss。要注意的是,使用這種方法時,標籤必須按照frequency的降序排序,由於默認的採樣方法是tf.nn.log_uniform_candidate_sampler。固然咱們也能夠實現本身的採樣方法。
Negative sampling則用sampled_softmax_loss來實現,注意sampled_softmax_loss只能處理一個正label的狀況。