在工作中用到了类似于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呢?假设我们有这样一个问题,给定一个样本集,其中每个样本由,其中是输入特征,是一个target小集合,满足。我们的目标是学习一个,使得给定一个,我们可以预测出类别为正的可能性。
如果我们使用正常的softmax方法,那么在计算每一个sample时,我们都需要遍历整个集合,对每一个可能的计算一次,这是非常昂贵的操作。尤其是在NLP的相关预测中,这一操作代价更加高昂。所以candidate sampling的方法被提了出来:在计算每一个sample时,我们从整个标签集合或者负标签集合中随机采样出一个小的candidate集合,将和一起组成当前的candidate集合,并在上计算。
常见的candidate sampling方法的特性可以见下表:
在这个表中,是一个不依赖于候选类的任意函数。 由于Softmax涉及归一化,因此添加这样的函数不会影响计算的概率。是中类y的期望概率或者期望个数。
NCE和nagetive sample可以适应于是multiset的情况,在这种情况下,等于中类y的期望个数。NCE,negative sampling和sampled logistic可以适应于是multiset的情况,在这种情况下,等于中类y的期望个数。
Noise Contrastive Estimation (NCE)
我们考虑一种简单的也是最常用的情况,。以经典的word预测为例,此时。我们给定经验分布和,则每一个训练集中的正样本都相当于从采样出一个,并在这个的基础上在上采样出,并标定label 。同时我们从分布中采样出个noise samples,则
那么使用条件概率公式,我们就可以写出:
在神经网络算法中,我们使用来代替,并试图用梯度下降法来训练。
Negative Sampling
Negative Sampling是NCE的一种近似,比较值得注意的是,negative sampling对于分布Q有强依赖,NCE则没有这个问题。
tensorflow实现
NCE loss在tensorflow中的文档可以参考tf.nn.nce_loss。要注意的是,使用这种方法时,标签必须按照frequency的降序排序,因为默认的采样方法是tf.nn.log_uniform_candidate_sampler。当然我们也可以实现自己的采样方法。
Negative sampling则用sampled_softmax_loss来实现,注意sampled_softmax_loss只能处理一个正label的情况。