Word2vec原理CBOW与Skip-Gram模型基础

Word2vec

  • Word2vec
  • CBOW
  • Skip-Gram

Word2vec


词向量
最早的词向量是很冗长的,它使用是词向量维度大小为整个词汇表的大小,对于每个具体的词汇表中的词,将对应的位置置为1。这种词向量的编码方式我们一般叫做one hot representation.

One hot用来表示词向量非常简单,但是却有很多问题。

  • 首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);
  • 其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的);
  • 最后,它得到的特征是离散稀疏的。

Distributed representation可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系

比如下图我们将词汇表里的词用"Royalty",“Masculinity”, "Femininity"和"Age"4个维度来表示,King这个词对应的词向量可能是(0.99,0.99,0.05,0.7)(0.99,0.99,0.05,0.7)。当然在实际情况中,我们并不能对词向量的每个维度做一个很好的解释。
Word2vec原理CBOW与Skip-Gram模型基础_第1张图片
我们将king这个词从一个可能非常稀疏的向量坐在的空间,映射到现在这个四维向量所在的空间,必须满足以下性质:

(1)这个映射是单设;
(2)映射之后的向量不会丢失之前的那种向量所含的信息。

这个过程称为word embedding(词嵌入),即将高维词向量嵌入到一个低维空间。
 有了用Distributed Representation表示的较短的词向量,我们就可以较容易的分析词之间的关系了,比如我们将词的维度降维到2维,有一个有趣的研究表明,用下图的词向量表示我们的词时,我们可以发现:
 在这里插入图片描述
 Word2vec原理CBOW与Skip-Gram模型基础_第2张图片
可见我们只要得到了词汇表里所有词对应的词向量,那么我们就可以研究词与词之间的关系。不过,怎么训练得到合适的词向量呢?一个很常见的方法是使用神经网络语言模型。

word2vec模型其实就是简单化的神经网络。
Word2vec原理CBOW与Skip-Gram模型基础_第3张图片
输入是One-Hot Vector,Hidden Layer没有激活函数,也就是线性的单元。Output Layer维度跟Input Layer的维度一样,用的是Softmax回归。当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵。

这个模型是如何定义数据的输入和输出呢?一般分为CBOW(Continuous Bag-of-Words 与Skip-Gram两种模型。CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。 Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。

CBOW


CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。比如下面这段话,我们的上下文大小取值为4,特定的这个词是"Learning",也就是我们需要的输出词向量,上下文对应的词有8个,前后各4个,这8个词是我们模型的输入。由于CBOW使用的是词袋模型,因此这8个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。
Word2vec原理CBOW与Skip-Gram模型基础_第4张图片
这样我们这个CBOW的例子里,我们的输入是8个词向量,输出是所有词的softmax概率(训练的目标是期望训练样本特定词对应的softmax概率最大),对应的CBOW神经网络模型输入层有8个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某8个词对应的最可能的输出中心词时,我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。

模型结构如下
Word2vec原理CBOW与Skip-Gram模型基础_第5张图片

	1 输入层:上下文单词的onehot. 
	2 所有onehot分别乘以共享的输入权重矩阵W. {VN矩阵,N为自己设定的数,初始化权重矩阵W}
	3 所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1N.
	4 乘以输出权重矩阵W' {NV}
	5 得到向量 {1V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维斗代表着一个单词}
	6 概率最大的index所指示的单词为预测出的中间词(target word)与true label的onehot做比较,误差越小越好(根据误差更新权重矩阵)

所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W’。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),矩阵W也叫做look up table,也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。

Skip-Gram


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

例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)
Word2vec原理CBOW与Skip-Gram模型基础_第6张图片

这样我们这个Skip-Gram的例子里,我们的输入是特定词, 输出是softmax概率,对应的Skip-Gram神经网络模型输入层有1个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某1个词对应的最可能的8个上下文词时,我们可以通过一次DNN前向传播算法得到概率大小排前8的softmax概率对应的神经元所对应的词即可。
Word2vec原理CBOW与Skip-Gram模型基础_第7张图片
参考资料
https://www.zhihu.com/question/53354714
https://www.zhihu.com/question/32275069/answer/80188672
https://www.cnblogs.com/lianyingteng/p/7755545.html
http://blog.clzg.cn/blog-1579109-884831.html
https://www.cnblogs.com/haobang008/p/5911466.html
https://www.zhihu.com/question/44832436/answer/266068967
https://baijiahao.baidu.com/s?id=1589564139527612155&wfr=spider&for=pc
https://www.jianshu.com/p/cede3ae146bb
https://www.jianshu.com/p/f58c08ae44a6
https://blog.csdn.net/mylove0414/article/details/61616617
https://www.cnblogs.com/pinard/p/7160330.html
https://www.leiphone.com/news/201706/PamWKpfRFEI42McI.html
https://www.leiphone.com/news/201706/eV8j3Nu8SMqGBnQB.html
https://www.zhihu.com/question/44832436/answer/266068967

你可能感兴趣的:(NLP,推荐系统)