当前位置: 时代头条 > 正文

自然语言处理:使用word2vec提取词向量

自然语言处理:使用word2vec提取词向量

一、 背景介绍

深度学习已经在图像、语音等多个领域取得了重大突破,但在自然语言处理领域很长一段时间内,一直没有取得激动人心的成果,很大一部分原因是因为文本不像图像自带天然的网格,能够直接的转换成数值型数据,从而提取特征(如向量或者矩阵表示)。

于是,如何从文本中提取特征成为了一个热点问题。从2013年google 研究员Tomas Mikolov 发表两篇论文(《Efficient Estimation of Word Representations in Vector Space》、《Distributed Representations of Words and Phrases and their Compositionality》)提出Word2Vec工具提取词向量,让自然语言处理向前迈了一大步,本文从原理上阐述Word2Vec的实现。

二、 词向量

1.词向量表示

词向量是将文本分词后,以向量的形式表示每一个词语,这种转换方式成为embedding,中文称之为词嵌入,早期使用一种叫one-hot Representation的表示词向量,例如:

“今天上午上完体育课,下午放假。”

分词后用向量表示每一个单词,其中每个单词维度为单词数,每一个单词所在位置为1,其他为0,如今天=[1,0,0,0,0,0,0],上午=[0,1,0,0,0,0,0]

这种表达词语的向量空间为系数矩阵,便于做计算,但是这种表示词语的方法有两个缺点:一是在做一些深度学习的运算时,会造成维灾难;二是这样表示词语没有体现词语之间的关联性。

另一种Distributed Representation是Hinton在1986年提出通过训练将每个词映射为K维实数向量,通过词之间的距离判断词语之间的语义相似度。Word2Vec就是用这种词向量表示方式,下面会讲到如何生成k维实数词向量。

2.神经网络语言模型(Neural Network Language Model)

看过大部分的获取词向量的方法,基本都是在训练模型的同时,得到词向量的,其中最经典的应该是Bengio在NIPS上发表的《Can Artificial Neural Networks Learn Language Models?》,文中提出以三层神经网络构建语言模型的方法,如图:

图中最下方的wt-n+1,…,wt-2,wt-1为前n-1个词,现在需要根据这已知的n-1个词语去预测下一个词wt。C(w)表示为词语w的词向量,这里要注意的是,C(w)开始是未知的。将前n-1个单词拼接成一个矩阵放入到隐藏层(第二层),输入Hx+d通过tanh函数输出,最后以一个softmax函数归一化输出,计算公式为:

其中U是隐藏层到输出层的参数,整个模型后半部分就是一个标准的三层神经网络模型,而前面的wx为直接输入层到输出层的一个线性变换,这个模型中大部分的计算都在U和隐层的计算上。最后再用随机梯度下降的方法求解模型参数。这样就得到了一个语言模型和每个词的词向量了。

我们从概率分布的角度去理解:

一个文本s=w1,w2,w3,…,wt,概率表示为:

自然语言处理:使用word2vec提取词向量

由于当文本比较大时,参数过多,一般用简化模型Ngram模型:

自然语言处理:使用word2vec提取词向量

利用一个简单的前向反馈神经网络g,由一个tanh和一个softmax输出层组成,通过将embedding层输出的N-1个词向量映射为一个长度为V的概率分布向量,从而对词典中的word在输出context下条件概率做出预估:

自然语言处理:使用word2vec提取词向量

通过最小化一个cross-entropy的正则化损失函数来调整模型的参数θ:

自然语言处理:使用word2vec提取词向量

3.Word2vec

由于NNLM存在一些问题(如NNLM只能处理定长的序列、NNLM训练太慢等等),Mikolov在2013年发表两篇文章并推出Word2Vec工具计算词向量。让我们来看看,它是怎么实现算法的。

对原始的NNLM模型作如下改造:

1.移除前向反馈神经网络中非线性的hidden layer,直接将中间层的embedding layer与输出层的softmax layer连接;

2.忽略上下文环境的序列信息,输入的所有词向量均汇总到同一个embedding layer;

3.将词语加入到上下文环境、得到的CBow模型如下图所示:

自然语言处理:使用word2vec提取词向量

从数学上看,CBow模型等价于一个词袋模型的向量乘以一个embedding矩阵,然后得到一个连续的embedding向量,从形式上看,CBow模型是由前n个词语和后n个词语去预测当前词的模型。反过来用目标词语对前后n个词语的预测过程中得到的模型叫Skip-gram模型:

自然语言处理:使用word2vec提取词向量

计算过程如下:

自然语言处理:使用word2vec提取词向量

其中,Vi为wi的输入向量,Uj为wj的输出向量。由此可见Skip-gram是输入向量和输出向量之间的余弦相似度。然后进行softmax归一化。

为了减少训练过程中的计算时间,作者使用了一些tricks如随机抽样、高频词亚采样、huffman编码等等去优化训练过程。有兴趣的朋友可以看看源代码和实现。

下面贴一下自己根据作者提供的C++实现版本训练上百万财经新闻得出结果:

自然语言处理:使用word2vec提取词向量

其中第一行是输入词语(这里是农业),下面列出来的是与输入词相关度最高的词语。

三、 总结与展望

Word2Vec是谷歌实现词向量的一个很好的工具实现,它对序列局部数据有着很好的解释,我们可以用来进行文本分类、新闻推荐、情感分析等工作。也为后期能将文本数据放入到CNN、RNN以及变体对语言进行各种语义组合模型提供了很大帮助。同时也引出思考,既然词语能够用向量表示,那么句子和文档是否也能用向量表示,也能不能用矩阵、队列、栈表示。这也值得更进一步的去探讨与研究。

最新文章

取消
扫码支持 支付码