Tensorflow的采樣方法:candidate sampling(zhuan)


zhuanzi:https://blog.csdn.net/u010223750/article/details/69948463

采樣介紹

假如我們有一個多分類任務或者多標簽分類任務,給定訓練集(xi,Ti)(xi,Ti),其中xixi表示上下文,TiTi表示目標類別(可能有多個).可以用word2vec中的negtive sampling方法來舉例,使用cbow方法,也就是使用上下文xixi來預測中心詞(單個targetTiTi),或者使用skip-gram方法,也就是使用中心詞xixi來預測上下文(多個target(TiTi)).

我們想學習到一個通用函數F(x,y)F(x,y)來表征上下文xx和目標類yy的關系,如Word2vec里面,使用上下文預測下個單詞的概率。

完整的訓練方法,如使用softmax或者Logistic回歸需要對每個訓練數據計算所有類yLy∈L的概率F(x,y)F(x,y),當|L||L|非常大的時候,訓練將非常耗時。

“candidate sampling”訓練方法包括為每一個訓練數據(xi,Ti)(xi,Ti)構造一個訓練任務,使得我們只需要使用一個較小的候選集合CiLCi∈L,就能評估F(x,y)F(x,y),典型的,candidate set CiCi包含目標類別TiTi和一些隨機采樣的類別SiLSi∈L:

 
Ci=TiSiCi=Ti∪Si

,SiSi的選擇可能依賴xixi和TiTi,也可能不依賴。

 

F(x,y)F(x,y)可以使用神經網絡計算來表征(也就是TensorFlow里面常用的logits)

TensorFlow中各種采樣

這里寫圖片描述
其中:

  • Q(y|x)Q(y|x)表示的是給定contextxixi采樣到yy的概率
  • K(x)K(x)表示任意不以來候選集的函數
  • logistictrainingloss=i(yPOSilog(1+exp(G(xi,y)))+yNEGilog(1+exp(G(xi,y))))1logistic−training−loss=∑i(∑y∈POSilog(1+exp(−G(xi,y)))+∑y∈NEGilog(1+exp(G(xi,y))))(1)
  • softmaxtrainingloss=i(log(exp(G(xi,ti))yPOSiNEGiexp(G(xi,y))))softmax−training−loss=∑i(−log(exp(G(xi,ti))∑y∈POSi∪NEGiexp(G(xi,y))))

softmax vs. logistic

在使用tensoflow的時候,我們有時候會糾結選擇什么樣的損失函數比較好,softmax和logistic在表達形式上是有點區別的,但是也不是很大,而且對於普通的softmax_cross_entropy_with_logits和sigmoid_cross_entropy_with_logits也都能夠進行多分類任務,那么他們之間的區別是什么的?

就我個人所想到的,使用sigmoid_cross_entropy_with_logits和softmax_cross_entropy_with_logits的最大的區別是類別的排他性,在分類任務中,使用softmax_cross_entropy_with_logits我們一般是選擇單個標簽的分類,因為其具有排他性,說白了,softmax_cross_entropy_with_logits需要的是一個類別概率分布,其分布應該服從多項分布(也就是多項logistic regression),我們訓練是讓結果盡量靠近這種概率分布,不是說softmax_cross_entropy_with_logits不能進行多分,事實上,softmax_cross_entropy_with_logits是支持多個類別的,其參數labels也沒有限制只使用一個類別,當使用softmax_cross_entropy_with_logits進行多分類時候,以二類為例,我們可以設置真實類別的對應labels上的位置是0.5,0.5,訓練使得這個文本盡量傾向這種分布,在test階段,可以選擇兩個計算概率最大的類作為類別標簽,從這種角度說,使用softmax_cross_entropy_with_logits進行多分,實際上類似於計算文本的主題分布。

但是對於sigmoid_cross_entropy_with_logits,公式(1)(1)可以看出,sigmoid_cross_entropy_with_logits其實是訓練出了多個分類器,對於有nn個標簽 的分類問題,其實質是分成了nn個二分類問題,這點和softmax_cross_entropy_with_logits有着本質的區別。

tensorflow提供了下面兩種candidate sample方法

  • tf.nn.nce_loss
  • tf.nn.sampled_softmax_loss

對比與之前討論的,從最上面的圖中的training loss采用的方法可以知道, tf.nn.nce_loss使用的是logistic 而tf.nn.sampled_softmax_loss采用的是softmax loss,其實這兩者的區別也主要在這兒,采用logistic loss的本質上還是訓練nn個分類器,而使用softmax loss的其實只是訓練了一個主題分類器,tf.nn.nce_loss主要思路也是判斷給定context CiCi和訓練數據xixi,判斷每一個yiyi是不是target label,而 tf.nn.sampled_softmax_loss則是使得在target label上的分布概率最大化。

個人看法,對於多標簽多類別的分類任務使用Logistic比較好,對於多標簽單類別的分類任務使用softmax比較好,采樣中,采用tf.nn.sampled_softmax_loss訓練cbow模型比較好,而 tf.nn.nce_loss訓練skip-gram比較好。

--------------------- 本文來自 luchi007 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/u010223750/article/details/69948463?utm_source=copy 


免責聲明!

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



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