语言模型中用到的几种采样之不全版

1、蒙特卡洛数值积分

在科学计算领域,对一个已知分布的p(x),函数f(x)的期望可以通过数值解法方法来近似计算。从p(x)中独立抽取的n个样本xi,其中i = 1, · · · , n。当 n足够大时,f(x)的期望可以用这n个样本的均值来近似:


根据大数定律,当n趋向于无穷大是,样本均值收敛于期望值:

,when n →∞.

也就是说,它可以用来求一些复杂函数的积分。求积分,可以通俗地理解为求面积,而如果只是简单的求面积,利用蒙特卡洛来求就是用随机投点法来模拟不规则图形的面积。

比如在1*1的矩形中,有一个不规则的图形,我们想要直接计算该图形的面积很困难,那怎么办呢?我们可以拿N个点,随机抛在1*1的矩形框中,数一下落入该不规则图形中的点的个数count,那么该不规则图形的面积就可以用count/N来近似。

所以现在就有一个问题,就是要怎么抽样才能让数据最符合事实分布。抽样,其实是指从一个概率分布中生成观察值(observations)的方法。而这个分布通常是由其概率密度函数(PDF)来表示的。而且,即使在已知PDF的情况下,让计算机自动生成观测值也不是一件容易的事情。从本质上来说,计算机只能实现对均匀分布(Uniform distribution)的采样。比较原始的解决方法会有直接采样,拒绝采样、自适应的拒绝采样等(这几种这个链接介绍的很好)。下面介绍几种比较主要的“曲线救国”的方法。

2、重要性采样

它也是借助了容易抽样的分布 q (proposal distribution)来解决这个问题,直接从公式出发:

其中p(z)是数据的分布,f(z)是数据的函数,p(z) / q(z) 可以看做采样出后的数据的 importance weight,可见p(z) / q(z)>1,即p(z) > q(z),采样数据的权重变高,反之则权重降低,这是比较intuitive的。我们要确定的是 q。要确定一个什么样的分布才会让采样的效果比较好呢?直观的感觉是,样本的方差越小期望收敛速率越快。比如一次采样是 0, 一次采样是 1000, 平均值是500,这样采样效果很差,如果一次采样是 499, 一次采样是501, 你说期望是 500,可信度还比较高。在上式中,我们目标是 p×f/q 方差越小越好,所以 |p×f| 大的地方,proposal distribution q(z) 也应该大(而这个条件并不能经常满足,这也就成了重要性采样的缺点)。

因为这篇文章主要是服务于语言模型的,所以这里讲一讲它在语言模型的应用。

应用重要性采样在加快求解:

如下式:

其中通常采用训练集的unigram分布(键为词,值为词的频率),接着从中独立抽取k个样本vi, 1 ≤ i ≤ k

到了这一步基本完成重要性采样,下面说一下上图中最后一项中部分项的求解:

Z(h) 需要在所有样本上进行计算,计算量仍然很大。

于是,Bengio在2003年在这里又用了一次重要性采样:

 

其中可以跟上面一样采用训练集的unigram分布

到这里就完成工作了,梳理一下整个推导流程:

3、自适应重要性采样

虽然直观上Q(w′|ht)采用n元语言模型更加准确,但Bengio and Senécal [2008]发现使用复杂的n元语言模型分布并不能改进性能,原因是n元模型的分布和神经网络语言模型估计的分布之间有很大的差异。于是,他们提出了自适应的n-gram分布来更好地拟合目标分布P。他们将bigram和unigram融合,融合的系数用SGD的方法训练得到,最终使得融合后的分布Q与目标分布P的KL距离最小。他们的实验显示这种方法能使速度提升100倍。

4、 NCE

噪声对比估计(Noise Contrastive Estimation)是Mnih和Teh发明的一种比重要性采样更稳定的采样方法,因为刚刚上面说的重要性采样中P和Q可能大小不一致的情况。NCE不是直接估计某个词语的概率值。相反,它借助一个辅助的损失值,从而实现了正确词语概率值最大化这一目标。NCE的想法是:训练一个模型来区分目标词语与噪声。于是,待解决的问题就由预测正确的词语简化为一个二值分类器任务,分类器试图将正确的词语与其它噪声样本中区分开来。

对于每个词语wi,它的前n个词语wt-1, ……, wt-n+1表示为wi的语境ci。然后从含有噪声的分布Q中生成k个噪声样本。参照重要性采样的方法,这里也可以从训练数据的unigram分布中采样。由于分类器需要用到标签数据,我们把语境 ci 对应的所有正确的词语wi标记为正样本(y=1),其余的噪声词语作为负样本(y=0)。

