系列文章:

  1. 【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识
  2. 【word2vec】篇二:基于Hierarchical Softmax的 CBOW 模型和 Skip-gram 模型
  3. 【word2vec】篇三:基于Negative Sampling 的 CBOW 模型和 Skip-gram 模型

由于计算机不能直接对各种字符进行运算,为此需要将词的表示进行一些转换。因此,在自然语言处理中,通常需要对输入的语料进行一些预处理:

【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识

其中,如何对词汇进行表示是很关键的问题,糟糕的表示方法容易导致所谓的 “Garbage in, garbage out”。

词向量基础

对词汇的表示,常见的有One-hot represention 和 Distributed Representation 两种形式。

One-hot represention

One-hot represention 将词汇用二进制向量表示,这个向量表示的词汇,仅仅在词汇表中的索引位置处为1,其他地方都为0。例子如下图所示:

【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识

这样的方式表示词汇虽然简单,但是也有如下缺点:

  • 单词的上下文丢失了。
  • 没有考虑频率信息。
  • 词汇量大的情况下,向量维度高且稀疏,占用内存。

Distributed Representation

Distributed Representation 也可以理解为Word Embedding,具体形式为:

【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识

注意到,使用Word Embedding得到的向量维度远小于词汇表的个数。如果将上面的向量在空间中表示,可以得到:

【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识

上图告诉我们,通过词向量之间的距离可以度量他们之间的关系,意思相近的词在空间中的距离比较近。出现这种现象的原因是,我们最后得到的词向量在训练过程中学习到了词的上下文。

那么,Distributed Representation 要如何得到?

  1. 之前介绍的神经网络语言模型可以得到。

  2. 接下来要介绍的 word2vec 就是另一种更受欢迎的方法。

word2vec 基础知识

word2vec 是 Google 于 2013 年推出的一个用于获取 word vector 的工具包,它简单、高效,因此引起了很多人的关注。在正式讲解 word2vec 前,还需要对一些基本概念有所了解。

CBOW 和 Skip-gram

CBOW 的思想是输入是某一个词wtw_t的上下文相关的词对应的词向量,而输出就是wtw_t的词向量。如下图所示:

【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识

可以看到,模型对输入的上下文词汇进行了求和运算,使用求和后的向量表示上下文的信息,然后学习wtw_t的向量表示。

Skip-Gram 的思想是和 CBOW 的思路是反着来的,即输入是特定的一个词wtw_t的词向量,而输出是特定词对应的上下文词向量。

【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识

word2vec 根据输入输出形式的不同,可以分为CBOW (Continuous Bag-of-Words) 与Skip-Gram两种模型。

霍夫曼树

一般情况下,词汇表中词汇的数量是非常多的,如果用传统的DNN+Softmax的方式来训练词向量,计算量太大了。于是,word2vec 使用的数据结构是用霍夫曼树来代替隐藏层和输出层的神经元。霍夫曼树的叶子节点起到输出层神经元的作用,叶子节点的个数即为词汇表的小大, 而内部节点则起到隐藏层神经元的作用。具体的内容,我们在之后会讲解。这里首先需要了解下霍夫曼树。

从实际的例子出发,看看如何构造霍夫曼树:

假设有(a,b,c,d,e,f)共6个词汇,词汇的权值用词频表示:wa=16,wb=4,wc=8,wd=6,we=20,wf=3w_a=16,w_b=4,w_c=8,w_d=6,w_e=20,w_f=3,我们假设这6个词汇是6棵只要根节点的森林集合。于是构造步骤如下:

首先是权值最小的b和f合并,得到的新树,根节点权重是7。将b于f这两个树从列表中删除,并且添加刚刚得到的合并的树。此时森林里共有5棵树,根节点权重分别是16,8,6,20,7。此时根节点权重最小的6,7对应的树合并,得到新子树,依次类推,最终得到下面的霍夫曼树:

【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识

如何编码呢?

一般对于一个霍夫曼树的节点(根节点除外),可以约定左子树编码为0,右子树编码为1.如上图,则可以得到c的编码是00。

注意,在word2vec中,约定编码方式和上面的例子相反,即约定左子树编码为1,右子树编码为0,同时约定左子树的权重不小于右子树的权重。

那么霍夫曼树有什么好处呢?

一般得到霍夫曼树后我们会对叶子节点进行霍夫曼编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点。这样我们的高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短,即我们希望越常用的词拥有更短的编码。

有了上面的基础知识,就可以对word2vec进行讲解了。相比于用传统的神经网络的方法来训练词向量,于word2vec提出了有两种改进方法:一种是基于 Hierarchical Softmax 算法的,另一种是基于 Negative Sampling 算法的。

参考文章:

word2vec模型

word2vec 中的数学原理详解

相关文章: