NLP自然语言处理实战(四):词向量推理(Word2vec)

在前面的学习中,我们忽略了词附近的上下文信息,包括每个词周围的其他词、相邻词对该词词义的影响,以及词之间的关系对句子整体语义的影响。
在本章中,我们将从少量词的邻域中创建更小的词袋,一般会少于10个词条,同时确保这些邻域的语义不会溢出到相邻的句子中。

1. 词向量

2012年,微软实习生Thomas Mikolov发现了一种用一定维度的向量表示词的含义的方法,他训练了一个神经网络来预测每个目标词附近的共现词。2013年,Mikolov和他的队友在谷歌发布了创建这些词向量的软件,成为Word2vec。
Word2vec仅仅基于大型未标记文本语料库来学习词的含义,而不需要标记Word2vec词汇表中的词。正是Word2vec这种无监督的特性使它无比强大,因为世界上充满了未标记、未分类、非结构化的自然语言文本。
教网络预测句子中目标词附近的词,而不是通过带有词含义的标签来直接学习目标词的含义。在这个意义上,也可以算是有标注:待预测的相邻词。不过这些标注来自数据集本身,不需要手工标注。
Word2vec将学习到一些大家可能认为与所有词本身并不相关的东西,例如大家是否知道其实每个词都有一定的地理位置、情感(积极性)和性别倾向性?如果语料库中有任何一个词具有某种属性,如“placeness”(平和)、“peopleness”(有人情味)、“conceptness”(概念化)或“femaleness”(女性化)等,那么其他所有的词也会在词向量的这些属性上得分。当Word2vec学习词向量时,可以认为某个词的意义“感染”了其相邻词。
为了帮助大家更直观地理解词向量,可以把词向量看作是一个权重或分数的列表,列表中的每个权重或分数都对应于这个词在某个特定维度的含义。


1.1 面向向量的推理

面向向量的推理意味着可以用词向量做数学运算,再把得到的结果向量转换成词。
例如问题:
The Timbers are to Portland as what is to Seattle?
(波特兰的伐木者队应与西雅图的什么队?)
可以用向量代数进行解答
在这里插入图片描述
Word2vec模型“知道”术语Portland(波特兰)和Portland Timbers(波特兰伐木者队)之间的距离与Seattle(西雅图)和Seattle Sounders(西雅图海湾人队)之间的距离大致相同,并且这些距离的方向(向量对之间的差异)大致相同。可以把Portland和Seattle两个向量之间的差值加到Portland Timbers的向量上,这样得到的结果应该接近术语Seattle Sounders的向量。
在进行词向量的加减运算后,得到的向量一般不会正好等于词向量表中的某个向量。不过,Word2vec词向量通常有100维,每个维度上都有连续的实值,词向量表中与运算结果最接近的向量通常就是NLP问题的答案。


1.2 如何计算Word2vec表示

词向量将词的语义表示为训练语料库中上下文中的向量。这不仅能回答类比问题,还能让大家用更为通用的向量代数去推理词的含义。训练Word2vec嵌入有两种方法:

  • skip-gram方法:基于目标词(输入词)预测上下文(输出词)
  • 连续词袋(continuous bag-of-words, CBOW)方法:基于邻近词(输入词)预测目标词(输出词)

1.2.1 skip-gram

在skip-gram训练方法中,需要预测输入词周围窗口的词。在下面例子中,"painted"是神经网络的训练输入,对应的预测词输出是其相邻词“Claude”“Monet”“the”和“Grand”。
在这里插入图片描述
skip-gram是一种包含间隙的跳跃式n-gram语法,因为我们跳过了中间词条。在这个例子中,“painted”去预测“Claude”,跳过了“Monet”。

用来预测周围词的神经网络结构如下,网络有两层权重组成,隐藏层由n个神经元组成,其中n表示词的向量维数。输入层和输出层都包含M个神经元,其中M是模型的词汇表中的词的总数。输出层激活函数是分类问题中常用的softmax函数。
在这里插入图片描述


1.2.2 什么是softmax

当神经网络的目标是学习分类问题时,经常用softmax函数作为神经网络输出层的激活函数。softmax可以将输出结构压缩为0到1之间的值,所有输出的和加起来等于1。这样,softmax函数的输出层结果就可以当作概率。
在这里插入图片描述
在Word2vec模型中,Wt表示在位置t处的词条独热向量,如果使用skip-gram窗口大小为2来训练,则需要考虑每个目标词前后的两个词。
senrence = “Claude Monet painted the Grand Canal of Venice in 1806.”

