概述
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模型中的神经网络是十分庞大的,为了训练权重获得词向量,其速度将是十分慢的,并且如此庞大的训练数据可能会带来过拟合,为了解决这两个问题,有以下措施:
- 将常见的单词组合(word pairs)或者词组作为单个“words”来处理。
- 对高频次单词进行抽样来减少训练样本的个数。
- 对优化目标采用“negative sampling”方法,这样每个训练样本的训练只会更新一小部分的模型权重,从而降低计算负担。