接着,用逻辑回归模型来训练样本数据:

为了简化表示,上式中用c表示上下文内容,并且省略了目标词语wt的下标t。由于计算所有噪声样本的期望时仍需要对词表V中的词语求和,得到标准化的概率值,于是可以采用蒙特卡洛方法来估算:

简化为:

实际上,我们是从两个不同的分布中采样数据正样本是根据语境c从训练数据集Ptrain中采样,而负样本从噪声分布Q中采样获得。因此,无论是正样本还是负样本,其概率值都可以表示成上述两种分布带权重的组合,权重值对应于来自该分布的样本值:

于是,样本来自于Ptrain的概率值可以表示为条件概率的形式:

这个式子可以被简化为:

由于不知道Ptrain(待计算项),我们就用P来代替:

当然,样本为负样本的概率值就是P(y=0|w,c)=1−P(y=1|w,c)。值得注意的是,已知c求词语w出现的概率值P(w|c)的计算方法实际上就是softmax的定义:

h是网络倒数第二层的输出向量。因为分母只与h相关,h的值与c相关(假设V不变),那么分母可以简化为Z(c)来表示。softmax就变为下面的形式:

为了求解Z(c),还是需要对V中所有词语出现的概率值求和。NCE则用了一个小技巧巧妙地绕开:即把标准化后的分母项Z(c)当作模型的待学习参数。Mnih和Teh(2012)Vaswani(2013)等在论文中都把Z(c)的值固定设为1,他们认为这样不会对模型的效果造成影响。Zoph(2016)则证明了,即使训练模型,最终得到Z(c)的值也是趋近于1,并且方差很小。

若是我们把上面softmax等式中的Z(c)项改为常数1,等式就变为:

再把上面的式子代入求解P(y=1|w,c)P(y=1|w,c),得到:

继续把上式代入到逻辑回归的目标函数中,得到:

NCE方法有非常完美的理论证明:随着噪声样本k的数量增加,NCE导数趋近于softmax函数的梯度。Mnih 和 Teh (2012) 认为抽取25个噪声样本就足以达到常规softmax方的效果,速度能提升大约45倍。Chris Dyer撰写的笔记对NCE方法进行了更详细的解释。

在这里仍然可能会让人疑惑,为何一个softmax的计算效率问题就能转化为一个二分类问题了。其实,仔细一想,softmax就是解决从多个分类挑出正确目标这个问题的,而我们这里NCE把样本分为了正样本和负样本两类,也算是解决了这个问题,只是彻底抛弃了softmax而已。

5、 Negative Sampling

负采样(Negative Sampling)方法,简称NEG,可以看成是噪声对比估计方法的一 个简化版本。

回顾上面这条公式:

我们把kQ(w)设为1,就把NCE变成NEG了。

因为NEG与NCE的关键区别在于NEG以尽可能简单的方式来估计这个概率值,所以上式中计算量最大的kQ(w) 项被置为1,于是得到:

当k=|V|并且Q是均匀分布(若Q为unigram,则这意味着每个词出现频率一样)时,kQ(w)=1成立。此时,NEG等价于NCE。我们将kQ(w)设置为1,而不是其它常数值的原因在于,P(y=1|w,c)可以改写为sigmoid函数的形式:

如果我们再把这个等式代入之前的逻辑回归损失函数中,可以得到:

进一步简化后得到:

假设

最终得到:

为了与Mikolov et al. (2013)论文中的符合保持一致,h要用vwI替换,v’wi要用v’wO替换,vwij 要用v’wi替换。另外,与Mikolov所使用的目标不同,我们在三个方面做了修改:a)对整个文档集做优化,b)最小化负对数似然,而不是最大化对数似然,c)用蒙特卡洛方法估计期望值

我们发现,仅当k=|V|并且Q是均匀分布时,NEG才等价于NCE。在其它情况下,NEG只是近似于NCE,也就是说前者不会直接优化正确词语的对数似然,所以不适合用于自然语言建模。NEC更适用于训练词向量表示。


另外,在源码实现中,当Q用unigram时,每个词的频率会被再弄上一个0.75的幂。

 

Reference:

[1] http://www.cnblogs.com/xbinworld/p/4266146.html

[2] http://blog.csdn.net/baimafujinji/article/details/51407703

[3] Sebastian Ruder. On wordembeddings - Part 2: Approximating the Softmax. http://sebastianruder.com/word-embeddings-softmax,2016.

[4] 《神经网络与深度学习》第12章 邱锡鹏


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值