NLP学习系列04丨Word2Vec算法

一、Word2Vec模型摘要

Word2Vec 是一种语言模型,主要是根据当前的语境,来预测下一个单词出现的概率。而语言模型本身其实是一个离散分布模型。什么是语言模型?语言模型就是针对某一个词库(这里其实就是一个语言的所有单词),然后在某种语境下,产生下一个单词的模型。语言模型是一个产生式模型,而且这个产生式模型是产生单词这一离散数据的。

Word2Vec 的核心思想是,当前的单词是从周边单词的隐含表达,或者说是词向量中产生 的。也就是说,每一个单词都依赖于上下文,而这个单词的产生,并不是直接依赖周围单词的离散表达,而是依赖周边单词的连续表达。这个连续表达自然是事先不知道的,因此这就 是 Word2Vec 模型需要学习的未知参数。

Word2Vec 有两个不太一样的模型,第一种模型叫作Skip-Gram,或者简称SG 模型。这种模型的输入是一个词,输出是这个词周围的词。这样做的目的是,看我们能否用当前的词来预测周围的词。要想让这个任务有很好的表现,当前词的表征必须能够抓住某种语义的信息。具体来说,我们就是用当前词的表征向量,和所有其他词的表征向量做点积,然后再重新归一。这个过程就能够保证,当前词的表征向量和周围词的表征向量相似。这样也就解决了我们之前提到的,如何能够把词序影响到词的表征向量中。

另外一种模型叫作Continuous-Bag-of-Word,有时候简称CBOW模型。这种模型刚好和 SG 是相反的,也就是输入是一组词汇,而希望能够通过这组词汇得到中间某个词的预测。和我们刚才所说的一样,这个模型也是基于我们并不知道的表征向量来达到模型学习的目的。

不管是 SG 还是 CBOW,本质上,就是希望能够利用文章的上下文信息学习到连续空间的词表达,这是 Word2Vec 所有模型的核心

二、Word2Vec算法三个扩展

1.把学习词向量的工作推广到句子和文章里

这个扩展主要是解决如何能够更 加“自然”地学习到比词这个单位更大的单位(比如段落或者文档)的隐含向量。 当 Word2Vec 被发明之后,很多研究者都发现这是一个能够把离散的词表达成连续向量的利器。然而,一个应用场景很快就成为了大家的拦路虎,那就是 Word2Vec 仅仅是在词一 级数据上进行建模,却无法直接得到文档一级的隐含信息。

有一种做法是这样的,比如针对一个句子或者一个段落,我们就把这个句子里的词所使用的 词向量加权平均,认为这个加权平均过的结果就是段落的向量了。很明显,这是一种非常不 精确的处理方法。

那么,这篇文章的核心则是如何能够在模型本身上进行修改,从而可以学习到比词更加高一 层级单元的隐含向量。具体的做法,就是修改原始 Word2Vec 的上下文信息。我们回忆一 下 SG 模型和 CBOW 模型都有一个关键的信息,那就是利用上下文,也就是一个句子周围 的词来预测这个句子或者上下文中间的一个词。这就是 Word2Vec 能够利用上下文信息的 原因。那么这里的修改就是让这个上下文始终都有一个特殊的字符,也就是当前段落或者文 章的下标,从而这个下标所对应的隐含向量就是我们所要学习到的段落或者文档的向量。在 这样的情况下,作者们通过实验发现,学到的段落向量要比单独用加权平均的效果好得多。

2.把 Word2Vec 的思想扩展到了另外一种离散数据图(Graph)的表达上

我们设想一个社交网络(Social Network)的数据。每一个用户都有可能和其他用户相连,而两两相连的用户所组成的整个网络就是社交网络的庞大的用户信息。很明显,如果我们把用户看作单词,那么整个社交网络就是一个单词和单词的网络。如果我们把两个单词(在这里是用户)之间的连线看成是单词出现在一起的上下文,那么我们其实就可以利用 Word2Vec 这样的模型对社交网络所表达图进行建模。这就是这篇文章里作 者们利用 Word2Vec 对社交网络建模的核心思想。

