2.1、背景介绍

word2vec 是Google 2013年提出的用于计算词向量的工具,在论文Efficient Estimation of Word Representations in Vector Space中,作者提出了Word2vec计算工具,并通过对比NNLM、RNNLM语言模型验证了word2vec的有效性。

word2vec工具中包含两种模型:CBOW和skip-gram。论文中介绍的比较简单,如下图所示,CBOW是通过上下文的词预测中心词,Skip-gram则是通过输入词预测上下文的词。

word2vec表示模型 word2vec cbow模型_CBOW

2.2、CBOW 和 Skip-gram

原论文对这两种模型的介绍比较粗略,在论文《word2vec Parameter Learning Explained》中进行了详细的解释和说明,接下来我们详细看下CBOW和Skip-gram。

a)CBOW

One-word context

首先看一下只有一个上下文词的情况

word2vec表示模型 word2vec cbow模型_Hierarchical_02

其中单词的总个数为word2vec表示模型 word2vec cbow模型_Skip-gram_03,隐藏层的神经元个数为word2vec表示模型 word2vec cbow模型_Hierarchical_04,输入层到隐藏层的权重矩阵为word2vec表示模型 word2vec cbow模型_CBOW_05,隐藏层到输出层的权重矩阵为word2vec表示模型 word2vec cbow模型_Skip-gram_06

输入层是单词的One-hot编码。从输入层到隐藏层:
word2vec表示模型 word2vec cbow模型_word2vec表示模型_07
word2vec表示模型 word2vec cbow模型_Skip-gram_08 表示的就是输入单词word2vec表示模型 word2vec cbow模型_word2vec表示模型_09的向量表示(注意和输入层word2vec表示模型 word2vec cbow模型_Hierarchical_10进行区分,输入向量即word2vec表示模型 word2vec cbow模型_CBOW_11中的向量表示,输出向量即word2vec表示模型 word2vec cbow模型_Word2vec_12中的向量表示),其维度为word2vec表示模型 word2vec cbow模型_word2vec表示模型_13,转置后维度变成了word2vec表示模型 word2vec cbow模型_CBOW_14,用来表示向量的输入表述,要注意这里不是word2vec表示模型 word2vec cbow模型_word2vec表示模型_15,否则容易在往下的第二个公式中相乘时维度搞混,符号word2vec表示模型 word2vec cbow模型_CBOW_16表示的定义为

从隐藏层到输入层:
word2vec表示模型 word2vec cbow模型_CBOW_17
其中word2vec表示模型 word2vec cbow模型_Word2vec_18 表示的是矩阵word2vec表示模型 word2vec cbow模型_Word2vec_12的第word2vec表示模型 word2vec cbow模型_Hierarchical_20 列,其维度为word2vec表示模型 word2vec cbow模型_CBOW_21,计算出来的word2vec表示模型 word2vec cbow模型_word2vec表示模型_22为一个具体的值,表示的是第word2vec表示模型 word2vec cbow模型_Hierarchical_20个输入的词在输出层第word2vec表示模型 word2vec cbow模型_Hierarchical_20个位置对应的值。

最后使用word2vec表示模型 word2vec cbow模型_Skip-gram_25进行归一化处理(因为输出层是固定的word2vec表示模型 word2vec cbow模型_CBOW_26个单词,所以可以看作是多分类,因此使用word2vec表示模型 word2vec cbow模型_Word2vec_27进行归一化),得到输入单词word2vec表示模型 word2vec cbow模型_word2vec表示模型_09所属词库中每个单词的概率:
word2vec表示模型 word2vec cbow模型_Skip-gram_29
其中 word2vec表示模型 word2vec cbow模型_word2vec表示模型_30 表示的是输出层的第 word2vec表示模型 word2vec cbow模型_Hierarchical_20个神经元的值。

联合上面三个公式可得:
word2vec表示模型 word2vec cbow模型_Word2vec_32

其中word2vec表示模型 word2vec cbow模型_CBOW_33可以理解为单词的输入向量表示,word2vec表示模型 word2vec cbow模型_Skip-gram_34为单词的输出向量表示。

