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)).git

咱們想學習到一個通用函數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,也可能不依賴。atom

 

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

TensorFlow中各類採樣

這裏寫圖片描述
其中:.net

  • 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也都可以進行多分類任務,那麼他們之間的區別是什麼的?xml

就我我的所想到的,使用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進行多分,實際上相似於計算文本的主題分佈。blog

可是對於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 

相關文章
相關標籤/搜索