在工做中用到了相似于negative sample的方法,才发现我其实并不了解candidate sampling。因而看了一些相关资料,在此简单总结一些相关内容。python
主要内容来自tensorflow的candidate_sampling和卡耐基梅隆大学一个学生写的一份notesNotes on Noise Contrastive Estimation and Negative Sampling,还有一部分参考了tensorflow的nce_loss和sampled_softmax_loss的文档。git
首先,什么是candidate sampling呢?假设咱们有这样一个问题,给定一个样本集,其中每一个样本由,其中
是输入特征,
是一个target小集合,知足
。咱们的目标是学习一个
,使得给定一个
,咱们能够预测出类别
为正的可能性。github
若是咱们使用正常的softmax方法,那么在计算每个sample时,咱们都须要遍历整个集合,对每个可能的
计算一次
,这是很是昂贵的操做。尤为是在NLP的相关预测中,这一操做代价更加高昂。因此candidate sampling的方法被提了出来:在计算每个sample时,咱们从整个标签集合或者负标签集合中随机采样出一个小的candidate集合
,将
和
一块儿组成当前的candidate集合
,并在
上计算
。算法
常见的candidate sampling方法的特性能够见下表: api
在这个表中,是一个不依赖于候选类的任意函数。 因为Softmax涉及归一化,所以添加这样的函数不会影响计算的几率。
是
中类y的指望几率或者指望个数。网络
NCE和nagetive sample能够适应于是multiset的状况,在这种状况下,
等于
中类y的指望个数。NCE,negative sampling和sampled logistic能够适应于
是multiset的状况,在这种状况下,
等于
中类y的指望个数。ide
咱们考虑一种简单的也是最经常使用的状况,。以经典的word预测为例,此时
。咱们给定经验分布
和
,则每个训练集中的正样本都至关于从
采样出一个
,并在这个
的基础上在
上采样出
,并标定label
。同时咱们从分布
中采样出
个noise samples,则函数
那么使用条件几率公式,咱们就能够写出:学习
在神经网络算法中,咱们使用来代替
,并试图用梯度降低法来训练
。3d
Negative Sampling是NCE的一种近似,比较值得注意的是,negative sampling对于分布Q有强依赖,NCE则没有这个问题。
NCE loss在tensorflow中的文档能够参考tf.nn.nce_loss。要注意的是,使用这种方法时,标签必须按照frequency的降序排序,由于默认的采样方法是tf.nn.log_uniform_candidate_sampler。固然咱们也能够实现本身的采样方法。
Negative sampling则用sampled_softmax_loss来实现,注意sampled_softmax_loss只能处理一个正label的状况。