【NLP】词向量的惊人力量

对于今天的帖子,我不仅从一篇论文中抽取材料,而且从五篇文章中抽取材料!主题是'word2vec' - Mikolov等人的着作。在谷歌有效的矢量表示的单词(以及你可以用它们做什么)。论文是:

从这些论文的第一篇(“高效估计......”)中,我们得到了用于学习单词向量的连续词袋连续Skip-gram模型的描述(我们将在一瞬间谈论单词向量是什么...... )。从第二篇论文中我们可以更多地了解单词向量的功能,一些关于跳过 - 克模型(分层softmax和负抽样)优化的附加信息,以及将单词向量应用于短语的讨论。第三篇论文('Linguistic Regularities ...')描述了基于单词向量的面向向量推理,并介绍了着名的“King - Man + Woman = Queen”示例。最后两篇论文更详细地解释了米洛科夫论文中一些非常简洁的观点。

查看Google Code上的word2vec实现

什么是单词矢量?

在一个层面上,它只是一个权重向量。在简单的1-N(或“单热”)编码中,向量中的每个元素与词汇表中的单词相关联。给定单词的编码只是将对应元素设置为1的向量,而所有其他元素都为零。

假设我们的词汇只有五个单词:King,Queen,Man,Woman和Child。我们可以将'Queen'这个词编码为:

使用这样的编码,除了相等测试之外,我们可以在单词向量之间进行有意义的比较。

在word2vec中,使用单词的分布式表示。采用具有几百维度的向量(比如1000)。每个单词都由这些元素的权重分布表示。因此,不是向量中的元素与单词之间的一对一映射,而是将单词的表示分布在向量中的所有元素上,并且向量中的每个元素都有助于定义许多单词。

如果我在假设的单词向量中标注维度(当然算法中没有这样的预先指定的标签),它可能看起来像这样:

这样的向量以某种抽象的方式表示单词的“含义”。正如我们接下来将要看到的,仅仅通过检查大型语料库,就可以学习能够以令人惊讶的表达方式捕捉单词之间关系的单词向量。我们也可以使用向量作为神经网络的输入。

 

用词向量推理

我们发现学到的单词表示实际上以非常简单的方式捕获有意义的句法和语义规则。具体地,规则被观察为共享特定关系的单词对之间的恒定向量偏移。例如,如果我们定义的矢量字X 我,并专注于单/复数关系,我们观察到Xapple – Xapples ≈ Xcar – Xcars, Xfamily – Xfamilies ≈ Xcar – Xcars, 等等。也许更令人惊讶的是,我们发现这也是各种语义关系的情况,正如SemEval 2012测量关系相似性的任务所衡量的那样。

这些载体都非常擅长回答的形式的类比的问题一个bÇ。例如,男人女人叔叔阿姨)使用基于余弦距离的简单向量偏移方法。

例如,这里是三个单词对的向量偏移,说明了性别关系:

在这里,我们看到了单数复数关系:

这种矢量组合也让我们回答“King - Man + Woman =?”的问题并得出结果“女王”!当你认为所有这些知识都来自于在上下文中查看大量单词(我们很快就会看到)而没有提供有关其语义的其他信息时,所有这些都是非常值得注意的。

有些令人惊讶的是,人们发现单词表示的相似性超出了简单的合成规律。使用单词偏移技术对单词向量执行简单的代数运算,例如,向量(“King”) - 向量(“Man”)+向量(“Woman”)导致最接近的向量女王这个词的向量表示。

国王,男人,女王和女人的矢量:

矢量组合King - Man + Woman =?

以下是使用相同技术获得的更多结果:

以下是二维PCA预测中的国家 - 首都城市关系:

这里有一些'a is to b as c is to?'的例子。单词向量回答的样式问题:

我们还可以使用向量元素的元素添加来提出诸如“德语+航空公司”之类的问题,并通过查看复合向量中最接近的标记得出令人印象深刻的答案:

具有这种语义关系的单词向量可以用于改进许多现有的NLP应用程序,例如机器翻译,信息检索和问答系统,并且可以使其他未来的应用程序尚未发明。

语义 - 合成词关系测试用于理解各种关系,如下所示。使用640维单词向量,一个skip-gram训练模型实现了55%的语义准确性和59%的合成准确性。

 

