浅析Word2Vec

烈酒焚心 提交于 2019-12-16 02:08:06

1 预备内容

1.1 NLP任务

NLP的目标是设计算法让计算机去理解自然语言并去解决某些问题。

所有NLP任务德第一步,就是如何将单词表示为模型的输入。为了使得大多数NLP任务表现良好,我们首先需要能够用向量表示单词的相似性和差异性。有了这些词向量,我们可以简单的用向量自身的能力来计算相似性(如Jaccard, cos等)

1.2 Distributional Semantics

A word’s meaning is given by the words that frequently appear close-by.

J. R. Firth 在1957年指出:“You shall know a word by the company it keeps”

1.3 one-hot向量

将每个单词表示成大小为V×1|V| \times 1的向量,该向量只有一个位置为1,其余都为0。其中为1的位置表示该向量在排序后的字典中的索引值。下图是一个例子:
one-hot向量示例
这种使用one-hot向量来表示词向量的优点是简单,但是最大的缺点,就是无法表示单词之间的相似性。如上所示的例子,(wa)Twzebra=0(w^{a})^T \cdot w^{zebra} = 0

1.4 softmax函数

softmax(xi)=exp(xi)j=1nexp(xj)=pisoftmax(x_i)=\frac {exp(x_i)} {\sum_{j=1}^n exp(x_j)} = p_i
softmax函数将任意值xix_i映射为概率pip_i,并保证归一化保证和为1。

  • max: 放大了最大值xix_i的概率
  • soft: 仍为最小值xix_i分配概率

2 浅析Word2Vec

2.1 概述

我们训练一个只有一层隐层的简单神经网络来完成该任务,但是我们对模型的最终输出并不感兴趣,而是专注于隐层的权重矩阵——这些权重就是我们所要学习的词向量。

有了词向量,我们可以用代数来计算相似度问题。问题如下:我们已知国王和男性是一组词,女王和女性是一组词。现在我们想让计算机完成这样的推理过程。

我们可以计算向量X=vector(king)vector(man)+vector(woman)X = vector('king') - vector('man') + vector('woman')。然后我们在向量空间中搜索距离X最近(使用余弦距离)的那个向量,并把它作为问题的答案。当模型训练完成后,我们应该能够通过此方法,得到那个正确的答案queen。再举一个例子,ParisFrance+Italy=RomeParis - France + Italy = Rome
词向量还可以被用于拓展知识库中的事实,或者验证现有事实的正确性。

2.2 Skip-Gram模型

我们想要训练一个能够完成以下任务的神经网络。给定句子中的一个中心词(输入词),查看它周围的单词并随机选择一个。该网络能够告诉我们对于词汇表中每个单词作为邻近单词(上下文词语, context word)的概率。

此处的nearby,实际上是一个窗口大小,也就是模型的参数。若窗口大小为5,则表示中心词的前5个单词和后5个单词,共10个单词。

输出概率表示词汇表中的每个单词在输入词(中心词)周围被找到的概率。举个例子,假设给定的中心词是"Soviet",那么对于单词"Union"和"Russia"的输出概率会比"apple"和"cat"大的多。

我们使用训练文档中的单词对来训练神经网络。下方的例子展示了从语句“The quick brown fox jumps over the lazy dog”中获得的训练样本(单词对)。该例子的窗口大小为2,蓝色背景的字表示输入词。
训练样本示例
神经网络将从每对单词对出现的次数中获得统计信息。所以,举个例子,神经网络可能会获得很多训练样本如(Soviet,Union),很少的(Soviet, Sasquatch)。当训练完成后,你输入Soviet,它就会为单词Union或Russia分配高概率,而为Sasquatch分配低概率。

2.2.1 模型的细节

首先,你不能直接的将字符串形式表示的单词输入神经网络中,我们需要一种方式来表示单词。为了达到这一要求,通常我们会建立一个由训练文档中单词组成的词汇表(该词汇表中没有重复的单词)。

假设我们构建的词汇表有10,000个不同的单词。我们把输入的单词用one-hot向量表示出来,即输入单词向量大小为10000×110000 \times 1。而网络的输出也是单个向量,大小为10000×110000 \times 1,表示该单词被随机选择作为邻近单词的概率。

