这篇文章只是针对像我这种初学者大致理解word2vec模型的引导,并无数学推导!!

One-hot

对于一个词汇量为 V 的语料库,现在需要给每一个词分配一个向量,使得每个词汇的向量之间不会相互冲突。

One-hot 给出了一个 V 维的向量(V 为语料库的词汇数),每一个单词在向量中占一个位置,则每个单词的向量中有且仅有1位是1,其它都是0.

词嵌入

One-hot给出的词向量尽管两两不冲突,但实在是太过浪费,并且对于词汇来说,每个词汇都不应该是独立的,例如**“我,和,你”,这三个词常常会出现在一起,则我们只要看到“我,?,你”,都能够推出中间那个词应该是“和”,而One-hot却将每个词汇独立出来,即“我”,“和”,“你”**之间变得毫无关系,这在文本情感分析中是致命的。

现在我们的任务是找出一种词汇的向量表示法,使得:

  1. 不同词汇的表示不会产生冲突。
  2. 词向量的维度尽可能地小。
  3. 对于有上下文关联的词汇,它们的词向量也应该有某种关系。

将One-hot所表示的高维度词向量嵌入低维度的空间,这样的方式叫做词嵌入。

Word2Vec模型

Word2Vec就是一种词嵌入模型。

Word2Vec有两种类型:CBOW 和 Skip-Gram

CBOW(Continuous Bag-of-Words)

对于每一个词 WordiWord_i,我们假设现在需要它受到 m 个上下文单词的影响。则Wordim,Wordim+1,,Wordi1,Wordi+1,,Wordi+m1,Wordi+mWord_{i - m},Word_{i - m + 1},\cdots ,Word_{i - 1}, Word_{i + 1},\cdots,Word_{i + m - 1},Word_{i + m}都应该被列为我们的考虑范围(注意,上述的 m 是指上下文范围的半径)。

先给出CBOW的模型图,再来理解

354ac337e2992318a61d4a597034f4fb.jpg

可以看到,输入层为 WordimWord_{i-m}Wordi+mWord_{i+m} 在语料库中的 One-hot 向量,而输出层是 V 个单词的在此位置的出现概率,在这里给出CBOW模型的目的。

CBOW模型根据上下文推测‘当前位置应该是什么单词。

上文说过V是语料库的词汇数,那么输出的是每一个词汇应该出现在当前位置的概率。

 

但是,得到输出并不是CBOW模型的最终目的!!

还记得上文说我们的目的是要的到一个词汇的向量表示法,满足以上给出的三个条件吗?

我们需要的是从输出层到隐藏层的权重矩阵 WVNW_{V\cdot N},这里的 NN,就是我们最终得到的词向量的维度,由于有 VV 行,所以每一行对应一个单词的词向量,每个词向量有N维。

则这个权重矩阵 WVNW_{V\cdot N} 就相当于一个字典,我们把一个单词的One-hot乘以这的权重矩阵 WVNW_{V\cdot N} ,就得到了这个单词的词向量。实际上这个权重矩阵也就叫"Look Up Table".

 

接下来,要怎么求解得到这个权重矩阵?

先初始化一个权重矩阵。

接着如图上所示,对于每一个单词输入它的上下文单词在语料库中的One-hot向量,乘以权重矩阵,得到一个 2mN2m\cdot N 维的矩阵,或者说得到 2m2mNN 维的向量,则对这 2m2m 个向量相加,求均值,再用Softmax,乘以输出矩阵,得到输出层。对照实际值Label,根据Softmax的交叉熵损失函数,修正权重矩阵。

附交叉熵损失函数:H(p,q)=xp(x)log(q(x))H(p,q)=-\sum_x p(x)\log (q(x))

其中 p(x)p(x) 是真实分布概率,q(x)q(x) 是模型计算出的概率。

上述过程一定不陌生,因为这就是训练神经网络的普遍方法,实际上也正是如此,CBOW模型就是一个有1层隐藏层的神经网络。

 

最终我们得到了权重矩阵 WVNW_{V\cdot N} ,再次强调,输出层只是副产物,我们的主要目的是得到 WVNW_{V\cdot N}这个"Look Up Table"。

Skip-Gram模型

833fa25be15f684b57e26360f121bfe9.jpg

Skip-Gram模型与CBOW模型相反,是根据当前位置的单词,猜测它的上下文单词。

由于本文主要为了得到词向量,所以对这个模型不再解释。

因为我也不会