语言模型1-word2vec为什么能训练出相似向量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PeaceInMind/article/details/52861505

导语

由于接到一点语言模型的任务,自然也就看到了word2vec这个比较火的课题。网上的课程和材料相对都比较多,一般一开始都会说word2vec的优点能描述出单词的相似关系,然后就是理论或者代码。但是都没有解释或者没有清楚地解释为什么word2vec能为功能性差不多的单词训练出相似向量(当然也有可能自己看的材料不多)。不管怎么样,本文尝试去解释这个问题,由于本人才疏学浅,错误敬请指正。

Word2vec网上已经有了很多材料,这篇文章的重点不在此,但是为了完备和引入的方便,会简要介绍,读者可以先参考其他的材料。

 

词向量/词嵌入 word2Vec(word embedding)

由于计算机处理的需要,我们在处理自然语言处理的时候需要将一个单词数字化。数字化有很多方法,比如one-hot表示

1 one-hot表示

举个简单例子,我们现在有两句话,构成我们的语料库,

1 牛在吃草。

2马在吃草。

为了解释方便,忽略标点符号(一般地,标点符号应该也要考虑)。那么这里5个字,构成我们所说的字典,这样我们就可以为这五个字分别编码成

扫描二维码关注公众号,回复: 5247195 查看本文章

牛 -> [1,0,0,0,0]

在->[0,1,0,0,0]

吃->[0,0,1,0,0]

草->[0,0,0,1,0]

马->[0,0,0,0,1]

这样表示的好处是简单,好理解,缺点是:

1维度太大,一般文字需要考虑上下文信息,用这些特征去训练权重的维度很大

2太稀疏,训练难,因为某一次迭代中连接0的那部分权重无法获得更新,训练效果差,时间长

因为,比如y = Wx,根据梯度下降法,权重的更新大致如下面的公式,如果x等于0,那么w无法得到更新

3牛和马这对相近的字之间没有什么联系(从特征的角度来说应该就是特征不太好,影响后面的训练。个人理解,兼听则明)

 

2 直接学习(Learn low dimensionalvectors directly)

从机器学习的角度来说,一个好的词转向量算法就是要找一个较低维的向量来表示一个词。这个词向量最好能使相似的两个词之前的向量也比较接近,当然,速度也是一个非常重要的因素。

 

一提到降维,首先就会想到PCA啊,SVD。其实之前确实有人用过SVD这类方法来做过,但是可能对于大词库的数据来说,维度还是很大,具体参考NLP相关的课程或者[1],本人没有仔细研究。

 

另外一个分支就是这里要说的利用机器学习,直接学习法,它的发展历程如下

Learning representations by back-propagatingerrors.(Rumelhnrt,Hinton,Williams 1986)

 

A neural Probabilistic Language Model(Bengio et al.2003)

 

Natural Language Processing(Almost) fromScratch(Collobert et al.,2011)

 

Efficient Estimation of Word Representations inVector Space(Mikolov et al.2013)

 

GloVe: Global Vectors for WordRepresentation(Pennington et al. 2014)

这里我们主要分析的是影响深远的Mikolov的这篇[3],另外本篇博文受文献[2]的启发比较大。

 

2.1 定义

什么词算相似,一般可以认为,如果两个词的上下文越相似,这两个词也就越相似。比如牛在吃草,马在吃草,牛和马后面的词都一样。又或者是我家在北京,我家在上海,北京和上海的功能差不多,这两个词也就越相似,个人认为这也就是word2vec的出发点。

 

向量相似性,一般地,我们以向量的夹角来评价两个向量的相似性

这样我们就可以发现,如果有两向量u,v

u加上s*v时(s是正标量),uv的夹角变小,因此更相似,

u减去s*v时(s是正标量),uv的夹角变大,因此相似性减弱

2.2 网络架构

文献[3]用的是神经网络来学习词向量,为了理解方便,我们用最简单的架构和最原始的任务为例。现在我们的任务是根据上一个单词来预测当前的单词,比如上面的例子中我们有的两句话("牛","在","吃","草")和("马","在","吃","草"),输入"牛"我们需要预测"在",输入"在"需要预测“吃”。

整个架构由三部分组成,输入层,隐藏层和输出层。输入层是上一个单词(上下文)的onehot表示,维度是V(字典中所有单词的个数),然后经过一个线性的映射W(没有非线性的激活函数)也就是word embeding转换到隐藏层(词向量)。词向量再经过一个全连接层和一个softmax输出的是每一个单词的概率。

比如上面的例子中,V就是5,"牛"和"在",“马"和"在",“在”和“吃”(2个),“吃”和"草"(2个)都构成一个训练样本。如果再具体些,如果假设隐藏层的维度为2,那么整个系统架构图就变成了下图,W是个5*2的矩阵,U是个2*5的矩阵。另外图中假设输入的是单词“牛”。