skip-gram model
该网络在隐层没有激活函数,但是输出层使用了softmax分类器。我们使用单词对来训练该网络,网络的输入和输出都是用one-hot向量表示的单词。但是当你在一个已经训练好的网络上输出单词时,输出向量实际上是一个概率分布。该输出向量的每一行表示:词汇表中的单词被随机选择作为邻近单词的概率。

下面我们来详细谈谈该网络。

2.2.2 隐层

对于我们的这个例子,我们正在学习具有300个特征的单词向量。因此隐层的权重矩阵大小为10000×30010000 \times 300,每一行表示词汇表中的一个单词,每一列表示每个隐层神经元。

300 features is what Google used in their published model trained on the Google news dataset. The number of features is a “hyper parameter” that you would just have to tune to your application (that is, try different values and see what yields the best results).

如果你看这个权重矩阵的行,这些就是我们的词向量!
hidden layer
因此要做的就是去学习这个隐层的权重矩阵,而我们并不care输出层的结果。

让我们想一下,当你把一个1×100001 \times 10000的one-hot向量去乘以一个10000×30010000 \times 300的权重矩阵,你会得到什么结果?结果为1×3001 \times 300的向量正好是one-hot向量中那个"1"所在的列所对应的权重矩阵的行。下面举个例子说明,这个
矩阵乘法说明
这也就意味着,模型的隐层就好比是一个查找表。隐层的输出就是输入单词的词向量。

2.2.3 输出层

那个用1×3001 \times 300表示的输入单词(假设该单词是ant)的词向量被传到输出层。输出层是一个softmax回归分类器。每一个输出神经元(词汇表中的每个单词)会输出0和1之间的实数,而这些实数值加起来的和为1。

特别地,每个输出神经元有一个权重向量,它与隐层中的向量相乘,然后再把它应用到函数exp(x)exp(x)中得到结果。最终为了归一化,我们会把这个结果除以所有10000个输出节点的和。
在这里插入图片描述
注意到,神经网络是不知道输出单词相对于输入单词的偏移量。它不会学习输入单词之前词和之后词的不同集合。为了说明这一点,我们说在训练样本中,每次York都是在New后共现。也就是说,对于输入训练数据,有100%的概率,New在York的附近。但是,如果我们随机选10个York附近的单词,不会100%得到New,你可能得到其他词作为了York的邻近词。

2.2.4 小结

如果两个不同的单词有着相似的上下文内容,那么模型的输出也会得到非常相似的结果。你不难想象,同义词intelligent和smart会有着相似的上下文,而engine和transmission也可能会有着相似的上下文。

这也可以帮你处理词干分析。该网络可能会学习“ant”和“ants”这两个词的相似词向量,因为它们应该有相似的上下文。

2.3 Continuous Bag of Words模型(CBOW)

CBOW要做的事刚和和skip-gram相反。该模型能够根据给定的上下文,来预测中心词。其模型结构如下所示,原理请自行参考skip-gram。
在这里插入图片描述
在CBOW模型中,输入单词的先后顺序不会影响模型的权值矩阵,我们会将这些向量投影到同一位置然后去平均。就如同,Skip-gram的输出向量一样,它并不知道相对于中心词的偏移量。

all words get projected into the same position (their vectors are averaged). We call this architecture a bag-of-words model as the order of words in the history does not influence the projection.

2.4 加速策略1——Hierarchical Softmax

Hierarchical Softmax是对输出层普通softmax分类器的一种加速策略,也是一种有效地替代方法。它最大的优势就在于将原本的复杂度从O(V)O(|V|)降成了O(log2(V))O(log_2(|V|)),其中|V|是词汇表的大小。

Hierarchical Softmax使用一个二叉树来表示词汇表中的所有单词。树中每个叶子节点都是一个单词,从根节点到叶节点有且只有一条路径。在这个模型中,没有单词的输出表示。相反,图的每个节点(除了根节点和叶子节点)都与模型所要学习的向量相关联。

在这个模型中,给定向量wiw_i表示单词w的概率P(wwi)P(w|w_i),等同于从根节点出发随机漫步到叶子节点w的概率。这样计算概率的最大好处,就是时间开销只有O(log2(V))O(log_2(|V|)),只于路径的长度相关。

