Tensorflow的取樣方法:candidate sampling
取樣介紹
假如我們有一個多分類任務或者多標籤分類任務,給定訓練集
我們想學習到一個通用函式
完整的訓練方法,如使用softmax或者Logistic迴歸需要對每個訓練資料計算所有類
“candidate sampling”訓練方法包括為每一個訓練資料
TensorFlow中各種取樣
其中:
Q(y|x) 表示的是給定contextxi 取樣到y 的概率K(x) 表示任意不以來候選集的函式logistic−training−loss=∑i(∑y∈POSilog(1+exp(−G(xi,y)))+∑y∈NEGilog(1+exp(G(xi,y))))(1) 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,公式
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的本質上還是訓練
個人看法,對於多標籤多類別的分類任務使用Logistic比較好,對於多標籤單類別的分類任務使用softmax比較好,取樣中,採用tf.nn.sampled_softmax_loss訓練cbow模型比較好,而 tf.nn.nce_loss訓練skip-gram比較好。