此种情况下的损失函数为:
word2vec表示模型 word2vec cbow模型_Skip-gram_35
上述公式可以转化为:
word2vec表示模型 word2vec cbow模型_Word2vec_36
其中word2vec表示模型 word2vec cbow模型_CBOW_37 表示 实际输出层输出值对应的下标。因为word2vec表示模型 word2vec cbow模型_Skip-gram_38 是固定的,因此word2vec表示模型 word2vec cbow模型_word2vec表示模型_39时,只需对分母求word2vec表示模型 word2vec cbow模型_Skip-gram_40即可

multi-word context

当有多个上下文单词时对应的图为:

word2vec表示模型 word2vec cbow模型_Word2vec_41

此时的word2vec表示模型 word2vec cbow模型_Hierarchical_42 表达式为:
word2vec表示模型 word2vec cbow模型_Word2vec_43
其中 word2vec表示模型 word2vec cbow模型_Skip-gram_44 表示上下文单词的个数,word2vec表示模型 word2vec cbow模型_Hierarchical_45 表示上下文单词,word2vec表示模型 word2vec cbow模型_CBOW_33 表示单词的输入向量(注意和输入层word2vec表示模型 word2vec cbow模型_Hierarchical_10区别)。

目标函数为:
word2vec表示模型 word2vec cbow模型_Hierarchical_48

b)Skip-gram

word2vec表示模型 word2vec cbow模型_CBOW_49

从输入层到隐藏层:
word2vec表示模型 word2vec cbow模型_Hierarchical_50
从隐藏层到输出层:
word2vec表示模型 word2vec cbow模型_CBOW_51
其中:

  • word2vec表示模型 word2vec cbow模型_Word2vec_52
  • word2vec表示模型 word2vec cbow模型_word2vec表示模型_53 表示输出层第word2vec表示模型 word2vec cbow模型_Skip-gram_54个词实际落在了第word2vec表示模型 word2vec cbow模型_word2vec表示模型_55个神经元
  • word2vec表示模型 word2vec cbow模型_Hierarchical_56 表示输出层第word2vec表示模型 word2vec cbow模型_Skip-gram_54个词应该落在第word2vec表示模型 word2vec cbow模型_Hierarchical_58个神经元
  • word2vec表示模型 word2vec cbow模型_Skip-gram_59 表示输出层第word2vec表示模型 word2vec cbow模型_Skip-gram_54个词实际落在了第word2vec表示模型 word2vec cbow模型_word2vec表示模型_55个神经元上归一化后的概率
  • word2vec表示模型 word2vec cbow模型_Word2vec_62 表示输出层第word2vec表示模型 word2vec cbow模型_Skip-gram_54个词实际落在了第word2vec表示模型 word2vec cbow模型_word2vec表示模型_55个神经元上未归一化的值

因为输出层共享权重,所以:
word2vec表示模型 word2vec cbow模型_Word2vec_65
其中 word2vec表示模型 word2vec cbow模型_Word2vec_18 表示第word2vec表示模型 word2vec cbow模型_Hierarchical_20个单词的输出向量,其值为输出权重矩阵word2vec表示模型 word2vec cbow模型_Word2vec_12的第word2vec表示模型 word2vec cbow模型_Hierarchical_20

损失函数变为:
word2vec表示模型 word2vec cbow模型_Word2vec_70

注意⚠️

  • 经验上一般选择使用skip-gram模型,因为效果较好
  • 在Word2vec模型中,如果选择使用CBOW时,最终产出的word embedding为 单词的输出向量(word2vec表示模型 word2vec cbow模型_CBOW_71)表示,如果选择使用skip-gram时,最终产出的word embedding为单词的输入向量(word2vec表示模型 word2vec cbow模型_Skip-gram_72)表示,因为更倾向于选择靠近中心词一端的权重矩阵。

2.3、hierarchical softmax 和negative sampling

因为基于word2vec框架进行模型训练要求语料库非常大,这样才能保证结果的准确性,但随着预料库的增大,随之而来的就是计算的耗时和资源的消耗。那么有没有优化的余地呢?比如可以牺牲一定的准确性来加快训练速度,答案就是 hierarchical softmax 和 negative sampling。

在论文《Distributed Representations of Words and Phrases and their Compositionality》中介绍了训练word2vec的两个技(同样在论文《word2vec Parameter Learning Explained》中进行了详细的解释和说明),下面来具体看一下。

a)霍夫曼树和霍夫曼编码

在了解层次softmax(hierarchical softmax)之前,先来理解一下什么是霍夫曼树和霍夫曼编码。