下面我们引入一些标记。令L(w)L(w)表示从根节点到叶子节点w路径上的节点个数(不包括叶子节点本身)。用n(w,i)n(w,i)表示路径上的第i个节点所关联的词向量vn(w,i)v_n(w,i)。那么n(w,1)n(w,1)就是根节点,而n(w,L(w))n(w, L(w))就是w的父亲节点。现在,对于每个路径上的节点n,我们任意的选择它的一个孩子,并记为ch(n)ch(n)。然后我们就可以用下面的公式来计算概率了:
在这里插入图片描述
我们对上述公式进行说明,首先我们根据从根节点n(w,1)n(w,1)到叶子节点w的路径来计算相乘的项。如果我们假设,ch(n)ch(n)总是取左孩子,那么当路径向左走时,[n(w,j+1)=ch(n(w,j))][n(w, j+1) = ch(n(w, j))]返回1,反之返回0。然后我们通过向量间的点乘来比较我们的输入向量vwiv_{w_i}和每个内部结点向量vn(w,j)Tv^T_{n(w, j)}的相似度。

为了训练模型,我们的目标仍然是最小化负对数似然logP(wwi)-logP(w|w_i)。但是我们不是更新每个次的输出向量,而是更新二叉树中从根节点到叶子节点路径上的节点的向量。

这种方式的速度取决于而查实的构建方式和单词分配各叶子节点的方式。Mikolov 在论文《Distributed Representations of Words and Phrases and their Compositionality.》中使用的是哈夫曼树。哈夫曼树会为高频词分配较短的编码,以此加快了训练速度。

2.5 加速策略2——Negative Sampling

在之前的章节中我们说到,对于skip-gram模型,隐层和输出层的权重矩阵的大小是10000×30010000 \times 300,也就是3 million的权值。在这个神经网络上进行梯度下降,大概率会耗费巨大的时间精力。更糟糕的是,你需要大量的训练数据来调整权值,避免过拟合。为了解决这一问题,Mikolov在《Distributed Representations of Words and Phrases and their Compositionality》中提出了以下两个方式:

  1. 对高频词汇进行subsampling,来减少训练样本的数量
  2. 使用negative sampling来优化目标函数(又称损失函数),每一次训练样本的迭代,只需要更新小部分的模型权值。

注意到上述的两个方式不仅仅减少了训练的时间开销,同时也提升了最终的词向量的质量。

2.5.1 Subsampling Frequent Words

下方的例子展示了从语句“The quick brown fox jumps over the lazy dog”中获得的训练样本(单词对)。该例子的窗口大小为2,蓝色背景的字表示输入词。
训练样本示例
我们观察训练样本,会发现通用词"the"的一些问题:

  1. 当你查看单词对时,(fox, the)不会给我太多关于fox的意思,“the”几乎出现在每个单词的上下文中。
  2. 我们会有很多的样本(the, …),这对于我们学习the的向量是很有用的。

可以预料到的是,经过数百万样本的训练,高频词的词向量不会发生太大的改变。因此Word2Vec采用了subsampling模式来解决该问题。对于每个出现在训练文本中的单词,会有一定的概率将它从文本中删除。而这一概率取决于该单词的出现频率。下面我们来看一下这个删除的阈值。

在Google发布的Word2Vec C语言实现版本中,采用了以下公式计算单词保留在词汇表中的概率。

wiw_i表示训练集中的单词,f(wi)f(w_i)表示该单词在语料库中的出现频率,P(wi)P(w_i)表示保留该单词的概率。
P(wi)=(f(wi)t+1)tf(wi)P(w_i)=(\sqrt{\frac{f(w_i)} {t}}+1) \cdot \frac {t} {f(w_i)}
其中t表示阈值,通常设置为0.001。
在这里插入图片描述
下面是这个函数几个有趣的点:

  • f(wi)<=0.0026f(w_i)<=0.0026时,P(wi)=1.0P(w_i)=1.0,意味着当单词的出现频率小于0.0026时,它100%会被保留
  • f(wi)=0.00746f(w_i)=0.00746时,P(wi)=0.5P(w_i)=0.5,意味着当单词出现的频率为0.00746时,有50%的概率被保留
  • f(wi)=1.0f(w_i)=1.0时,P(wi)=0.033P(w_i)=0.033,当单词100%出现时,他被保留的概率只有3.3%

2.5.2 负采样 Negative Sampling

