神经网络语言建模系列之三:重要性采样


重要性采样(Important Sampling, IS)属于蒙特卡洛(Monte Carlo)方法,被Bengio and Senecal (2003)引入到神经网络语言建模中,用于加速神经网络语言模型的训练。重要性采样方法能够减少神经网络语言模型的训练时间,但是效果并不显著,还会导致模型的稳定性下降,并且只能加速模型的训练,无法提升预测阶段的计算速度。


1. 前言

       目前,神经网络语言建模(Language Modeling, LM)技术被认为是最优以及最有潜力的语言建模技术,相对于其他传统的语言建模技术,如N-gram语言建模,最大熵语言建模等,具有显著的优势。但是,神经网络语言模型的计算量较大,无论是训练还是预测都非常耗时,成为其在实际应用中最大的障碍。加速神经网络语言模型的计算是神经网络语言建模研究的重要方向之一,并且许多加速算法被提出,其中一类加算法是基于采样技术,而最早被引入的就是重要性采样。在Hinton (2002)的启发下,Bengio and Senecal (2003)研究了多种采样方法在神经网络语言模型上的加速性能,最终利用重要性采样成功地加速了神经网络语言模型的训练。引入重要性采样算法的神经网络语言模型在训练过程中,容易出现发散现象,需要采用合理的策略来调整采样数,保持模型稳定。随后,Bengio and Senecal (2008)和Jean et. al. (2015)改进了重要性采样在神经网络语言模型中的应用。

2. 重要性采样

       重要性采样属于蒙特卡洛方法,即基于概率统计的数值计算方法,利用随机采样来拟合目标函数。1946年,美国拉斯阿莫斯国家实验室的三位科学家John von Neumann,Stan Ulam 和 Nick Metropolis共同发明了一种采样算法,被称为蒙特卡洛方法。它的具体定义是:在广场上画一个边长一米的正方形,在正方形内部随意用粉笔画一个不规则的形状,现在要计算这个不规则图形的面积。均匀的向该正方形内撒( 是一个很大的自然数)个黄豆,随后数数有多少个黄豆在这个不规则几何形状内部,比如说有个,那么,这个奇怪形状的面积便近似于,并且越大,计算得到的面积便越精确。在这里我们要假定豆子都在一个平面上,相互之间没有重叠。

       采用数学化的语言进行描述,假设求解函数在分布下的期望,即

       当函数比较复杂时,直接采用解析方式求解期望比较困难。蒙特卡洛方法,当采样数足够多时,就越接近原始分布,因此函数在分布下的期望可转换为:

其中,为采样数,数值越大,结果越接近真实值。

       在实际应用中,实际概率分布可能比较复杂,不易直接从实际概率分布进行采样。此时,可以引入于实际概率分布的定义域相同的概率分布,利用概率分布进行采样,该方法就称为重要性采样。利用重要性采样,函数在分布下的期望可改写为:

       此处只对重要性采样方法作了简略的介绍,方便读者理解如何通过重要性采样方法来加速神经网络语言模型的训练。如果需要对重要性采样方法进行详细深入的了解学习,还需参考相关的专业资料。

3. 语言模型加速

       神经网络语言模型的输出层直接输出的为非归一化的条件概率,因此需要采用Softmax函数对输出进行归一化处理,这也是导致神经网络语言模型的计算量较大的重要因素。神经网络语言模型最终输出的条件概率形如:

其中,为t时刻的目标词,为t时刻神经网络隐藏层的输出,为时刻输出的非归一化条件概率,为词典中词的总数。因此,神经网络语言模型可被看作为能量模型的特例,但是是否了解能量模型,并不影响理解重要性采样对神经网络语言模型训练的加速原理。

       神经网络语言模型通常采用梯度下降(Gradient Descent, GD)算法进行训练,模型的参数根据反向传播的误差梯度进行更新。在神经网络语言模型中,模型参数的误差梯度由两个部分构成:目标词的正面强化部分和以为权重的其他词的负面强化部分,即:

       不难看出,正部只涉及目标词,其计算量可以忽略不计。模型的计算量主要集中在负部,因为其他词的数量与词典大小的量级一致,一般为几十万,甚至上百万。如果能够近似地估算出负部的梯度,那么在训练过程中能够极大地减少模型的计算量,这也是利用重要性采样来加速神经网络语言模型的基本思想。

       参数梯度的负部可以看做是梯度在分布下的期望,可以通过采样的方式进行近似,即重要性采样。引入与分布近似的建议分布,对参数梯度的负部进行近似得到:

