复习DAY-2-word2vec

1.前言

参考了:
1、https://zhuanlan.zhihu.com/p/26306795
2、https://zhuanlan.zhihu.com/p/33799633
3、https://blog.csdn.net/kingzone_2008/article/details/80513145
4、https://zhuanlan.zhihu.com/p/27234078
5、https://blog.csdn.net/sinat_32404247/article/details/79975901
6、https://zhuanlan.zhihu.com/p/64430221
7、https://zhuanlan.zhihu.com/p/357859112

NLP中最细的粒度是 词语,把词语嵌入到一个数学空间里,就叫词嵌入(word embedding)。而 word2vec,就是词嵌入( word embedding) 的一种。word2vec有两种情况:Skip-gram 和 CBOW。

2.Skip-gram 和 CBOW 模型

Skip-gram就是输入中间的词预测上下文。
CBOW就是输入上下文预测中间的词。

2.1Skip-gram 和 CBOW 模型的简单形式

最简单的形式就是用一个词x来预测一个词y,这两个词互为上下文,所以这时候Skip-gram 和 CBOW 就一样了。

图1.png

1、输入x是维度为V的向量(王越说这里是列向量还是行向量都随意取决于你后面的权重矩阵怎么构造了,都可以,就是W * x和x * W的区别),V是假设我们的世界上有存在V个词,所以这个数字非常的大,这个向量用one-hot的形式表示,这V维的列向量只有x这个词语所在的位置上是1,其他位置都是0。
2、同样的,y也是在它的出现的位置上是1,其他位置上都是0。
3、我们的目标是希望x经过一系列的变换最大程度上的接近y(最好一样)。
4、上图中的权重矩阵W{V * N},在初始化的时候是随机初始化的,V是所有的词的个数,那么N是怎么来的?王越说N是可以自己随便设定的,一般都是300-500维
5、在隐藏层输入的是一个W * x+b,W是随机初始化的矩阵,x是输入的向量,b是参数。做一个线性模型,注意已这里只是简单的映射,并没有非线性激活函数,一个神经元可以是线性的,这时就相当于一个线性回归函数。因为是one-hot,所以W * x+b得到的是一个N维的向量。
6、第三层可以简单看成一个分类器,用的是Softmax逻辑回归。从上面得到的是一个N维向量,通过激活函数(softmax)处理后得到一个V维的概率分布,其中概率最大的index指向的单词就是预测出的单词。
7、如果输入x是V维列向量,那么权重矩阵就是W{N * V},他们的矩阵相乘是:W * x。如果x是行向量就是x * W
一个例子

2.2CBOW 模型

图2.png

1、CBOW(Continuous Bag-of-Words),连续的词袋模型
2、上图里的C是上下文的单词的个数,比如window=2,就是在目标单词前取两个单词,目标单词后取两个单词,共4个单词,C=4
3、输入层是C个单词的one-hot编码,这C个词分别通过共享的权重矩阵W{V*N},最开始是随机初始化的。这C个单词的one-hot编码的词向量,如图1中所示,分别通过共享的权重矩阵,然后就会得到C个如图1中所示的词向量,再将得到的C个词向量(上面的第5部分解释),最后得到的N维向量是所有N维向量的相加求平均。
4、而因为这些单词都是one-hot编码的,所以他们对应的权重向量,每次只会取一行有值,将这些权重矩阵在相加求平均也就得到了新的权重矩阵。然后在神经网络的训练中不断的更新这个矩阵。
5、输出层仍旧是softmax。
6、最开始的W'和W没啥关系,也是随机初始化的。经过不断的更新最终他们(矩阵中的某一行或某一列)都是都是词向量,是同一单词的不同表示,W是输入层到隐藏层的权重矩阵(我们只会用这个),W'是隐藏层到输出层的权重矩阵(而这个会被弃用)。假设v是来自W的某一行,v叫做输入向量,v'是来自W'的某一列,v'叫做输出向量。

2.3Skip-Gram模型

图3.png

图3-1.png

在上图中第一个公式就是目标函数。log中间的部分就是公式二,也就是softmax。(log里面的部分表示的是条件概率,即在单词t已知的情况下,他的上下文单词的概率,求log是因为概率是用softmax计算的,在计算过程中计算了e的x次方,这样的话cbow和skip-gram的目标函数就是一样的了)
Skip-Gram 的损失函数是通过将目标词汇的正例(是输入单词的上下文)和负例(不是输入单词的上下文)使用二元对数回归(Binary Logistic Regeression)计算概率并相加得到的。损失函数公式


损失函数公式.png

他俩的不同在于:skip-gram的预测次数比cbow多,因为每个词都会用作中心词在去预测上下文的词。因为在一个window中,无法体现词的顺序,所以比如我们用一个词来预测他的上下文的8个单词,那么就取概率最大的top8就行了。

3.具体的计算

3.1一个简单的例子

上面大致上理解了两种模型的原理。那个他们是如何被计算出来的呢?我们下面以CBOW模型为例具体来手推计算一下。

图4.png

如上图4所示,假设语料为{I drink coffee everyday},他们的词向量如图所示,想预测的目标词是coffee。令window=2;目标词是coffee;上下文是I,drink,coffee
图5.png

权重矩阵是随机初始化的。
以drink这个单词的向量举例,计算W * x2 = v2。
因为是one-hot的,所以v2“刚好”就等于权重矩阵W中的一列。
图6.png

由此可以得到,他们这些单词的v向量都等于权重矩阵的相对应的列。
令θ = (v1 + v2 + v4) / 3 = [1 1.67 0.33] T
图7.png

再初始化一个矩阵W'。
计算W' * θ = U0。
图8.png

输出:概率分布。
y = softmax(U0)。
图8-1.png

如上图得到的y = [0.23 0.03 0.62 0.12] T。
选择其中概率最大的,就是0.62,就是目标词coffee出现的位置。
我们希望生成的概率与真实的概率(label)x3 [0,0,1,0]相匹配。
我们使用梯度下降来更新W和W'。
如果我们的训练数据足够大,那么我们想到得到某个单词的word embedding就像查表一样就可以得到。

3.2如何从输入得到输出呢?

从输入到输出

3.3如何更新权重矩阵呢?

定义损失函数

更新W'

更新W

4.改进

从上面的表述可以看出来,word2vec的权重矩阵非常巨大,那么他的计算就会变得非常困难,那么有什么方法可以对他进行高效的计算呢?
1、单词组合的合并,例如“New York”,“United Stated”等,拆分前后意义完全不同了。
2、对高频词抽样,比如在英文中the,a, is, are等单词出现的频率较高,但其实我们并不需要这么多。抽样的基本思想是:对于训练原始文本中遇到的每个单词,它们都有一定概率被我们从文本中删掉,而这个被删除的概率与单词的频率有关。

图9.png

出现的次数越多,被保留的概率越小。
3、分层softmax;负采样;更新权重矩阵的公式推导;skip-gram如何在输入一个单词的情况下输出可以分成若干个向量,可以看下面的论文翻译。
https://zhuanlan.zhihu.com/p/357859112

你可能感兴趣的:(复习DAY-2-word2vec)