通俗理解word2vector词向量模型

1、word2vector简介

2013年,Google团队发表了word2vec工具。word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax)。

2、词向量

比如有一个城市的词汇表(北京,上海,宁夏,纽约,巴黎,,,,,南京),One-Hot Encoder按照如下方式表示:

杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]

上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]

宁波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]

北京 [1,0,0,0,0,0,0,0,0,……,0,0,0,0,0,0,0]

比如上面的这个例子,在语料库中,杭州、上海、宁波、北京各对应一个向量,向量中只有一个值为1,其余都为0。但是使用One-Hot Encoder有以下几个问题。一方面,城市编码是随机的,向量之间相互独立,看不出城市之间可能存在的关联关系。其次,向量维度的大小取决于语料库中字词的多少。如果将世界所有城市名称对应的向量合为一个矩阵的话,那这个矩阵过于稀疏,并且会造成维度灾难。使用分布式词向量(distributed word Vector Representations)可以有效解决这个问题。Word2Vec可以将One-Hot Encoder转化为低维度的连续值,也就是稠密向量,并且其中意思相近的词将被映射到向量空间中相近的位置。

分布式词向量是一个固定大小的实数向量,事前确定它的大小比如N=300维或者N=1000维,每个元素都是一个实数,实数的具体值是词库里面每个词通过不同的贡献得来的,所以叫分布式的。而word2vec就是一种学习这个分布式词向量的算法。向量的余弦夹角可以代表词语之间的相似度。这种方法相较于One-hot方式另一个区别是维数下降极多,对于一个10W的词表,我们可以用n维(n可以随意设置,比如:n=10)的实数向量来表示一个词,而One-hot得要10W维。

3、模型简介

one-hot向量作为word2vec的输入,通过word2vec训练低维词向量(word embedding)。

word2vec模型其实就是简单化的神经网络。如图:
在这里插入图片描述
输入层:One-Hot Vector
隐藏层:没有激活函数,也就是线性的单元。
输出层:维度跟输入层的维度一样,用的是Softmax回归。

4、CBOW

CBOW(Continuous Bag-of-Word Model)又称连续词袋模型,是一个三层神经网络。如下图所示,该模型的特点是输入已知上下文,输出对当前单词的预测。如图:
在这里插入图片描述
更详细的图:
在这里插入图片描述
网络计算步骤:

  1. 输入层:上下文单词的onehot。(假设单词向量空间dim为V,上下文单词个数为C)
  2. 所有onehot分别乘以共享的输入权重矩阵W(W为V*N矩阵,N为自己设定的数,需要初始化权重矩阵W)
  3. 所得的向量 (注意onehot向量乘以矩阵的结果) 相加求平均作为隐层向量, size为1*N.
  4. 乘以输出权重矩阵W’ {N*V}
  5. 得到向量 {1*V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维都代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)
  6. 与true label的onehot做比较,误差越小越好。loss function(一般为交叉熵代价函数)

说明:w是输入层到隐藏层的权重矩阵,维度是{V*N},W’是隐藏层到输出层的权重矩阵,维度是{N * V}.

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

看个例子:

句子:I drink coffee everyday!
在这里插入图片描述
softmax公式:
softmax公式
这里,drink稀疏的表示[0 1 0 0]经过embedding之后变为了稠密的矩阵[2 2 1].

5、skip-gram

Skip-gram与CBOW恰恰相反,即已知当前词语,预测上下文。如图:
在这里插入图片描述
详细图:
在这里插入图片描述