其中,为采样的样本数量。

       但为了减少计算量,分布是需要避免进行计算的,因为计算需要计算模型的所有输出。为了对分布进行分析,先对其进行如下转换:

       对转换后的分布进行分析, 可以看作均匀分布 下的期望,即:

       于是再次利用重要性采样,对进行近似估计,可得:

       经过两次重要性采样操作,便可以得到参数梯度的最终近似估计,即:

\frac{\partial{\textrm{log}P(w_t|h_t)}}{\partial{\theta}}=-\frac{\partial{y(w_t, h_t)}}{\partial{\theta}}+\frac{\sum_{\hat{w}\in{W}}\frac{\partial{y(w_t|h_t)}}{\partial{\theta}}e^{-y(\hat{w}|h_t)}/Q(\hat{w}|h_t)}{\sum_{\hat{w}\in{W}}e^{-y(\hat{w}|H-t)}/Q(\hat{w}|h_t)}

其中,为采样得到的词集合,其大小即为采样数。

4. 模型实现

       经过上述论述,从理论上证明了重要性采样的可行性。在实际应用中,仍然有许多问题。其中两个主要的问题,一个是选取合适建议分布,另一个是调节采样的数量,以保证模型的性能,即保证模型的稳定性以及最终的PPL指标。

       选择合适的建议分布,对模型的性能有着重大的影响,建议分布与目标分布越接近,其效果越好。关于建议分布,通常有如下几种选择:

  • 均匀分布
  • Unigram分布
  • 指数Unigram分布
  • N-gram分布

其中,Unigram分布或者指数Unigram分布是比较常用的分布,比较容易获取,从语言模型的训练数据中直接统计计算即可得到。除了上述采用固定的建议分布外,Bengio and Senecal (2008)提出了利用模型训练过程的输出,对建议分布进行动态修正,减少建议分布与目标分布的差异。

       另外一个重要的问题是采样的样本数的调整。对于重要性采样,如果样本数越充足,其精度就越高,但是如果采样数太大,便失去加速训练的效果。另一方面,随着训练的进行,模型精度越来越高,如果采样数保持不变,重要性采样的精度就会不足,导致模型不稳定,因此需要随着训练的进行,不断增加采样数。Bengio and Senecal (2003)提出了评估采样数是否足够的目标函数,在训练阶段根据目标函数对采样数进行检测调整,而Jean et. al. (2015)则提出利用验证集,对采样数进行评估调整。

       此处,分别引用Bengio and Senecal (2003)和Bengio and Senecal (2008)的实验结果来说明重要性采样对神经网络语言模型的加速效果,如下表所示:

序号 模型 PPL 加速
01 原模型(Bengio and Senecal (2003)) 278 -
02 重要性采样Bengio and Senecal (2003) 278 19倍
03 原模型(Bengio and Senecal (2008)) 204 -
04 重要性采样(Bengio and Senecal (2008)) 196.6 100倍

       重要性采样的研究均是在前向神经网络(Feed-forward Neural Network, FNN)语言模型上进行的,因为当时其他的神经网络结构还未被应用到语言建模中。在最初的版本中,Bengio and Senecal (2003)采用的建议分布为Unigram分布,并通过动态的调整采样数来保持模型稳定。然而实验中发现随着训练的进行,采样数迅速增加,并很快达到原模型的计算量,使得加速效果并不理想。其主要原因是建议分布与实际分布相差较大,随着训练的进行,需要更多的样本来保证精度。而后Bengio and Senecal (2008)针对这个问题,对模型进行了改进,在训练过程中利用训练得到的模型对建议分布进行修正,减少建议分布与实际分布的差异,最终使得加速效果得到很大的提升。但是该方法实施比较复杂,并需要额外的存储空间。

5. 总结

       重要性采样方法能够一定程度地加速神经网络语言模型的训练,尤其在训练的初始阶段。随着训练的进行,需要不断提高采样的数量以保持模型稳定,并且采样数的调整策略需要仔细设计,也比较复杂。在实际应用中,采样数会随着训练而迅速地增加,最终达到词典的大小,使得模型训练的计算量达到正常训练时的规模。另外,重要性采用方法,和其他基于采用的加速方法类似,只能够加速模型的训练,而无法提升模型预测阶段的计算速度。尽管如此,重要性采用仍是一种有效的神经网络语言模型的加速方法,并且提供了基于采样来加速神经网络语言模型训练的思路。

作者:施孙甲由 (原创)

你可能感兴趣的:(神经网络语言建模系列之三:重要性采样)