霍夫曼树本质上是一棵最优二叉树,是指对于一组带有确定权值的叶子节点所构造的具有带权路径长度最短的二叉树。

那么针对一组权重值,如何构造一棵霍夫曼树呢?根据权值大的结点尽量靠近根这一原则,给出了一个带有一般规律的算法,称为霍夫曼算法,其描述如下:

  • 1、根据给定word2vec表示模型 word2vec cbow模型_word2vec表示模型_73个权值word2vec表示模型 word2vec cbow模型_word2vec表示模型_74构成word2vec表示模型 word2vec cbow模型_word2vec表示模型_73棵二叉树的集合word2vec表示模型 word2vec cbow模型_CBOW_76;其中,每棵二叉树word2vec表示模型 word2vec cbow模型_Hierarchical_77只有一个带权值word2vec表示模型 word2vec cbow模型_Skip-gram_78的根结点,其左、右子树均为空
  • 2、在word2vec表示模型 word2vec cbow模型_CBOW_79中选取两棵根结点权值最小的二叉树作为左、右子树来构造一棵新的二叉树,且置新的二叉树根结点权值为其左右子树根结点的权值之和
  • 3、在word2vec表示模型 word2vec cbow模型_CBOW_79中删除这两棵树,同时将生成新的二叉树加入到word2vec表示模型 word2vec cbow模型_CBOW_79
  • 4、重复2、3,直到word2vec表示模型 word2vec cbow模型_CBOW_79中只剩下一棵二叉树加入到word2vec表示模型 word2vec cbow模型_CBOW_79

例如一组数据其对应的权重为:[9,11,13,8,4,5],其生成的霍夫曼树为(图来源于百度经验):

word2vec表示模型 word2vec cbow模型_Word2vec_84

注意⚠️:

  • 在构造哈夫曼树时,叶子节点无左右之分,只需约定好一个规则,从头到尾遵守这个规则执行即可。习惯上左节点比右节点小。

那什么又是霍夫曼编码呢?霍夫曼编码是一种基于霍夫曼树的编码方式,是可变长编码的一种。

对于构造好的霍夫曼树进行0/1编码,左子树为0,右子树为1,则针对上图构造好的霍夫曼树,其各个叶子节点的霍夫曼编码分别为:

  • 9 -> 00
  • 11 -> 01
  • 13 -> 10
  • 8 -> 110
  • 4 -> 1110
  • 5 -> 1111

注意⚠️:

  • 同样针对霍夫曼树的编码也没有明确规定说左子树为1或者左子树为0
  • 在word2vec中,针对霍夫曼树的构建和编码和上边说的相反,即约定左子树编码为1,右子树编码为0(论文中说的是-1,含义一致),同时约定左子树的权重不小于右子树的权重

b)hierarchical softmax

word2vec表示模型 word2vec cbow模型_Skip-gram_85

上图为一棵霍夫曼编码树,其中白色结点表示词库中的所有单词,黑色结点表示内部的隐藏结点,单词word2vec表示模型 word2vec cbow模型_word2vec表示模型_86 对应的路径编码如图中黑色线连接所示,其路径长度为4,word2vec表示模型 word2vec cbow模型_Hierarchical_87表示的是针对单词word2vec表示模型 word2vec cbow模型_CBOW_88,其所在路径上的第word2vec表示模型 word2vec cbow模型_Hierarchical_20个结点。

基于霍夫曼树进行优化的word2vec,移除了从隐藏层到输出层的权重矩阵(即输出向量),使用的是霍夫曼树中的隐藏结点编码代替(如上图中的黑色结点),那么输出结点是输入单词word2vec表示模型 word2vec cbow模型_CBOW_88的概率可以表示为:
word2vec表示模型 word2vec cbow模型_Hierarchical_91

其中:

  • word2vec表示模型 word2vec cbow模型_Word2vec_92
  • word2vec表示模型 word2vec cbow模型_Hierarchical_93
  • word2vec表示模型 word2vec cbow模型_CBOW_94 表示单词word2vec表示模型 word2vec cbow模型_CBOW_95所在路径上的第word2vec表示模型 word2vec cbow模型_word2vec表示模型_55个结点
  • word2vec表示模型 word2vec cbow模型_word2vec表示模型_97 表示隐藏层的输出(skip-gram模型中其等于word2vec表示模型 word2vec cbow模型_CBOW_98,cbow模型中其等于 word2vec表示模型 word2vec cbow模型_Hierarchical_99,即输入词向量求平均)
  • word2vec表示模型 word2vec cbow模型_CBOW_100 表示叶子结点是word2vec表示模型 word2vec cbow模型_CBOW_95的最短路径中长度,减1表示的是到达该结点之前的隐藏结点
  • word2vec表示模型 word2vec cbow模型_CBOW_102 的定义如下(即如果走的是左子树路径为1,右子树路径为-1)
    word2vec表示模型 word2vec cbow模型_CBOW_103