学习单词向量

Mikolov等。并不是第一个使用连续矢量表示的词,但他们确实展示了如何降低学习这种表示的计算复杂性 - 使得在大量数据上学习高维词向量变得切实可行。例如,“我们使用Google新闻语料库来训练单词向量。该语料库包含大约6B个令牌。我们将词汇量限制在100万个最频繁的单词......“

神经网络语言模型(前馈或重复)的复杂性来自非线性隐藏层。

虽然这是使神经网络如此具有吸引力的原因,但我们决定探索更简单的模型,这些模型可能无法像神经网络那样精确地表示数据,但可以有效地训练更多数据。

提出了两种新的体系结构:连续词袋模型和连续Skip-gram模型。让我们先看看连续的词袋(CBOW)模型。

考虑一篇散文,例如“最近推出的连续Skip-gram模型是学习高质量分布式矢量表示的有效方法,可以捕获大量精确的合成和语义单词关系。”想象一下文本上的滑动窗口,其中包括当前焦点的中心词,以及前面的四个词,以及它后面的四个词:

上下文单词构成输入层。每个单词都以单热形式编码,因此如果词汇量大小为V,则这些将是V维向量,其中只有一个元素设置为1,其余为零。有一个隐藏层和一个输出层。

训练目标是在给定输入上下文单词的情况下最大化观察实际输出单词(焦点单词)的条件概率。在我们的例子中,给定输入(“an”,“high”,“method”,“for”,“high”,“quality”,“distributed”,“vector”),我们希望最大化获得“学习”的概率“作为输出。

由于我们的输入矢量是一热的,因此将输入矢量乘以权重矩阵W1相当于简单地从W1中选择一行。

给定C输入字向量,隐藏层h的激活函数等于简单地对W 1中的相应“热”行求和,并除以C以取其平均值。

这意味着隐藏层单元的链接(激活)功能简单地是线性的(即,直接将其加权的输入和传递到下一层)。

从隐藏层到输出层,第二权重矩阵W 2可用于计算词汇表中每个单词的分数,而softmax可用于获得单词的后验分布。

 skip-gram模型是CBOW模型相反。它由焦点词作为单个输入向量构造,目标上下文词现在位于输出层:

隐藏层的激活功能仅仅等于从权重矩阵W 1(线性)复制相应的行,如前所述。在输出层,我们现在输出C多项分布而不是一个。训练目标是最小化输出层中所有上下文单词的总和预测误差。在我们的例子中,输入将是“学习”,我们希望看到(“一个”,“有效”,“方法”,“用于”,“高”,“质量”,“分布式”,“向量”)在输出层。

 

最优化

必须为训练实例中的每个单词更新每个输出单词向量是非常昂贵的....

为了解决这个问题,直觉是限制每个训练实例必须更新的输出向量的数量。实现这一目标的一个优雅方法是分层softmax; 另一种方法是通过抽样。

分层softmax使用二叉树来表示词汇表中的所有单词。这些词本身就是树上的叶子。对于每个叶子,存在从根到叶子的唯一路径,并且该路径用于估计由叶子表示的单词的概率。“我们将这个概率定义为随机行走的概率,从根末端的叶子开始。”

主要的优点是,不是评估神经网络中的V输出节点来获得概率分布,而是需要仅评估log_{2}(V)字...在我们的工作中,我们使用二进制Huffman树,因为它分配短代码对于导致快速训练的频繁词汇。

负抽样只是我们只更新每次迭代的输出字样本的想法。目标输出字应保存在样本中并进行更新,我们将一些(非目标)字添加为负样本。“采样过程需要概率分布,可以任意选择......人们可以根据经验确定良好的分布。”

Mikolov等。还使用简单的子采样方法来对抗训练集中罕见和频繁单词之间的不平衡(例如,“in”,“the”和“a”提供的信息值比稀有单词少)。训练集中的每个单词以概率P(w_{i})丢弃

f(w_{i}) 是单词的频率w_{i} 是一个选定的阈值,典型地为约10^{-5}

原文:https://blog.acolyer.org/2016/04/21/the-amazing-power-of-word-vectors/

猜你喜欢

转载自blog.csdn.net/ChenVast/article/details/82114175