Word2Vec模型计算词向量

概述

Word2Vec是从大量文本中学习语义知识的一种模型,采用无监督的方式。简单来说就是通过训练大量文本,将文本中的词用向量形式表示,这个向量我们称之为词向量,转换成词向量的好处在于,我们可以通过计算两个词的词向量之间的距离,从而得知两个词之间的联系。比如“公交车”与“巴士”,这两个词的词向量之间的距离一定近于“公交车”与“太阳”的词距。

Word2Vec模型

接下来介绍计算词向量的方法。主要步骤是使用Skip-Gram或者CBOW获得(输入词,输出词)对。使用one-hot编码将输入词、输出词进行编码。前面这两步得到模型的训练样本。最后将编码过的输入词、输出词带入神经网络进行训练,输入矩阵乘输入-隐层权重矩阵结果即为输入词的词向量结果。流程图如图1所示。

 

图1 计算词向量流程图

模型细节

  • Skip-Gram、CBOW

首先Word2Vec模型中主要包含两种模型:Skip-Gram、CBOW。简单来说Skip-Gram是给定输入词预测上下文,而CBOW是给定上下文预测输入词,如图2所示。这两个模型实则都是为后文的神经网络提供训练样本。

图2 Skip-Gram模型(a)、CBOW模型(b)

以Skip-Gram模型为例,模型中有两参数,第一个参数是skip_window,这个参数代表窗口大小,用于每次给定输入词,要预测上下文的词的个数。例如“The quick brown fox jumps over lazy dog”这句话中,给定jumps,若skip_window为2,则最终得到的包括输入词jumps在内的窗口的词为[‘brown’,‘fox’, ‘jumps’, ‘over’, ‘lazy’]。第二个参数是num_skips,这个参数代表输出结果的个数,输出结果是(输入词,输出词)组合的形式,假设num_skips为2,则输出结果为(‘jumps’,‘brown’)和(‘jumps’,‘fox’)。

Skip-Gram和CBOW模型在求词向量中,实际起到的作用是为后文的神经网络模型提供训练样本。以上文的“The quick brown fox jumps over lazy dog”为例子,skip_window为2,num_skips为4,则结果如表1所示。

表1 Skip-Gram模型预测结果

输入词

输出结果1

输出结果2

输出结果3

输出结果4

The

('The', 'quick')

('The', 'brown')

   

quick

('quick', 'The')

('quick', 'brown')

('quick', 'fox')

 

brown

('brown', 'The')

('brown', 'quick')

('brown', 'fox')

('brown', 'jumps')

fox

('fox', 'quick')

('fox', 'brown')

('fox', 'jumps')

('fox', 'over')

jumps

('jumps', 'brown')

('jumps', 'fox')

('jumps', 'over')

('jumps', 'lazy')

over

('over', 'fox')

('over', 'jumps')

('over', 'lazy')

('over', 'dog')

lazy

('lazy', 'jumps')

('lazy', 'over')

('lazy', 'dog')

 

dog

('dog', 'over')

('dog', 'lazy')

   
  •  One-hot编码

通过Skip-gram模型,获得了神经网络的训练样本,但模型结果并不可以直接进行训练,还要利用one-hot编码对模型结果编码。one-hot编码是一种很简单的编码,根据词语在词汇表中出现的位置编码,即该词出现的位置为1,其他位置为0。还以上文The quick brown fox jumps overlazy dog为例,词汇表总共有八个词分别为The,quick,brown,fox,jumps,over,lazy,dog。The的编码即为[1 0 0 0 0 0 0 0],类似的,fox的编码即为[0 0 0 1 00 0 0]。完整编码结果见表2。

表2 one-hot编码结果

输入词

编码

The

1 0 0 0 0 0 0 0

quick

0 1 0 0 0 0 0 0

brown

0 0 1 0 0 0 0 0

fox

0 0 0 1 0 0 0 0

jumps

0 0 0 0 1 0 0 0

over

0 0 0 0 0 1 0 0

lazy

0 0 0 0 0 0 1 0

dog

0 0 0 0 0 0 0 1

 这只是一个简单的例子,而实际中,词汇表是由大量语料构成的,可以预见,每一个词的one-hot编码是非常长的,并且很多位为0,非常稀疏。下面便来介绍如何训练神经网络,如何获得词向量。

  •  神经网络训练

接下来简单介绍一下神经网络模型,“神经网络是由具有适应性的简单安源组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界所作出的交互反应”。一个神经网络模型包含输入层、隐层、输出层,输入层接收外界信号输入,隐层和输出层对信号进行加工处理,最后输出层输出结果。图3为一个简单的神经网络模型示意图,设定隐层层数为1,隐层神经元个数为3。


图3 神经网络模型

利用神经网络训练计算词向量时,采用一层隐层的神经网络,对于每一个训练样本,神经网络的输入为训练样本的输入,输入层的每个神经元表示输入词语的one-hot编码的每一位。由输入-隐层的权重矩阵,再由隐层-输出的权重矩阵,最终得到神经网络的输出,并且输出层的神经元个数必须与输入神经元个数相等。利用softmax函数将输出的每一位映射到0到1之间。


神经网络最终输出结果与训练样本的输出结果对比,通过梯度下降调整权重使得神经网络输出结果趋近于样本输出。训练好神经网络之后,输入矩阵与输入-隐层权重矩阵相乘结果即为输入词的词向量结果。显而易见最终词向量结果的维数由隐层的神经元个数决定。

  • 补充

在真实应用中,可以预见word2vec模型中的神经网络是十分庞大的,为了训练权重获得词向量,其速度将是十分慢的,并且如此庞大的训练数据可能会带来过拟合,为了解决这两个问题,有以下措施:

  1. 将常见的单词组合(word pairs)或者词组作为单个“words”来处理。
  2. 对高频次单词进行抽样来减少训练样本的个数。
  3. 对优化目标采用“negative sampling”方法,这样每个训练样本的训练只会更新一小部分的模型权重,从而降低计算负担。


猜你喜欢

转载自blog.csdn.net/qq_41200212/article/details/80791745