1. 程式人生 > >Tensorflow的取樣方法:candidate sampling

Tensorflow的取樣方法:candidate sampling

取樣介紹

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

我們想學習到一個通用函式F(x,y)來表徵上下文x和目標類y的關係,如Word2vec裡面,使用上下文預測下個單詞的概率。

完整的訓練方法,如使用softmax或者Logistic迴歸需要對每個訓練資料計算所有類yL的概率F

(x,y),當|L|非常大的時候,訓練將非常耗時。

“candidate sampling”訓練方法包括為每一個訓練資料(xi,Ti)構造一個訓練任務,使得我們只需要使用一個較小的候選集合CiL,就能評估F(x,y),典型的,candidate set Ci包含目標類別Ti和一些隨機取樣的類別SiL

Ci=TiSi ,Si的選擇可能依賴xiTi,也可能不依賴。

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

TensorFlow中各種取樣

這裡寫圖片描述
其中:

  • Q(y|x)表示的是給定contextxi取樣到y的概率
  • K(x)表示任意不以來候選集的函式
  • logistictrainingloss=i(yPOSilog(1+exp(G(xi,y)))+yNEGilog(1+exp(G(xi,y))))1
  • softmaxtrainingloss=i(log(exp(G(xi,ti))yPOSiNEGiexp(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)可以看出,sigmoid_cross_entropy_with_logits其實是訓練出了多個分類器,對於有n個標籤 的分類問題,其實質是分成了n個二分類問題,這點和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的本質上還是訓練n個分類器,而使用softmax loss的其實只是訓練了一個主題分類器,tf.nn.nce_loss主要思路也是判斷給定context Ci和訓練資料xi,判斷每一個yi是不是target label,而 tf.nn.sampled_softmax_loss則是使得在target label上的分佈概率最大化。

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