输入词Wt期望输出Wt-2期望输出Wt-1期望输出Wt+1期望输出Wt+2
ClaudMonetpainted
MonetClaudpaintedthe
paintedClaudMonettheGrand
theMonetpaintedGrandCanal
GrandpaintedtheCanalof
CanaltheGrandofVenice
ofGrandCanalVenicein
VeniceCanalofin1908
inofVenice1908
1908Venicein

由输入词和周围词(输出词)组成的训练集构成了这个神经网络训练的基础数据。在周围词数量为4的情况下,将使用4次迭代训练网络,每次迭代都是基于输入词项预测其中一个输出词。
每个词在进入网络前被表示为一个独热向量。神经网络做词嵌入的输出向量也类似于一个独热向量。通过输出层节点(输出层上每个节点对应于词汇表中的一个词条)的softmax激活函数来计算输出词是输入词的周围词的概率。然后将最大概率的词转换为1,其余所有词转换为0,从而将输出词的概率向量转换为一个独热向量,这样处理可以减小损失函数的计算复杂度。
当完成神经网络训练后,经过训练后的网络权重可以用来表示语义。经过词条独热向量的转换,权重矩阵中的一行表示语料库词汇表中的一个词。语义相似的词被训练为预测相似的周围词,因此经过训练之后也会有相似的向量。
词向量模型训练结束后便不再进行额外的训练,因此可以忽略网络的输出层,只用隐藏层的输入权重来作为词嵌入表示。换句话说,这个权重矩阵就是大家所需要的词嵌入。输入词项的独热向量表示与权重的点积代表词向量嵌入。
在这里插入图片描述


1.2.3 连续词袋方法

在连续词袋(CBOW)方法中,将根据周围词去预测中心词。这里不用创建输入和输出词条标记对,而可以创建一个多热向量作为输入向量。

输入词Wt-2输入词Wt-1输入词Wt+1输入词Wt+2期望输出Wt
MonetpaintedClaud
ClaudpaintedtheMonet
ClaudMonettheGrandpainted
MonetpaintedGrandCanalthe
paintedtheCanalofGrand
theGrandofVeniceCanal
GrandCanalVeniceinof
Canalofin1908Venice
ofVenice1908in
Venicein1908

在这里插入图片描述


1.2.4 skip-gram和CBOW:什么时候用哪种方法

skip-gram方法对于小型语料库和一些罕见的词项比较适用,由于网络结构的原因,将会产生更多的训练样本。CBOW在常用词上有更高的精确性,并且训练速度会快很多。


1.2.5 Word2vec计算技巧

  1. 高频2-gram:
    为了提高Word2vec嵌入的精确率,在词汇表中加入了一些2-gram和3-gram作为词项。它们使用共现频率来区分应该被认为是单个词项的2-gram、3-gram,公式如下:
    在这里插入图片描述
    如果wi和wj经计算得到的分数高于阈值δ,则这两个词应当作为词项对被包含在Word2vec词汇表中。Word2vec将频繁出现的2-gram的两个词用一个字符(常用下划线“_”)连接起来,这样处理后,这些2-gram就可以表示为单个独热向量,而不再是两个单独的向量。

  2. 高频词条降采样:
    为了减少像停用词这样的高频词的影响,可以在训练过程中对词进行与其出现频率成反比的采样。其效果类似于IDF对TF-IDF向量的影响。相比于罕见词,高频词被赋以对向量更小的影响力。用下面的公式来确定给定词的采样概率,这个概率决定了在训练过程中是否将该词包含在skip-gram中:
    在这里插入图片描述
    f(wi)表示一个词在语料库中的出现频率,t表示频率阈值,超出这个阈值的才会进行降采样。阈值取决于语料库规模、平均文档长度和文档中词的多样性。

3.负采样:
当一个训练样本(一对词)输入网络后,会引起网络中所有权重的更新。这样会改变词汇表中所有词的向量值。如果词汇表规模达到十亿级,为一个大型的独热向量更新所有权重将会变得极其低效。
于是只在输出向量中选取少量的负样本进行权重更新,而不用去更新词窗口以外所有其他词的权重。选取n个负样本词对(目标输出词之外的词),根据其对输出的贡献来更新对应的权重。通过这种方法,可以极大地减小计算量,而且对训练网络性能不会有明显影响。
注意:如果是在一个小型语料库上来训练词向量,那么可以使用5 ~ 10个样本的负采样率。对于较大型的语料库和词汇表,可以将负采样率降低到2 ~ 5个 样本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值