eg: 句子:“The quick brown fox jumps over lazy dog”,我们设定skip_window的参数,它代表着我们从当前input word的一侧(左边或右边)选取词的数量,设定我们的窗口大小为2(skip_window=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)。
在这里插入图片描述
比如:训练样本取(The,quick),根据句子[The,quick, brown ,fox ,jumps, over,the, lazy, dog],它们被编码成one-hot向量后,The是(1,0,0,0,0,0,0,0,0),quick是(0,1,0,0,0,0,0,0,0)。因此输入是1 * 9维的one-hot向量The(1,0,0,0,0,0,0,0,0),乘以9 * 5(9是单词个数,5是随机取的数字)的输入层到隐藏层的权重矩阵W,得到1 * 5维的隐藏层神经元向量,该神经元向量乘以5 * 9的权重矩阵,得到1*9的向量,对该向量的每个元素值做softmax函数运算,得到另一个1 * 9的向量,该向量的每个值代表每个词的概率,而且之和为1,每个值的大小是什么意思呢?这个向量是the这个词经过训练得到的输出,该输出是一个包含9个概率值分布的向量,向量中的每个概率值代表着对应词汇表中9个单词的概率大小,理想情况是这个向量等于给定的labels向量quick,但由于softmax函数的特性,这种情况永远达不到,所以只能通过反向传播的过程让它们不断逼近。

具体步骤如下:
第一步,输入层到隐藏层:
在这里插入图片描述

该图输入的The的one-hot向量称为x,乘以9*5维的权重矩阵W,得到5维的隐藏层神经单元,每个值代表一个神经元,看下计算过程,计算后得到的隐藏层神经元的值其实就是W矩阵的第1行。因为每次输入都是像The这样的向量,one-hot向量中第几列值为1,隐藏层就是W矩阵的第几行。因此对任何输入而言,隐藏层就是W矩阵的某一行,所以:每个词的one-hot向量输入到隐藏层后,隐藏层的值就是权重矩阵W某一行的值,该行的值也就是该词的词向量,因此我们要更新迭代的模型就是W矩阵(即每个词的词向量),w矩阵即是我们模型输出的最终结果
第二步,隐藏层到输出层:
在这里插入图片描述

步骤1计算得到的1 * 5维矩阵,作为隐藏层神经元的值[3,0,5,2,4],再乘以一个5 * 9维的权重矩阵Q,得到上述等式右边1 * 9维的矩阵Z[z1,z2,…,z9],对该矩阵的每个值作softmax函数运算,得到Z’[z’1,z’2,…,z’9],其中z’1+z’2+…+z’9 = 1, 这9个z’值,最大那个,就对应着The这个词本应该的输出,而The的labels是quick,quick这个词的one-hot向量为(0,1,0,0,0,0,0,0,0),那么我们训练并且迭代W权重矩阵的目的就是使z’2这个值最大。同理对应其他单词输入输出对(The, brown),(quick,The)等等,采用同样的训练过程,可以不断的调整输入层到隐藏层的W向量9 * 5中每行的值,一共9行9个主要词汇,因此得到9个词向量。

小结:无论是CBOW还是skip-gram,最终我们需要的是训练出来的输入层到隐藏层的权重矩阵w,w每行对应每个词的词向量。

6、训练及优化

在第一部分讲解完成后,我们会发现Word2Vec模型是一个超级大的神经网络(权重矩阵规模非常大)。

举个栗子,我们拥有10000个单词的词汇表,我们如果想嵌入300维的词向量,那么我们的输入-隐层权重矩阵和隐层-输出层的权重矩阵都会有 10000 x 300 = 300万个权重,在如此庞大的神经网络中进行梯度下降是相当慢的。更糟糕的是,你需要大量的训练数据来调整这些权重并且避免过拟合。百万数量级的权重矩阵和亿万数量级的训练样本意味着训练这个模型将会是个灾难。

下面主要介绍两种方法优化训练过程。
1.负采样(negative sampling)
负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。至于具体的细节我在这里就不在介绍了。
2.层序softmax(Hierarchical Softmax)也是解决这个问题的一种方法。

参考:
https://blog.csdn.net/lilong117194/article/details/81979522
https://blog.csdn.net/free356/article/details/79445895
https://blog.csdn.net/mylove0414/article/details/61616617
https://blog.csdn.net/yu5064/article/details/79601683
https://zhuanlan.zhihu.com/p/29020179

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值