语言模型(LM)是很多应用成功的关键,这些应用包括语音识别、文本信息检索、统计机器翻译以及NLP的其他任务。语言模型中传统参数估计技术都基于N元文法计数的方法。尽管我们已经知道N元文法的缺点,但由于许多领域的研究者们专注于此,因此N元文法依然是主流技术。神经网络和深度学习方法的出现显著降低了语言模型的困惑度(perplexity),而困惑度是应用在一些基准任务上的一种常用的(不是最终的)度量语言模型性能的方法。
在讨论基于神经网络的语言模型之前,需要特别指出的一点是,在构建深度递归结构的语言模型中使用了分层贝叶斯先验。特别地,Pitman-Yor过程用作贝叶斯先验,构建了一个深层(四层)的概率生成式模型。通过结合自然语言的幂律(power-law)分布,为语言模型的平滑提供了一种原则性的方法。已经在第3章中指出,这种先验知识嵌入在生成式概率模型构建上比在基于区分性神经网路的模型构建上更容易实现,而在降低语言模型困惑度上得到的结果远没有基于神经网络的语言模型获得的结果好。
在语言模型中使用(浅层)前馈神经网络已经有很长的历史了、这种方法被称为神经网络语言模型(NNLM)。最近,在语言模型中使用了DNN。语言模型抽取自然语言中的词语序列分布,并用其显著统计特性的函数来表示。给定前面出现的词,它可以计算下一个词的概率预测。为了降低维度灾难(curse of dimensionality)的影响,NNLM利用神经网络的能力学习词的分布式表示。早期的NNLM使用前馈神经网络结构,按照下面的步骤进行计算:N元文法NNLM使用先前固定长度的;N-1个词作为输入,每个词使用非常稀疏的1/V标注进行编码,V是词典的大小。使用在历史信息不同位置共享的投影矩阵,词的1/V正交表示线性地投影到一个更低的维度空间。这种词语的连续空间、分布式表TK的方法叫做“词嵌入”(word embedding),这与常见的符号或者局部化表示很不同。通过投影层后,使用一个非线性激活函数的隐层,非线性函数可以是双曲正切函数或者逻辑S型函数。隐层之后是神经网络的输出层,输出节点的数量与完整词表的大小相同。神经网络训练后,输出层的激活就表示N元文法语言模型的概率分布。
NNLM较传统的基于计数的N元文法语言模型的主要优势在于,历史信息不再严格的是先前N-1个词,而是整个历史信息到某种低维空间上的投影。这降低了待训练模型的参数数量,并对相似的词序列历史进行自动聚类。与基于类别(class-based)的TV元文法语言模型相比所不同的是,NNLM将所有的词投影到低维空间,这样就可以得到词之间更多维度上的相似度。另一方面,NNLM与N元文法相比,计算复杂度更大。
下面我们从分布式表示的观点分析NNLM所具有的优势。符号的分布式表示是描述符号含义的特征向量,向量中的每一个元素都参与了符号含义的表示。有了NNLM之后,研究者们就可以将研究重点放在发现有意义的、连续实值的特征向量的学习算法上。基本的想法是,用一个连续实值的特征表示来关联词典里的每一个词,这在研究领域中被称为“词嵌入”。这样,每一个单词对应于特征空间里的一个点。我们可以认为空间里的每一维对应于词的一个语义或语法特征。我们期望的是,功能相似的词语在特征空间中离得更近,至少在某些维上是这样。这样词序列就可以转化为学习到的特征向量序列。神经网络学习的是特征向量序列到序列中下一个词的概率分布的映射关系。LM的分布式表示方法的优点在于其推广能力,它可以对不在训练词序列集合中的序列生成性能很好的分布式特征表示。这是因为神经网络能将相似的输入映射到相似的输出上,具有相似特征词序列的预测映射到相似的预测上。
上述NNLM的思想已经在很多研究中得以运用,其中一些涉及了深层结构。NNLM中分层结构输出的做法是为了处理大词汇表。语言模型使用了瞬时因子化RBM。与传统N元文法模型不同,因子化RBM不仅将上下文的词进行分布式表示,而且对待预测词进行了同样的处理,文献[253]将此方法推广到了更深层结构。随后在NNLM上使用“深层”结构的工作包括[205,207,208,245,247,248],例如,Le等人使用结构化的输出层(Structured Output Layer,SOUL)描述NNLM,语言模型的处理深度集中在神经网络的输出表示上。图8-5是SOUL-NNML的结构示意图,在神经网络的输出层上使用了层级结构,神经网络的其余部分与传统NNLM具有相同的结构。网络输出词表的层级结构是聚类树的形式,如图8-5右图所示,每个词只属于其中的一类,位于决策树的一个叶子节点上。层级结构的优点在于SOUL-NNLM可以使用完整的大词表训练NNLM,这与传统NNLM中只能对少量词汇进行有效训练相比是一个很大优势。
图8-5 神经网络输出层中具有分层结构的SOUL-NNLM架构
图中词语翻译对照表
续 表(www.xing528.com)
另外一个使用基于神经网络语言模型的例子参见文献[247,248,245],它们使用了递归神经网络(RNN)去构建大规模的语言模型,称为RNNLM。对于语言模型来说,前馈结构和递归结构的主要区别是表示词历史的方法不同。对于前馈NNLM来说,历史词仍然只是前面若干个词。而对于RNNLM来说,在训练过程中可以从数据中学习到历史词的有效表示形式。RNN的隐层表示前面所有的词历史,而不仅仅是前面N-1个词,这样从理论上讲模型可以表征长时上下文模式。RNNLM更重要的一个优点是能够表征同序列中更高级的模式,例如,依赖于在历史中可变位置出现的词语,这些模式就可以使用递归结构更有效地进行编码。也就是说,RNNLM可以简单地在隐层状态上记忆一些特定的词,而前馈NNLM需要使用一些参数来表示词在历史词汇中的每一个特定位置。
RNNLM使用沿时间反向传播算法进行训练,图8-6所示为在训练过程中RNN是怎样展开为一个深层前馈网络的(在时间上回退三个时间单位)。
在RNN的训练中,通过截断增长的梯度,RNNLM训练获得了稳定性和快速收敛性。人们也开发了RNNLM的自适应算法,根据训练数据的相关性进行排序并且在处理测试数据时训练模型。经验性比较都表明,RNNLM与其他基于N元文法的流行方法相比,在困惑度上具有更好的效果。
RNNLM使用的单位是字(character)而不是词。展示了很多有趣的性质,比如预测长时依赖(例如在段落中打左右引号)。然而,以字为单位而不以词为单位在实际的应用中的效果还不是很明确,因为在自然语言处理中,词仍然是一种强力的表示。在语言模型中,将词语变为字符可能会限制大多数实际应用场景,训练也会变得困难。目前,词级模型仍然保持着优势。
在最近的工作中,Mnih和Teh以及Mnih和Kavukcuoglu为NNLM开发了一种快速简单的训练算法。尽管NNLM极具优越的性能,但由于训练时间比较长,因此它不如标准N元文法语言模型的使用广泛。噪声对比估计(Noise-Contrastive Estimation,NCE)算法可以让NNLM训练速度更快,而且时间复杂度与词汇量的大小无关;它在NNLM的输出层中使用了一个扁平而非树的结构。NCE的思想是:使用非线性回归来区分观测数据和人为噪声。也就是说,为了估计观测数据密度模型里的参数,要去学习区分数据分布的样本和已知噪声分布的样本。作为一种重要的特例,NCE对于非规范的分布非常有效(比如,不受分母中分配函数的影响)。为了高效地将NCE应用在NNLM的训练中,Mnih和Heh以及Mnih和Kavukcuoglu等人首次将学习问题公式化表示,在判分函数中将目标函数表示为词的分布,这样NNLM就可以看作是一种使用判分函数量化历史词和下一个候选词兼容性的方法。训练NNLM的目标函数就变成了判分函数的指数函数,用一个常量对所有可能的词进行归一化。已经证实,通过移除计算繁琐的归一化因子,NCE可以将NNLM的训练过程加快一个数量级。
图8-6 在训练过程中RNN展开为一个深层前馈网络
最近与NCE相似的方法也用实践中,这种方法叫做负采样(negative sampling)。它应用在NNLM的简化版本中,是为了构建词嵌入而非计算词序列的概率。词嵌入在NLP应用中是一个重要的内容。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。