3.尝试在查询关键词和用户点击的网页之间建立上下文关系,使得 Word2Vec 模型可以学习到查询关键词以及网页的隐含向量。

巧妙地搭建上下文关系,使得模型可以学习到离散数据的隐含表达。这里的离散数据是什么呢?这里有两组离散数据:第一组就是每一个查询关键词,这完全可以按照 Word2Vec 原本的定义来走;第二组离散数据,就是每一个网页。注意,这里不是网页的内容,而是某一个网页作为一个下标。那么,从模型的角度上来说,这里我们要做的就是利用查询关键词来预测网页出现的概率。

三、Word2Vec算法应用

1.去计算词与词之间的相似度

最直接的也是最常见的 Word2Vec 应用就是去计算词与词之间的相似度。当我们的数据还是原始的“词包”(Bag of Word),这时候是没法计算词与词之间的相似度的,因为每个词都被表示为某个元素为 1 其余元素都为 0 的离散向量。按照定义,两个离散向量之间的相似度都是 0。因此,从词包出发,我们无法直接计算词与词之间的相似度,这是从定义上就被限制了的。

word2Vec 就是为了跨越这个障碍而被发明的,所以当我们可以用 Word2Vec 的词向量来表示每一个单词的时候,我们就可以用“余弦相关度”(Cosine Similarity)来对两个词向量进行计算。余弦相关度其实就是计算两个向量的点积,然后再归一化。如果针对已经归一化了的向量,我们就可以直接采用点积来表达两个向量的相关度。不管是余弦相关度还是点积,我们都假设计算结果的值越大,两个词越相关,反之则不相关。

2.词语的类比

另外一个随着 Word2Vec 的推出而大放异彩的应用则是“词语的类比”。Word2Vec 的原 作者们用类比来表达,这种词向量能够完成一些与众不同的任务。词向量本质上就是一个连 续空间的向量,因此从数学上来说,这种向量其实可以进行任何“合规”的运算,比如加、 减、乘、除。于是,作者们就利用向量的加减关系,来看能否得到有意义的结果,而得到的结果令人吃惊。比如,如果我们把“国王”(King)这个单词的向量减去“男人”(Man)这个向量然后 加上“女人”(Woman)这个向量,得到的结果,竟然和“王后”(Queen)这个向量非常相近。

3.其他使用

在自然语言处理中有一系列的任务,之前都是依靠着“词包”这个输入来执行的。当我们有 了 Word2Vec 之后,这些任务都可以相对比较容易地用“词向量”来替代。

一类任务就是利用词来进行某种分类任务。比如,我们希望知道某些文档是属于什么类别, 或者某些文档是不是有什么感情色彩,也就是通常所说的“基于监督学习的任务”。词向量会成为很多文本监督学习任务的重要特性。在诸多的实验结果中,得到的效果要么好于单独使用词包,要么在和词包一起使用的情况下要好于只使用词包。

在进行监督学习的任务中,词向量的重要性还体现于其对深度学习架构的支持。众所周知, 即便是最简单的深度学习架构,比如多层感知器,都需要输入的数据是连续的。如果我们直 接面对离散的文本数据,常常需要把这些离散的文本数据学习成为连续的向量,其实就是在 学习 Word2Vec。经过了这一层的转换之后,我们往往再利用多层的神经网络结果对这些 信号进行处理。

在很多实践中人们发现,与其利用不同的任务来学习相应的词向量,还不如直接拿在别的地方学好的词向量当做输入,省却学习词向量这一个步骤,而结果其实往往会有效果上的提升。这种使用词向量的方法叫作“提前训练”(Pre-trained)的词向量。其实,不仅仅是在简单的多层感知器中,甚至是在 RNN 等更加复杂的深度架构中,也都更加频繁地利用提前训练的词向量。