天天看点

干货|Word2Vec原理详解

作者:七月在线

Word2Vec 是 google 在2013年推出的一个 NLP 工具,它的特点是将所有的词向量化,这样词与词之间就可以定量地去度量他们之间的关系,挖掘词之间的联系。

01 词向量基础

词向量:用来表示单词的向量空间为什么不用简单的one-hot来表征词向量了?

One-hot representation(稀疏向量)用来表示词向量非常简单,但是却有很多问题。最大的问题是我们的词汇表一般都非常大,比如达到百万级别,这样每个词都用百万维的向量来表示简直是内存的灾难。这样的向量其实除了一个位置是1,其余的位置全部都是0,表达的效率不高。

能不能把词向量的维度变小呢?

Distributed representation (分布式表示)可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。

分布式表示的基本思路是通过训练将每个词映射成一个固定长度的短向量,所有这些向量就构成一个词向量空间,每一个向量可视为该空间上的一个点。此时向量长度可以自由选择,与词典规模无关。

02CBOW与Skip-Gram

CBOW 模型:输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。(Continuous Bag-of-Word)Skip-Gram 模型:输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。

传统的神经网络词向量语言模型(DNN)

在 word2vec 出现之前,已经有用神经网络 DNN 来用训练词向量进而处理词与词之间的关系了。采用的方法一般是一个三层的神经网络结构(当然也可以多层),分为输入层,隐藏层和输出层( softmax 层)。一般有三层, 输入层 (词向量),, 隐藏层和输出层(softmax层) 。里面最大的问题在于从隐藏层 到输出的softmax层的计算量很大, 因为要计算所有词的softmax概率,再去找概率最大的值。这个模型如下图所示。其中 是词汇表的大小

干货|Word2Vec原理详解

维度理解:Input layer 是经 one-hot 处理后的,因此 Input Layer 的纬度是 ,第一个 的维度为 ,得到 Hidden layer 的纬度为 ,经过第二个 的纬度为 ,得到 Output layer 的纬度为 。得到的词向量可以是,也可以是 与 拼接得到的结果。需要明确的几个概念:

  • 单词
  • 词典 由单词组成的集合;
  • 语料库C,由单词组成的文本序列 ;

单词 的上下文是语料库中由单词 的前 个单词和后 个单词组成的文本序列, 称为中心词。Skip-Gram:

干货|Word2Vec原理详解

使用log的原因:

  • 防止溢出,也就是防止结果趋近于0
  • log是单调函数,取log对结果无影响

交叉熵表示的是预测真实分布和模型分布的相近程度CBOW 求导:

干货|Word2Vec原理详解
  • Word from vocabulary
  • : Input word matrix
  • -th column of , the input vector representation of word
  • Output word matrix
  • -th row of , the output vector representation of word
  • :中心词上下文的平均向量

word2vec为什么不用现成的DNN模型,要继续优化出新方法呢?

最主要的问题是DNN模型的这个处理过程非常耗时。我们的词汇表一般在百万级别以上,这意味着我们DNN的输出层需要进行softmax计算各个词的输出概率的的计算量很大。

用什么方法来取代DNN更简单呢?

霍夫曼树

用霍夫曼树来代替隐藏层和输出层的神经元,霍夫曼树的叶子节点起到输出层神经元的作用,叶子节点的个数即为词汇表的小大。而内部节点则起到隐藏层神经元的作用。

输入:权值为 的 个节点

输出:对应的霍夫曼树

1) 将 看做是有 棵树的森林, 每个树仅有一个节点。

2)在森林中选择根节点权值最小的两棵树进行合并,得到一个新的树,这两颗树分布作为新树的左右子树。新树的根节点权重为左右子树的根节点权重之和。

3) 将之前的根节点权值最小的两棵树从森林删除,并把新树加入森林。

4)重复步骤2)和3)直到森林里只有一棵树为止。

干货|Word2Vec原理详解

霍夫曼树有什么好处呢?

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

如何编码呢?

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

在Word2Vec中,约定编码方式和上面的例子相反,即约定左子树编码为1,右子树编码为0,同时约定左子树的权重不小于右子树的权重。(Word2Vec中的权重为单词在语料库中的词频)

03word2vec的两种改进方法

一种是基于Hierarchical Softmax的,另一种是基于Negative Sampling的。

干货|Word2Vec原理详解

