Candidate sampling:NCE loss和negative sample

在工做中用到了相似于negative sample的方法,才发现我其实并不了解candidate sampling。因而看了一些相关资料,在此简单总结一些相关内容。python

主要内容来自tensorflow的candidate_sampling和卡耐基梅隆大学一个学生写的一份notesNotes on Noise Contrastive Estimation and Negative Sampling,还有一部分参考了tensorflow的nce_loss和sampled_softmax_loss的文档。git

What is Candidate Sampling

首先,什么是candidate sampling呢?假设咱们有这样一个问题,给定一个样本集,其中每一个样本由(x_i, T_i),其中x_i是输入特征,T_i是一个target小集合,知足T \subset L, |T| << |L|。咱们的目标是学习一个F(x, y),使得给定一个x,咱们能够预测出类别y为正的可能性。github

若是咱们使用正常的softmax方法,那么在计算每个sample时,咱们都须要遍历整个集合|L|,对每个可能的y计算一次F(x, y),这是很是昂贵的操做。尤为是在NLP的相关预测中,这一操做代价更加高昂。因此candidate sampling的方法被提了出来:在计算每个sample时,咱们从整个标签集合或者负标签集合中随机采样出一个小的candidate集合S,将ST一块儿组成当前的candidate集合C = S \cup T,并在C上计算F(x, y)算法

常见的candidate sampling方法的特性能够见下表: api

在这个表中,K(x)是一个不依赖于候选类的任意函数。 因为Softmax涉及归一化,所以添加这样的函数不会影响计算的几率。Q(y|x)S_i中类y的指望几率或者指望个数。网络

NCE和nagetive sample能够适应于T_i是multiset的状况,在这种状况下,P(y|x)等于T_i中类y的指望个数。NCE,negative sampling和sampled logistic能够适应于S_i是multiset的状况,在这种状况下,Q(y|x)等于S_i中类y的指望个数。ide

Noise Contrastive Estimation (NCE)

咱们考虑一种简单的也是最经常使用的状况,|T| = 1。以经典的word预测为例,此时T= {t_i}。咱们给定经验分布\widetilde{P}(x)\widetilde{P}(t|x),则每个训练集中的正样本都至关于从\widetilde{P}(x)采样出一个x_i,并在这个x的基础上在\widetilde{P}(t|x)上采样出t_i,并标定label d = 1。同时咱们从分布Q(x)中采样出k个noise samples,则函数

P(d, t|x)=
\begin{cases}
\frac{k}{1 + k}Q(x) & \text{d=0}\\
\frac{1}{1 + k}\widetilde{P}(t|x)& \text{d=1}
\end{cases}

那么使用条件几率公式,咱们就能够写出:学习

P(d = 0| t, x) = \frac{k * Q(x)}{\widetilde{P}(t|x) + k * Q(x)}

P(d = 1| t, x) = \frac{\widetilde{P}(t|x)}{\widetilde{P}(t|x) + k * Q(x)}

在神经网络算法中,咱们使用P_\theta(t,x)来代替\widetilde{P}(t|x),并试图用梯度降低法来训练\theta3d

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的状况。

相关文章
相关标签/搜索