NLP学习笔记(1)-词向量与语言模型

来源:互联网 发布:百度人工智能平台 编辑:程序博客网 时间:2024/05/20 20:46

阅读的第一篇词向量相关的文献是Tomas Mikolov 2013年的论文,其中提到了Bengio在2003的经典文章。经过一番努力,粗略的学习了这两篇文献,并查阅了相关的资料,现简单整理如下:
1、词向量
作为NLP的初学者,遇到的第一个难以理解的概念就是词向量(“Word Representation”或“Word Embedding”)。通俗的来说,词向量就是用一个向量来表示一个词,进而研究词之间的相似性或者说“距离”等特征。一种名为One-hot Representation的方法把每个词均表示为一个很长的向量。(向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1)该方法存在一个重要的问题就是“词汇鸿沟”现象:任意两个词之间都是孤立的。光从两个向量中看不出两个词是否有关系,即“距离”难以度量。另一种Distributed Representation方法形如:[0.792, −0.177, −0.107, 0.109, −0.542, …]能更好的表示向量间的距离,按[1]中所述,通常意义上的词向量都是指该种方法表示的。(貌似还有一种“Distributional Representation”的表示方法,大概是基于统计生成的词向量,不太懂。。)
回到语言模型的应用,词向量的维度一般都是相等的,所以可以用矩阵来表示,进而可以通过矩阵变换来得到词的概率分布。语言模型的训练过程其实也是词向量的训练过程,接下来讨论语言模型。
2、语言模型
统计语言模型(Statistical Language Model)是自然语言处理(NLP)中非常重要的一部分。如何判断一个句子是否合理,[2]中表述为句子产生的可能性大小,而可能性用概率来衡量,语言模型即是用来估计这个概率的。总结其形式化定义:给定一个字符串S,估计它是自然语言的概率 P(w1,w2,…,wt),其中w1 到 wt 依次表示这句话中的各个词,依据贝叶斯定理,有:P(w1,w2,…,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt−1),此处引入马尔可夫假设:任意一个词wi出现的概率仅与它前面的词wi-1相关,即S的计算简化为二元模型。在[1]、[2]中均对模型的训练、零概率问题和平滑方法做了介绍。[5]中对N-gram模型及神经网络模型做出了详细介绍(还没看完。。)
图1 通常的三层神经网络模型

3、Bengio的经典模型
Bengio使用前馈神经网络Feedforward Neural Net Language Model (NNLM),训练目标是得到模型f,使得
这里写图片描述
图2 Bengio 的神经网络结构示意图(来自原文)
Bengio 使用一个三层的神经网络:第一层(输入层)是将 C(wt−n+1),…,C(wt−2),C(wt−1) 这 n−1 个向量首尾相接拼起来,形成一个 (n−1)m 维的向量,记为 x。第二层(隐藏层)就使用偏置项d+Hx计算得到,之后使用 tanh 作为激活函数。第三层(输出层)一共有 |V| 个节点,每个节点 yi 表示下一个词为 i 的log 形概率。最后使用 softmax 激活函数将输出值 y 归一化成概率。最终,y 的计算公式为:y=b+Wx+Utanh(d+Hx) U是一个 |V|×h 的矩阵,是隐藏层到输出层的参数,整个模型的多数计算集中在 U 和隐藏层的矩阵乘法中,这也是Tomas改进的原因。值得一提的是,这样训练出的模型和词向量无需平滑。
PS:不得不说,这篇文章还是比较难理解的,后面的优化过程和梯度上升过程还没有理解透彻,许多细节的地方仍需进一步学习。
4、Tomas Mikolov的改进工作
考虑Bengio用递归的神经网络训练词向量的方法,虽然原理简单(额,原文如此,我不觉得简单)、鲁棒性高,但计算复杂度较高,对词表大小、训练语料规模都有限制。为此提出一种可以用于从大量数据集高效学习高质量词向量的方法:log-bilinear模型。作者首先介绍了前馈神经网络模型NNLM(在输出层使用Huffman树提高效率),递归神经网络模型RNNLM以及并行训练的神经网络(使用DistBelief工具),之后提出了一种New Log-linear Models。前文说过,大量的计算都消耗在非线性的隐含层,因此作者去除了隐含层以提高效率。此外,作者还将词向量计算与神经网络模型的训练分开进行。
这里写图片描述
图3 改进的神经网络结构示意图(来自原文)
根据上下文来输出当前词语的CBOW和依据当前词语来输出网络上下文的Skip-gram模型。去除隐含层后,作者将N个词语都投影到一个D维向量上(貌似是加和平均)。测试部分中,作者设计了一个非常有趣的任务:D(biggest)-D(big)+D(small)=D(smallest),并且比较了准确率:RNNLM

0 0
原创粉丝点击