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章 邱锡鹏

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

  1. spring中用到的9种设计模式

    spring中用到了9种设计模式,学习spring的源码以及设计模式,可以提高开发人员软件设计以及开发的水平,写出更加优雅的代码. 文章目录 简单工厂(非23种设计模式中的一种) 工厂方法 单例模式 ...

  2. 只用1/500数据就打败人类!一种采样高效的强化学习算法 | 报告详解

    [栏目:前沿进展]近日,清华大学交叉信息研究院高阳研究组在强化学习领域中取得突破,研究组所提出的模型EfficientZero首次在雅达利(Atari )游戏数据上超过同等游戏时长的人类平均水平.Ef ...

  3. SPI的4种采样模式

    极性 和 相位 的两两组合,构成了SPI的4种工作模式. (但个人认为"极性"和"相位"比较拗口,更喜欢用"scl空闲时的高低电平" 与 & ...

  4. Spring中用到的九种设计模式

    spring中常用的设计模式达到九种,我们举例说明: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.  简单工厂模式的实质是由 ...

  5. 深度学习中用到的几种图像操作

    视频抽取图片 如何从视频文件中分解出一张张独立的图片? 视频其实就是一张张的图片,利用opencv库可以很容易的从视频文件中抽离出图像文件来,下面我们就看一段示例代码是如何从视频文件中抽取出多张图片的 ...

  6. VC中用到的几种调试输出TRACE的方法及其区别

    最近一段陆续用了几种调试VC程序的方法.一般程序也肯定会使用到这几种方法. 现在总结如下: 1.在VC里面debug版本用TRACE自己打印trace到调试窗口. 局限就是,不能脱离了vc的环境进行调 ...

  7. C# 中用 Sqlparameter 的几种用法

    新建一个表: create table abc (     id int IDENTITY(1,1) NOT NULL,     name nvarchar(100) ,     sex  nvarc ...

  8. vue中的class和style在行内中用发有几种

    1.class的对象绑定 //actived这个类是否加载取决于isActive这个变量的true还是false <div :class="{actived:isActive}&quo ...

  9. Spring中用到的九种设计模式五:模板模式

    系列文章目录 文章目录 系列文章目录 前言 一.模板模式 二.主要角色 1. AbstractTemplate(抽象模板): 2. ConcreteTemplate(具体模板): 三.代码实现与示例 ...

最新文章

  1. Linux那些事儿 之 戏说USB(8)从这里开始
  2. 修改windows系統下xampp中apache端口被其他程式占用的問題
  3. [转]NUnit详细使用方法
  4. 04 linux用户群组和权限
  5. numpy 几个比较重要的链接
  6. Bootstrap 导航
  7. 奇安信RSA观察|RSAC应用安全技术新风向
  8. python设计模式之Borg模式
  9. 中南大学毕业设计(论文)LaTeX模板
  10. c语言仿宋gb2312字体,【仿宋gb2312字体下载】仿宋gb2312字体官方下载 免费版-七喜软件园...
  11. 学习率设置-warm up与consine learning rate
  12. 黄子韬快手带货首秀GMV破2.3亿,真性情无套路直播效果拉满!
  13. 推荐好友和共同好友sql
  14. Python Requests:两个例子说明get和post方法+用谷歌浏览器查看网络请求
  15. Java语言中类与对象的创建
  16. 1050: 平方和与立方和
  17. JavaScript中Cookie的使用——设置失效时间
  18. 利用easyUI实现tree叶子节点横向展示以及checkbox联级勾选改造
  19. uk码对照表_英国儿童鞋uk鞋码对照表
  20. PORUHBUB.CROWN_ios安卓 testlight /apps/android开发包安装

热门文章

  1. TensorFlow 中的 Conv2DOp
  2. C# 根据汉字获取首字母拼音或全拼
  3. 协程(二):协程的应用
  4. 惠普瘦客户机助力班班通进校园
  5. directshow 虚拟摄像头 实例 代码解读
  6. 解决物理机和kvm虚拟机鼠标不同步问题
  7. SIM卡的ICCID、IMSI
  8. 虚拟化趋势是否会让容错服务器流行起来
  9. 黑马程序员VUE学习笔记-小黑记事本案例
  10. SpringBoot整合华为云OBS实现文件上传下载