训练神经网络意味着以根据某个样本,稍微调整所有神经元的权值,以便更准确地预测训练样本。换句话来说,每个训练样本都会调整神经网络的所有权重。

正如我们上面所说的,词汇表大小意味着我们的神经网络有着巨大的权重矩阵,所有的这些都会被数以亿计的训练样本所更新。

负采样通过每次只更新一小部分权重来解决这一问题,下面我们来看一下它的工作方式。

当你用样本(fox,quick)训练神经网络时,回忆到神经网络的输出是一个one-hot向量。这也就是说,对于输出神经元,这要那个关于quick的神经元输出为1,剩下的数千个神经元都输出为0即可。

对于负采样,我们将随机选择少量的“negative”单词(比如5个)来更新权值。(negative单词就是那些我们希望网络输出0的单词)。同时,我们也会为“positive”单词来更新权值(在这个例子中,positive单词就是quick)。

论文《Distributed Representations of Words and Phrases and their Compositionality》中提到,对于较小的数据集,一般选择5-20个单词,而对于较大的单词,一般选择2-5个单词

回忆道,我们的输出层有一个300×10000300 \times 10000的权重矩阵。现在,我们将只更新我们的positive单词(“quick”)的权重,加上我们希望输出0的其他5个单词的权重。也就是6个输出神经元,一共300×6=1800300 \times 6 = 1800个权值。这只占原来的3M个权值的0.06%,大大减少了更新的权值数量。

而在隐层,只有输入单词的权重会被更新,无论你采不采用negative sampling都是这样。

2.5.3 选择负样本

我们使用unigram分布来选择这些负样本,因为出现频率越高的词越有可能被选为负样本(想象一下,冠词a是不是大多数情况下,都属于负样本)。

举例来说,假设你将训练语料库转换成了单词列表,现在你要从中选取5个负样本。在这个例子中,你选择到某个单词的概率,就等同于它在语料库中出现的次数除以语料库单词的总数,可以用以下公式表示:
P(wi)=f(wi)j=0n(f(wi))P(w_i) = \frac {f(w_i)}{\sum_{j=0}^n (f(w_i))}
作者在他们的论文中说,他们尝试了这个公式的一些变化,其中表现最好的是把单词频率增加到3/4次方:
P(wi)=f(wi)3/4j=0n(f(wi)3/4)P(w_i) = \frac {f(w_i)^{3/4}}{\sum_{j=0}^n (f(w_i)^{3/4})}
下面我们代入几个数字来解释一下这个公式:0.93/4=0.920.093/4=0.160.013/4=0.0320.9^{3/4} = 0.92, 0.09^{3/4} = 0.16, 0.01^{3/4} = 0.032
从中我们不难发现,对于很小的概率0.01,3/4次幂放大了这个概率近3倍。

2.6 加速策略小结

Hierarchical Softmax 和 Negative Sampling都是对输出层的优化方式,对于CBOW和skip-gram模型都是适用的。在实践中,Hierarchical Softmax对低频词表现的良好,而Negative Sampling对高频词和低纬向量表现良好。在推理任务上而言,Negative Sampling表现比Hierarchical Softmax要好。以下是论文中的原话:

It can be argued that the linearity of the skip-gram model makes its vectors more suitable for such linear analogical reasoning, but the results of Mikolov et al. [8] also show that the vectors learned by the standard sigmoidal recurrent neural networks (which are highly non-linear) improve on this task significantly as the amount of the training data increases, suggesting that non-linearmodels also have a preference for a linear structure of the word representations.

2.7 模型训练的一些参数设定

The choice of the training algorithm and the hyper-parameter selection is a task specific decision, as we found that different problems have different optimal hyperparameter configurations. In our experiments, the most crucial decisions that affect the performance are the choice of the model architecture, the size of the vectors, the subsampling rate, and the size of the training window.

参数名 参考值 说明
向量维度 300 300个特征
窗口大小 5 中心词的前5个和后5个单词
subsampling阈值 0.001

参考文献

[1] Mikolov, Tomas, et al. “Efficient estimation of word representations in vector space.” arXiv preprint arXiv:1301.3781 (2013).
[2] Mikolov, Tomas, et al. “Distributed representations of words and phrases and their compositionality.” Advances in neural information processing systems. 2013.
[3] http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
[4] http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!