词嵌入算法
基于神经网络的表示一般称为词向量、词嵌入(word embdding)或分布式表示。
神经网络的词向量和其他分布式类似,都基于分布式表达方式,核心依然是上下文的表示以及上下文与目标词之间的关系映射。主要通过神经网络对上下文,以及上下文和目标词之间的关系进行建模,之所以神经网络可以进行建模,主要是由于神经网络的空间非常大,所以这种方法可以表达复杂的上下文关系。
1. 词向量
nlp中最常见的第一步是创建一个词表库并把每个词顺序编号,one-hot表达就是一种。这种方法把每个词顺序编号,但每个词就变成一个很长的向量,向量的维度就是词表的大小,只有对应位置上的数字为1,其他都为0。这种方式的弊病是很显然的,就是无法捕捉到词与词之间的相似度,也称为“语义鸿沟“。one-hot的基本假设是词与词之间的语义和语法关系是相互独立的,仅仅靠两个向量是无法看出两个词之间的关系的。其次,维度爆炸问题也是one-hot表达方法的很大的一个问题,随着词典的规模的增大,句子构成的词袋模型的维度变得越来越大,矩阵也变得越稀疏。所以此时构建上下文与目标词之间的关系,最为理想的方式是使用语言模型。
分布式表示的基本细想是通过训练将每个词映射成k维实数向量(k一般为模型中的超参数),然后通过词之间的距离来判断它们之间的语义相似度。而word2vec使用的就是这种分布式表示的词向量表示方式。
2. 词向量模型
词向量模型是基于假设:衡量词之间的相似性,在于其相邻词汇是否相识,这是基于语言学的“距离相似性“原理。词汇和它的上下文构成一个象,当从语料库当中学习到相识或相近的象时,他们在语义上总是相识的。
而典型的就是word2vec了,它可以分为CBOW(continuous bag-of-words 连续的词袋模型)和skip-gram两种。word2vec通过训练,可以把对文本内容的处理简化为k维向量空间中的向量运算,而向量空间上的相似度可以用来表示文本语义上的相似度,因此word2vec输出的词向量是一个基础性的工作,比如聚类、同义词、词性分析等。还有一个word2vec被广泛使用的原因是其向量的加法组合和高效性。
2.1 NNLM模型
关于该模型的介绍可以参考:https://blog.csdn.net/lilong117194/article/details/82018008
这里需要注意的是整个网络分为两部分:
- 第一部分是利用词特征矩阵C获得词的分布式表示(即词嵌入)。
- 第二部分是将表示context的n个词的词嵌入拼接起来,通过一个隐藏层和一个输出层,最后通过softmax输出当前的p(wt|context)(当前上下文语义的概率分布,最大化要预测的那个词的概率,就可以训练此模型)。
第一部分词嵌入的获取如下图所示:
这里可以看到最初的输如其实是词的one-hot表示,而这里的中间的w矩阵就是c矩阵。
其中第i
行对应的是one-hot表示中第i
项为1
的词向量的词嵌入。词向量与矩阵相乘后就可以得到自己的词嵌入了。由于C是神经网络的参数,所以词的词嵌入会随着模型的训练不断得到优化。
在网络的第二部分中,表示context的n个词嵌入通过隐藏层进行语义组合,最后经过输出层使用softmax输出预测的词向量,因为本模型是基于n-gram模型,所以只要最大化正确预测当前词即可。最后不但训练了一个用神经网络表示的语言模型,而且还获得了词语的词嵌入(存在矩阵C中)
从第二部分的输入到输出层有一个直连边,一般情况下该直连边的权重矩阵可以设为0,在最后的实验中,Bengio 发现直连边虽然不能提升模型效果,但是可以少一半的迭代次数。同时他也猜想如果没有直连边,可能可以生成更好的词向量。
nnlm模型的其他细节可以参考上面的连接。
2.2 C&W模型
首先要明确:nnlm模型的目标是构建一个语言概率模型,而C&W模型则是以生成词向量为目的模型。
在nnlm中最废时间的是隐藏层到输出层的权重计算。由于C&W模型没有采用语言模型的方式求解词语上下文的条件概率,而是直接对n元短语打分,这是一种更快速获取词向量的方式。
而其简单来讲就是:如果n元短语在语料库中出现过,那么模型会给该短语打高分;如果是未出现在语料库中的短语则会得到较低的评分。
优化的目标函数是:
其中为 语料库中抽取的n元短语,为保证上下文词数的一致性,n为奇数。
其中是目标词,c是目标词的上下文语境
其中是从词典中随机抽取的一个词语。
C&W模型采用的是成对的词语方式对目标函数进行优化。这里(w,c)表示正样本,(w’,c)表示负样本,负样本是将正样本序列中的中间词替换为其他词得到的。一般而言,如果用一个随机的词语替代正确文本序列的中间词,得到的新的文本序列基本上都是不符合语法习惯的错误序列,这种构造负样本的方法是合理的。同时由于负样本仅仅修改了正样本的一个词得到的,故其基本的语境没有改变,因此不会对分类效果造成太大的影响。
与nnlm模型的目标词所在输出层不同,C&W模型的输入层就包含了目标词,其输出层也变为了一个节点,该节点输出值的大小就代表n元短语的打分高低。相应的,C&W模型的最后一层运算次数是|h|,远低于nnlm的|v|x|h|次。
C&W模型设计了2个网络来完成词性标注 (POS)、短语识别(CHUNK)、命名实体识别(NER) 和语义角色标注 (SRL)这些nlp任务。其中一个模型叫window approach,另一个叫sentence approach。其中词嵌入的预训练用的是window approach,只是把输出层的神经原个数改成了1个,window approach网络结构见下图
其中,窗口大小为n,中心的那个词为中心词,上下文各(n-1)/2个词。作者利用该模型以无监督的方法预训练词嵌入来提高在具体工作上的效果,最后的输出层只有一个神经元,表示该中心词与上下文语义关联程度的得分。得分高则说明该中心词在当前位置是符合上下文语义的,得分低则说明该中心词在当前位置不符合上下文语义。
2.3 CBOW模型
上面说多的nnlm模型以训练语言模型为目标,同时得到了词表示。而word2vec包含了CBOW和Skip-gram两个得到词向量为目标的模型。
这里要注意的地方是:CBOW和Skip-gram模型当中,目标词是一个词串联的词,也即是该词是在一句话的中间某个词,并拥有上下文。而nnlm的是最后一个词,并作为要预测的词。
由图可知,该模型使用一段文本的的中间词作为目标词,同时cbow模型去掉了隐藏层,大大提高了预运算速度,也因此其输入层就是语义上下文的表示。此外cbow模型,使用上下文各词的词向量的平均值替代nnlm模型各个拼接的词向量。
整体流程:
首先明确输入是周围词的词向量,而输出则是当前词的词向量,也就是通过上下文来预测当前的词。
CBOW包含了输入层、投影层、以及输出层(没有隐藏层)。其运算流程如下:
- 随机生成一个所有单词的词向量矩阵,每一个行对应一个单词的向量
- 对于某一个单词(中心词),从矩阵中提取其周边单词的词向量
- 求周边单词的的词向量的均值向量
- 在该均值向量上使用logistic regression 进行训练,softmax作为激活函数
- 期望回归得到的概率向量可以与真实的概率向量(即中心词的one-hot编码向量)相匹配
CBOW对目标词的条件概率计算如下:
CBOW的目标函数与NNLM模型类似,具体为最大化:
2.4 Skip-gram模型
Skip-gram模型的结构如下:
由图可知, Skip-gram模型同样没有隐藏层,但与CBOW模型的输入上下文词的平均向量不同, Skip-gram模型是从目标词w的上下文中选择一个词,将其词向量组成上下文的表示。
Skip-gram模型的目标函数:
2.5 CBOW和Skip-gram模型的对比
其中CBOW是周围的词预测中间的词,最大化对w(t)的预测。Skip-gram是中间的词预测周围的词,最大化对w(t-2),w(t-1),w(t+1),w(t+2)的预测之和。由于没有隐藏层,所以2个网络都是线性模型。正因为如此,模型的训练时间比较短,只花了一天就训练了16亿单词的语料。且获得的词嵌入质量很好,还具有“king”-“man”+“women”=“queen”的语义规律。
论文中使用了两种训练方法,一种是哈夫曼树结构的Hierarchical Softmax,另一种是Negative Sampling,它们的使用都是为了缩短训练时间。由于这两个技术这是加快训练的技术,不是网络结构。
不过正是这2个技术的运用缩短了训练时间(另外一个缩短时间的原因是删掉隐藏层),使其更快地生成了质量好的词嵌入,值得重视。
以Skip-gram模型为例,其采用了用哈夫曼树结构构建的Hierarchical Softmax,最终要优化的概率密度函数如下:
用Negative Sampling的方法,它以一个正样本和几个随机采取的负样本作为优化目标:
网络对比:
对比上面介绍的模型我们发现,后面的模型都是以NNLM为基础进行修改的。其中主要修改有3个部分:输入层,隐藏层,输出层。其中输入层是存储词嵌入的层,隐藏层是做语义重组的层,输出层是根据目标构造输出语义的层。
以NNLM作为对比对象。后面几个模型的修改情况如下:
- C&W:修改了输入和输出层
- CBOW :去除了隐藏层,输出层优化
- skip-gram:去除了隐藏层,修改了输入层,输出层优化
根据上面的对比,总结一下:
- 对与每个模型来说,输入是上下文,输出是预测,这些模型的核心是用上下文做预测。
- C&W只是为了具体任务来做词嵌入的预训练,所以它把要预测的和上下文放在一起,以得分的形式进行判断,最大化正例和反例的得分差。
- CBOW没有隐藏层,直接叠加构造语义输出,或许正是如此所以训练的词嵌入具有线性语义特征。其当前的预测是作为上下文语义的词嵌入的线性叠加。
- Skip-gram以一个单词作为上下文,多次预测周围的词。它的成功是否表明预测是可逆的,即A可预测B,则B可预测A,而其根本原因是A与B具有相似语义。而这种相似的产生是因为模型没有隐藏层,只有线性变换?
总之:一个好的神经网络语言模型就是尽可能构造好的上下文,选择好语义重组方式,并使用可以实现高效训练的预测方法。
参考:
《pytho自然语言处理实战 核心技术与算法》
https://blog.csdn.net/qq_31456593/article/details/77542071