上周我们讲到,在进行NNLM训练时,能够得到副产品,词向量。本文介绍一种专门用于词向量制备的方法:word2vec,利用它能够高效的训练出词向量。
作者&编辑 | 小Dream哥
1 word2vec是什么?
在阐述word2vec的原理之前,笔者先大致介绍一下,word2vec是什么,能够用来干什么,让读者有一个大致的认识。
word2vec是2013年Efficient estimation of word representations in vector space论文中提出的一种有效的词向量制备方法,沿用至今。
word2vec用前馈神经网络进行训练,提出了Continuous Bag-of-Words和Continuous Skip-Gram两种模型训练方法,损失层有层次Softmax(Hierarchical Softmax)和负采样(Negative Sampling)两种。
2 模型结构
上面我们说了,word2vec是一种高效的制备词向量的方法,那么跟2003年的NNLM相比,它的效率高在哪里呢?先从网络结构开始,我们来细细看一下。
如上图所示,是word2vec中提出的两种模型训练模式:Continuous Bag-of-Words和Continuous Skip-Gram。
Continuous Bag-of-Words:
CBOW是这样一种任务,给定一个去掉了中间一个词的context,预测其中间的那个词。它跟NNLM的任务有点相似,差别在于,它是双向的,即预测词时利用了该词前后的词语信息。
Continuous Skip-Gram:
Continuous Bag-of-Words是通过一个词,预测其周围的几个词。
以Continuous Bag-of-Words为例,我们来看看word2vec的网络结构。
如上图所示,word2vec将网络做了如下的改造:
1.输入的所有词向量相加求和得到SUM,称为embedding layer;
2.移除前向反馈神经网络中非线性的hidden layer,直接将中间层的embedding layer与输出层的softmax layer连接;
我们来分析下这样做有什么好处呢?移除中间的隐藏层,最大的好处就是能够极大的减少运算量了,训练时候的效率就能够大幅提升。Continuous Skip-Gram也是相似的道理了。
3 损失函数
以CBOW模型为例,训练时最容易想到的是,得到输入序列的SUM embedding之后,通过一个project和softmax层,计算出字典V中每个词的概率,再构建交叉熵之类的损失函数,然而直接对词典里的V个词计算相似度并归一化显然是极其耗时的。
为此作者提出了层次Softmax(Hierarchical Softmax)和负采样(Negative Sampling)两种损失层。层次Softmax(Hierarchical Softmax)原理很有意思,但是计算起来还是比NCE要复杂。因此,真正应用比较多的是NCE,这里就详细介绍一下NCE的原理。
负采样的思想最初来源于一种叫做Noise-Contrastive Estimation的算法,原本是为了解决那些无法归一化的概率模型的参数预估问题。
在CBOW中,给定一个去掉了中间一个词的context(w),预测其中间的那个词w。那么,中间的那个词w就是正样本,其他的词就是负样本了。那么NCE的过程大致是这样的,对于context(w)构造一个关于w的负样本集NEG(w);在训练时,针对{w,NEG(w)}构造一个目标函数,通过优化该目标函数优化整个网络的参数(包括词向量)。
那么,这个目标函数该怎么构建呢?
我先定义一个这样的函数,
其中:
那么p函数也可以这样表示:
这里X表示输入的各个词向量之和。
那我们的目标函数这样去构建:
也可表示为:
这样的话,我们在训练时,只需最大化这个g,就可以优化网络的参数。想想看为什么呢?从形式上看,最大化g就是最大化
同时最小化所有的
这不正是我们所需要的吗?
好了,我们来总结一下上述的过程。NCE的训练过程,就是构建一个关于w的负样本集NEG(w),针对正负样本集,计算g函数的值,训练时,通过最大化该值来优化网络。
4 负采样的过程
我们这节来看看负采样的过程是怎么样进行的,也就是上述NEG(w)是如何获得的。
对于语料C,可以构建一个词典D,并统计其中各个词的词频。整体的原则是,词频高的词选中作为负样本的概率就高。
设词典D中每一个词对应一个长度l(w)的线段,则l(w)=counter(w)/|C|。然后将这些线段首尾连接起来,就构成了一个长度为1的线段。在负采样时,随机往该线段上打点,打到的就被采到。这就是负采样的大致过程了,在word2vec的实际操作过程中,会做一些变化,但是基本的思想就是这样的。
总结
上述就是word2vec的基本原理了,通过word2vec能够高效的获得词向量,是自然语言处理入门必须要掌握的内容。
标签:采样,NLP,word2vec,函数,Continuous,详解,Softmax,向量 From: https://blog.51cto.com/u_14122493/5751599