Hierarchical Softmax

基于Hierarchical Softmax(层序softmax)的模型

传统的神经网络词向量语言模型,里面一般有三层,输入层(词向量),隐藏层和输出层( 层)。里面最大的问题在于从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的 概率,再去找概率最大的值。

改进一:采用简单的对所有输入词向量求和并取平均的方法

改进二:从隐藏层到输出的 层这里的计算量个改进。为了避免要计算所有词的 概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。从输出 层的概率计算变成了一颗二叉霍夫曼树,那么我们的 概率计算只需要沿着树形结构进行就可以了。霍夫曼树的所有内部节点就类似之前神经网络隐藏层的神经元,其中,根节点的词向量对应我们的投影后的词向量,而所有叶子节点就类似于之前神经网络 输出层的神经元,叶子节点的个数就是词汇表的大小。在霍夫曼树中,隐藏层到输出层的 映射不是一下子完成的,而是沿着霍夫曼树一步步完成的。

如何“沿着霍夫曼树一步步完成”呢?在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数,即:

干货|Word2Vec原理详解

其中 是当前内部节点的词向量, 而 是我们需要从训练样本求出的逻辑回归的模型参数。

使用霍夫曼树优点

  1. 由于是二叉树, 之前计算量为V,现在变成了log 2V。
  2. 由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。

​目标就是找到合适的所有节点的词向量和所有内部节点 θ, 使训练样本达到最大似然。

哈夫曼树的权值是由单词的词频(重要程度决定的)

基于Hierarchical Softmax的模型梯度计算

干货|Word2Vec原理详解

我们使用最大似然法来寻找所有节点的词向量和所有内部节点。先拿上面的w_例子来看。我们期望最大化下面的似然函数:

干货|Word2Vec原理详解

对于所有的训练样本,我们期望最大化所有样本的似然函数乘积。为了便于我们后面一般化的描述,我们定义输入的词为 其从输入层词向量求和平均后的霍夫曼树根节点词向量为 从根节点到 所在的叶子节点,包含的节点总数为 在霍夫曼树中从根节点开始, 经过的第 个节点表示为 对应的霍夫曼编码为 ,其中 而该节点对应的模型参数表示为 其中 没有 是因为模型参数仅仅针对于霍夫曼树的内部节点。定义 经过的霍夫曼树某一个节点的逻辑回归概率为 其表达式为:

干货|Word2Vec原理详解

那么对于某一个目标输出词 其最大似然为:

干货|Word2Vec原理详解

要得到模型中 词向量和内部节点的模型参数, 我们使用梯度上升法即可。首先我们求模型参数 的梯度:

同样的方法,可以求出 的梯度表达式如下:

干货|Word2Vec原理详解

基于Hierarchical Softmax的CBOW模型

首先我们要定义词向量的维度大小 以及 的上下文大小 ,这样我们对于训练样本中的每一个词, 其前面的 个词和后面的 个词作为了 模型的输入,该词本身作为样本的输出,期望 概率最大。

  1. 先将词汇表按照词频建立成一颗霍夫曼树。
  2. 从输入层到隐藏层(投影层),对 周围的 个词向量求和取平均即可
  3. 通过梯度上升法来更新 和 注意这里的 是由 2c 个词向量相加而成,故梯度更新完毕后会用梯度项直接更新原始的各个 即 :
干货|Word2Vec原理详解

4. 如果梯度收敛,则结束梯度迭代,算法结束,否则回到步骤3继续迭代输入:基于CBOW的语料训练样本,词向量的维度大小 CBOW的上下文大小 步长 输出:霍夫曼树的内部节点模型参数 所有的词向量基于Hierarchical Softmax的Skip-Gram模型输入的只有一个词 输出的为 个词向量 ,期望这些词的softmax概率比其他的词大。1. 先将词汇表按照词频建立成一颗霍夫曼树。2. 从输入层到隐藏层(投影层),由于只有一个词,所以, 即 就是词 对应的词向量。3. 通过梯度上升法来更新我们的 和 注意这里的 周围有 个词向量, 此时如果我们期望 最大。此时我们注意到由于上下文是相互的, 在期望 最大化的同时, 反过来我们也期望 最大。那么是使用 好还是 好呢, 使用了后者, 这样做的好处就是在一个选代窗口内, 我们不是只更新 一个词, 而是 共 个词。这样整体的迭代会更加的均衡。因为这个原因, 模型并没有和 模型一样对输入进行迭代更新,而是对 个输出进行迭代更新。故梯度更新完毕后会用梯度项直接更新原始的各个 即 :