2.3  W的意义

从上面的架构中,我们可以得到

由于x采用了one hot表示,因此从上图中可以看出,

W的第一行就是当前""word vector,

同理W的第二行就是"在"的word vector,以此类推

2.4 分析

接下来就到了我们这篇文章的核心部分,就是探讨为什么这样的训练方式能为功能相近的单词训练出相似的特征。

这里我们需要剖析BP的过程。我们先考虑第一个输入样本,也就是“牛”和“在”(当前输入是”牛“,目标是”在“),这个时候H(h0,h1)和W的第一行都表示牛的词向量W牛。

然后经过全连接U的前馈和softmax归一激活,我们可以计算五个单词的概率(P0,p1,p2,p3,p4),当然这个概率跟我们想要的概率(0,1,0,0,0)会有差距,因此呢我们需要BP.现在假设我们已经求得了输出误差反馈到了sigmoid函数f输入的误差(这个部分对现在的分析没有很大影响),得到e牛,e在,…,e马。

e牛 = f'0 * (p0 - 0);//正数

e在 = f'1 * (p1 - 1);//负数

e吃 = f'2 * (p2 - 0);//正数

e草 = f'3 * (p3 - 0);//正数

e马= f'4 * (p4 - 0);//正数

然后我们首先来看下图这两个权重的调整,也就是U的第一列(其实分析BP基本不需要去列很多公式,只需要记住虽然前馈是非线性的,但是反馈是线性的,数据流从哪里流出去,反馈误差就从哪里流回来),我们用uij表示u的第i行第j列元素。并为了表示方便,在这个例子中我们用U牛来表示U的第一列,U在表示U的第二列,以此类推

因为我们要预测的是"在",所以根据普通的梯度下降法,得到

u00 -= alpha * e牛 * h0

u10 -= alpha * e牛 * h1

其中apha是学习率

用向量来表示就是

U牛-= alpha * e牛* H

由于e牛是正数,根据之前2.1节相似性的分析,所以这个迭代的结果就是使得U牛远离H,又由于当前的H就是"牛”的当前词向量W牛,也就是说U牛与W牛越来越不相似

同理可以得到U的第三列,第四列,第五列都是同样的情况

但是唯一不同的是U的第二列,也是是U在,由于e在是正的,所以U在会跟W牛相似

 

所以这次的结果就是

U牛远离 W牛

U在 拉近  W牛

U吃 远离 W牛

U草 远离 W牛

U马 远离 W牛

 

然后我们先不按照一般的BP去分析H和W的迭代,我们继续分析(“马”,“在”)这个训练样本对U的影响,根据上面的分析我们会得到

U牛远离 W马

U在 拉近  W马

U吃 远离 W马

U草 远离 W马

U马 远离 W马

 

继续分析(“在”,“吃”)这个样本

U牛远离 W在

U在 远离  W在

U吃 拉近 W在

U草 远离 W在

U马 远离 W在

 

分析到这,应该就有点眉目了,原来U存储的是对应“在”的上下文的信息,会偏向其上下文出现的词向量,而与不是上下文的词向量相差比较大,这是我们得到的非常重要的观察。

 

当然我们的最终目的是要分析词向量W,因此我们按照BP的过程继续分析H

 

 

如果对BP非常了解,下面结果一目了然,H的更新公式为

H -= alpha * U牛 * e牛 +

       alpha * U在 * e在  +

       alpha * U吃 * e吃  +

       alpha * U草 * e草  +

       alpha * U马 * e马  

 

 

比如我们在训练样本("牛","在")的时候,H就是当前的W牛,也就是

W牛 -= alpha * U牛 * e牛 +//负数

          alpha * U在 * e在  +//正数

          alpha * U吃 * e吃 +//负数

         alpha * U草 * e草 +//负数

         alpha * U马 * e马//负数

 

由于只有e在是负数,W牛会拉近U在,而U在里面会包含“在”的上下文信息,会偏向W牛和W马,而其他的四个会偏向他们对应的上下文单词,所以结果就是W牛会偏向W牛和W马,同理在训练("马","在")的时候W马也会偏向W牛和W马,最后经过多次训练,达到一个平衡,W牛和W马会比较相似

 

参考文献

[1]http://www.mamicode.com/info-detail-859790.html

[2]Rong X. word2vec parameter learning explained[J].arXiv preprint arXiv:1411.2738, 2014.

[3]

Mikolov T, Chen K, Corrado G, et al. Efficientestimation of word representations in vector space[J]. arXiv preprintarXiv:1301.3781, 2013.

猜你喜欢

转载自blog.csdn.net/PeaceInMind/article/details/52861505