在工作中用到了类似于negative sample的方法,才发现我其实并不了解candidate sampling。于是看了一些相关资料,在此简单总结一些相关内容。
主要内容来自tensorflow的candidate_sampling和卡耐基梅隆大学一个学生写的一份notesNotes on Noise Contrastive Estimation and Negative Sampling,还有一部分参考了tensorflow的nce_loss和sampled_softmax_loss的文档。
What is Candidate Sampling
首先,什么是candidate sampling呢?假设我们有这样一个问题,给定一个样本集,其中每个样本由 ( x i , T i ) (x_i, T_i) (xi,Ti),其中 x i x_i xi是输入特征, T i T_i Ti是一个target小集合,满足 T ⊂ L , ∣ T ∣ < < ∣ L ∣ T \subset L, |T| << |L| T⊂L,∣T∣<<∣L∣。我们的目标是学习一个 F ( x , y ) F(x, y) F(x,y),使得给定一个 x x x,我们可以预测出类别 y y y为正的可能性。
如果我们使用正常的softmax方法,那么在计算每一个sample时,我们都需要遍历整个集合 ∣ L ∣ |L| ∣L∣,对每一个可能的 y y y计算一次 F ( x , y ) F(x, y) F(x,y),这是非常昂贵的操作。尤其是在NLP的相关预测中,这一操作代价更加高昂。所以candidate sampling的方法被提了出来:在计算每一个sample时,我们从整个标签集合或者负标签集合中随机采样出一个小的candidate集合 S S S,将 S S S和 T T T一起组成当前的candidate集合 C = S ∪ T C = S \cup T C=