干货|Word2Vec原理详解

4. 如果梯度收敛,则结束梯度迭代,算法结束,否则回到步骤3继续迭代输入:基于Skip-Gram的语料训练样本,词向量的维度大小 Skip-Gram的上下文大小 步长 输出:霍夫曼树的内部节点模型参数 所有的词向量Hierarchical Softmax 的缺点使用霍夫曼树来代替传统的神经网络, 可以提高模型训练的效率。但是如果我们的训练样本里的中心词 是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久了。能不能不用搞这么复杂的一颗霍夫曼树,将模型变的更加简单呢? Negative Sampling 就是一种改进方法。

04Negative Sampling

基于Negative Sampling的模型比如我们有一个训练样本, 中心词是 它周围上下文共有 个词,记为context 。由于这个中心词 的确和 相关存在, 因此它是一个真实的正例。通过Negative Sampling采样, 我们得到neg个和 不同的中心词 , 这样 和 就组成了 个并不真实存在的负例。利用这一个正例和neg个负例,我们进行二元逻辑回归,得到负采样对应每个词 对应的模型参数 和每个词的词向量。Negative Sampling负采样方法现在我们来看看如何进行负采样, 得到neg个负例。 采样的方法并不复杂, 如果词汇表的大小为 ,那么我们就将一段长度为1的线段分成 份,每份对应词汇表中的一个词。当然每个词对应的线段长度是不一样的,高频词对应的线段长,低频词对应的线段短。每个词 的线段长度由下式决定:

干货|Word2Vec原理详解

在 中,分子和分母都取了3/4次幂如下:

干货|Word2Vec原理详解

在采样前,我们将这段长度为1的线段划分成 M 等份,这里 M >> V,这样可以保证每个词对应的线段都会划分成对应的小块。而M份中的每一份都会落在某一个词对应的线段上。在采样的时候,我们只需要从M个位置中采样出neg个位置就行,此时采样到的每一个位置对应到的线段所属的词就是我们的负例词。

干货|Word2Vec原理详解

05一些经验

neg的默认值是 5,一般我们取 3-10 即可。样本量非常少取 3,达到亿的超大级别可以选择10. 不过默认的5可以满足绝大多数情况。

一般数据量少的时候 Hierarchical Softmax可能会好一些。如果数据量非常大,则一般使用Negative Sampling 。

Skip-Gram和CBOW相比,多了一层循环(2c次),所以的确是计算量大约为CBOW的2c倍。

鉴于skip-gram学习的词向量更细致,但语料库中有大量低频词时,使用skip-gram学习比较合适。

Skip-Gram模型相当于是“家教学习模式”,即一个学生请了多个家教对其进行一对一辅导。表现为每个输入的中心词(学生)从多个上下文词标签(家教老师)那里获得知识。

CBOW模型则相当于“大班教学模式”,即多个学生在一个大班老师那里上课学习,表现为每个输入的多个上下文词(多个学生)从中心词标签(大班老师)那里获得知识。

使用gensim训练词向量:

size : int, optional

Dimensionality of the word vectors.

window : int, optionalMaximum distance between the current and predicted word within a sentence.

min_count : int, optional (出现频次特别小的词就不要了)Ignores all words with total frequency lower than this.

workers : int, optional (表示线程,是核数的两倍)Use these many worker threads to train the model (=faster training with multicore machines).

sg : {0, 1}, optional (一般使用 skip-gram好一些)Training algorithm: 1 for skip-gram; otherwise CBOW.

hs : {0, 1}, optional (使用负采样的话,这里就取0)

If 1, hierarchical softmax will be used for model training.If 0, and negative is non-zero, negative sampling will be used.

negative : int, optional (比较多使用负采样的方法)

If > 0, negative sampling will be used, the int for negative specifies how many "noise words"should be drawn (usually between 5-20).

If set to 0, no negative sampling is used.

NLP等方向课程均限时福利秒杀!

抢秒杀移步→ julyedu.com

干货|Word2Vec原理详解
干货|Word2Vec原理详解
干货|Word2Vec原理详解

继续阅读