在上图中,我们定义是左结点的概率为:
word2vec表示模型 word2vec cbow模型_Skip-gram_104
其中word2vec表示模型 word2vec cbow模型_Word2vec_105 表示的是word2vec表示模型 word2vec cbow模型_Hierarchical_106函数

右结点的概率为:
word2vec表示模型 word2vec cbow模型_word2vec表示模型_107

那么针对图中的单词word2vec表示模型 word2vec cbow模型_word2vec表示模型_86,其概率为:
word2vec表示模型 word2vec cbow模型_word2vec表示模型_109

针对所有的单词有:
word2vec表示模型 word2vec cbow模型_Word2vec_110

此时其损失函数为:
word2vec表示模型 word2vec cbow模型_Hierarchical_111

c)negative sampling

除了hierarchical softmax,另外一种优化方法是Noise Contrasive Estimation(NCE),在论文《Noise-contrastive estimation of unnormalized statistical models, with applications to natural image statistics》中有详细的解释和说明,但因为NCE的逻辑有些复杂,所以这里使用的是简化版的,称之为:Negative Sampling

因为每次计算全量的负样本计算量比较大,因此进行了负采样,负采样之后对应的损失函数为:
word2vec表示模型 word2vec cbow模型_Word2vec_112
其中:

  • word2vec表示模型 word2vec cbow模型_Hierarchical_113
  • word2vec表示模型 word2vec cbow模型_word2vec表示模型_114 表示word2vec表示模型 word2vec cbow模型_Hierarchical_113的输出词向量
  • word2vec表示模型 word2vec cbow模型_word2vec表示模型_97 表示隐藏层的输出,当模型为CBOW时为word2vec表示模型 word2vec cbow模型_Hierarchical_99,如果时skip-gram模型时为:word2vec表示模型 word2vec cbow模型_CBOW_98
  • word2vec表示模型 word2vec cbow模型_Word2vec_119

注意⚠️:

  • 基于层次softmax或者negative sampling优化的cbow或者skip-gram模型,输出的词向量应该是输入层到隐藏层之间的词向量(之所以说应该,是因为论文中没有进行特意说明,也没有在公开的资料中看到,可能是我看的不够认真)
  • 猜想:能否根据最短路径节点的平均向量来表示叶子结点,即词向量?
  • 以上两个问题有读者明白了可以在评论区进行留言,感谢!

2.4、Gensim中Word2vec的使用

关于gensim的文档可以参考:https://radimrehurek.com/gensim/auto_examples/index.html#documentation

使用之前需要先引入对应的模型类
word2vec表示模型 word2vec cbow模型_CBOW_120
创建一个模型
word2vec表示模型 word2vec cbow模型_CBOW_121
其对应的模型参数有很多,主要的有:

  • sentences:训练模型的语料,是一个可迭代的序列
  • corpus_file:表示从文件中加载数据,和sentences互斥
  • size:word的维度,默认为100,通常取64、128、256等
  • window:滑动窗口的大小,默认值为5
  • min_count:word次数小于该值被忽略掉,默认值为5
  • seed:用于随机数发生器
  • workers:使用多少线程进行模型训练,默认为3
  • min_alpha=0.0001
  • sg:1 表示 Skip-gram 0 表示 CBOW,默认为0
  • hs:1 表示 hierarchical softmax 0 且 negative 参数不为0 的话 negative sampling 会被启用,默认为0
  • negative:0 表示不采用,1 表示采用,建议值在 5-20 表示噪音词的个数,默认为5

更多参数可以参考模型中的注释

保存模型
word2vec表示模型 word2vec cbow模型_word2vec表示模型_122

加载模型
word2vec表示模型 word2vec cbow模型_word2vec表示模型_123

输出loss值
word2vec表示模型 word2vec cbow模型_CBOW_124

计算相似度
word2vec表示模型 word2vec cbow模型_word2vec表示模型_125