深度学习:词嵌入word2vec
http://blog.****.net/pipisorry/article/details/76147604
word2vec简介
深度学习在自然语言处理中第一个应用:训练词嵌入。通过词嵌入的词表示方式,大量的nlp领域的任务都得到了提升。Google 的 Tomas Mikolov 在《Efficient Estimation of Word Representation in Vector Space》提出 Word2Vec,就成为了深度学习在自然语言处理中的基础部件。
目前官方最新的word2vec工具包发布于2013年,为c语言版本,此外还有非官方版本:python版本和java版本。
Word2Vec 的基本思想是把自然语言中的每一个词,表示成一个统一意义统一维度的短向量。至于向量中的每个维度也许对应于世界上的一些最基本的概念。一个人读书时,如果遇到了生僻的词,一般能根据上下文大概猜出生僻词的意思,而 Word2Vec 正是很好的捕捉了这种人类的行为。
word2vec工具包输入是一个文本文件,称为训练语料,输出是一个词典,词典中包含训练语料中出现的单词以及它们的词嵌入表示。单词的词嵌入表示,就是用一个n维的实数向量来代表一个单词,单词之间的语义关系可以通过词嵌入体现出来,所以,要衡量词嵌入好与不好,可以观察词嵌入可以多大程度体现单词的语义信息。使用word2vec训练词向量的一个基本假设就是分布式假设,分布式假设是说词语的表示反映了它们的上下文,也就是它认为,有相似上下文的单词的语义也是相近的。
使用word2vec训练出的词嵌入有两个特点:
- 体现了语义相似关系,如计算距离“red”最近的词嵌入,结果就是“white”,“black”等表示颜色的单词。
- 体现了语义平移关系,如计算距离“woman”-“man”+“king”最近的词嵌入,结果就是“queen”。
在介绍word2vec前,先介绍一些基础知识,包括词向量和语言模型。然后介绍word2vec训练词嵌入时可以选择的四种模型,分别介绍它们的模型结构,以及使用梯度更新训练过程的数学推导。
词向量和语言模型
词向量
NLP(Natural Language Processing)问题要转化为机器学习的问题,首先就要把单词数学化表示,就是用n维实数向量来代表一个单词,常见的词向量有以下两种:
One-hot Representation
例如: “话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …]
“麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]
One-hot表示使用了单词在词表中的编号信息,编码方式如下:向量长度为词表大小,单词在词表中的编号对应的那一个维度为1,其余为0。
One-hot表示存在两个问题:
1.维度比较大,尤其在用于神经网络的一些算法时,出现“维数灾难”。
2.词汇鸿沟:任意两个词之间都是孤立的,不能体现词和词之间的关系(因为编码过程仅仅使用了它们在词表中的编号信息)。
Distributional Representation
例如: [0.792, −0.177, −0.107, 0.109, 0.542, …],每个维度用一个实数值表示
克服了One-hot表示存在的两个问题:
1.解决了维度大的问题:常见维度50或者100。
2.解决了“词汇鸿沟”问题:可以通过计算向量之间的距离(欧式距离、余弦距离等)来体现词与词的相似性。
这样的词向量称为词嵌入(word-embedding),那么如何训练这样的词向量呢?我们可以通过训练语言模型的同时,得到词向量。
接下来本文将介绍语言模型的概念,并介绍几种常见的语言模型。
语言模型
语言模型其实就是判断一句话是不是正常人说出来的。用数学符号描述为:
给定一个字符串“
简单表示为:p(s)=
从上面的公式可以看出,建立语言模型要解决的核心问题就是如何计算
N-gram语言模型
该模型基于这样一种假设:某个词的出现只与前面N-1个词相关,而与其它任何词都不相关。整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。
常用的是二元的Bi-Gram和三元的Tri-Gram。高于四元的用的很少,因为训练它需要更庞大的语料,而且数据稀疏严重,时间复杂度高,精度却提高的不多。
怎么得到P(Wn|W1W2…Wn-1)呢?一种简单的估计方法就是最大似然估计(Maximum Likelihood Estimate)了。即P(Wn|W1W2…Wn-1) = (C(W1 W2…Wn))/(C(W1 W2…Wn-1))。剩下的工作就是在训练语料库中数数儿了,即统计序列C(W1 W2…Wn) 出现的次数和C(W1 W2…Wn-1)出现的次数。
一个bigram的例子,假设语料库总词数为
存在的问题:
稀疏问题:假设词表中有10000个词,如果是bigram,那么可能的N-gram就有100000000个,如果是trigram,那么可能的N-gram就有1000000000000个,对于其中的很多词对的组合,在语料库中都没有出现,根据最大似然估计得到的概率将会是0,这会造成很大的麻烦,在算句子的概率时一旦其中的某项为0,那么整个句子的概率就会为0,于是我们的模型只能算可怜兮兮的几个句子,而大部分的句子算得的概率是0。suffers from data sparsity and high dimensionality.
解决办法:数据平滑(data Smoothing),数据平滑的目的有两个:一个是使所有的N-gram概率之和为1,使所有的N-gram概率都不为0。
[N-gram模型]
word2vec模型与推导
N-gram模型是基于统计的语言模型,无法得到单词的词嵌入。接下来介绍的语言模型会把词嵌入作为输入(初始的词嵌入是随机值),训练语言模型的同时也在训练词嵌入,最终可以同时得到语言模型和词嵌入。
word2vec也是一种语言模型,在训练语言模型的同时得到词嵌入。word2vec工具包提供了四种可选的训练模型,分别是由两种模型(CBOW,Skip-gram),两种方法(Hierarchical Softmax,Negative Sampling)(只是用Hierarchical Softmax和负采样加速训练计算)组合而成:[CBOW+Hierarchical Softmax] [CBOW+Negative Sampling] [Skip-gram+Hierarchical Softmax] [Skip-gram+Negative Sampling]
神经网络语言模型NNLM(Neural Network Language Model)
训练语言模型的最经典之作[Bengio, Yoshua, et al. "A neural probabilistic language model." JMLR2003]或者在这里[Bengio, Yoshua, Schwenk, Holger, et al. Neural probabilistic language models. In Innovations in Machine Learning. Springer, 2006]。
这里实际就是CBOW模型。
[Bengio, Yoshua, et al. "A neural probabilistic language model." JMLR2003] [Le, Quoc, and Tomas Mikolov. "Distributed representations of sentences and documents." ICML2014]
Bengio 用了一个三层的神经网络来构建语言模型,同样也是 n-gram 模型(即假设某个词的出现只与前面N-1个词相关,而与其它任何词都不相关)。
图中最下方的
网络的第一层(输入层)是将 。 或者average也可以。
网络的第二层(隐藏层)就如同普通的神经网络,直接使用
网络的第三层(输出层)一共有
整个模型的多数计算集中在
hierarchical softmax加速
后面发表论文的 3 个工作,都有对这一环节的简化,提升计算的速度。如In practice, hierarchical softmax (Morin & Bengio, 2005; Mnih & Hinton, 2008; Mikolov et al., 2013c) is preferred to softmax for fast training.
[Morin, Frederic and Bengio, Yoshua. Hierarchical probabilistic neural network language model. Aistats2005] [Mnih, Andriy and Hinton, Geoffrey E. A scalable hierarchical distributed language model. In Advances in Neural Information Processing Systems2008]
the structure of the hierarical softmax is a binary Huffman tree, where short codes are assigned to frequent words.[Mikolov, Tomas, Sutskever, Ilya, et al. Distributed representations of phrases and their compositionality. NIPS2013c]
代码code.google.com/p/word2vec/ [Mikolov, Tomas, et al. Efficient estimation of word representations in vector space. arXiv 2013a]
用随机梯度下降法把这个模型优化出来就可以了,需要注意的是,一般神经网络的输入层只是一个输入值,而在这里,输入层 x 也是参数(存在 C 中),也是需要优化的。优化结束之后,词向量有了,语言模型也有了。
θ = (b, d,W,U, H,C)
优点:
1.这样得到的语言模型自带平滑,无需传统 n-gram 模型中那些复杂的平滑算法。Bengio 在 APNews 数据集上做的对比实验也表明他的模型效果比精心设计平滑算法的普通 n-gram 算法要好 10% 到 20%。
2.词语间的相似性可以通过词向量体现,例如:语料中S1=“A dog is running in the room”出现了10000,次,S2= “A cat is running in the room”出现了0次,按照n-gram模型的做法,p(S1)肯定远大于p(S2)。而在NNLM中,两者非常接近,因为cat的词向量和dog非常接近,将词向量代入计算得到的结果就很接近。
其他几种模型如C&W 的 SENNA,M&H 的 HLBL,Mikolov 的 RNNLM,Huang 的语义强化都是在Bengio论文发表后受到启发并进行一定改进的模型[http://licstar.net/archives/328]。
总结
Word2Vec 的训练模型,看穿了,是具有一个隐含层的神经元网络(如下图)。它的输入是词汇表向量,当看到一个训练样本时,对于样本中的每一个词,就把相应的在词汇表中出现的位置的值置为1,否则置为0。它的输出也是词汇表向量,对于训练样本的标签中的每一个词,就把相应的在词汇表中出现的位置的值置为1,否则置为0。那么,对所有的样本,训练这个神经元网络。收敛之后,将从输入层到隐含层的那些权重,作为每一个词汇表中的词的向量。比如,第一个词的向量是(w1,1 w1,2 w1,3 ... w1,m),m是表示向量的维度。所有虚框中的权重就是所有词的向量的值。有了每个词的有限维度的向量,就可以用到其它的应用中,因为它们就像图像,有了有限维度的统一意义的输入。
CBOW,它的做法是,将一个词所在的上下文中的词作为输入,而那个词本身作为输出,也就是说,看到一个上下文,希望大概能猜出这个词和它的意思。通过在一个大的语料库训练,得到一个从输入层到隐含层的权重模型。如下图所示,第l个词的上下文词是i,j,k,那么i,j,k作为输入,它们所在的词汇表中的位置的值置为1。然后,输出是l,把它所在的词汇表中的位置的值置为1。训练完成后,就得到了每个词到隐含层的每个维度的权重,就是每个词的向量。
两种模型和两种方法的分述
1 CBOW与Skip-gram模型
一个实例:窗口长度为2时:
两个模型都包含3层:输入层,投影层,输出层。
CBOW模型:已知上下文
Skip-gram模型:已知当前词
2 CBOW模型+Hierarchical Softmax方法
1.输入层:包含Context(w)中2c个词的词向量
2.投影层:将输入层的2c个词向量求和,即
3.输出层:输出层对应一棵二叉树,它是以词典D中的词作叶子节点,以该词在语料中的频数作为权值构造的一棵Huffman树。这棵树中,叶子节点有N(=|D|)个,分别对应词典D中的词,非叶子节点有N-1个。
对一个样本进行预测的例子:
句子:我,喜欢,观看,巴西,足球,世界杯
w=足球
正类概率:
负类概率:
“足球”叶子节点经过4次二分类,每次分类结果对应的概率为:
第一次:
第二次:
第三次:
第四次:
由Context(“足球”)预测“足球”出现的概率为:
于是,对于词典中的每个词w有:
其中
或者表示为:
对每个样本使用极大似然估计,于是模型的目标函数为:
用随机梯度下降法求解:
令
求出
参数更新公式:
这里有两点要说明:
1.由于
2.参数更新时,要等所有的
3 CBOW模型+Negative Sampling方法
输入层,投影层:同上一个模型。
输出层:输出层共有N(=|D|)个 “参数-节点”对, 每个 节点分别对应词典D中的词,每个参数表示相应节点的分类器的参数。例如:
正样本、负样本:已知词w的上下文Context(w),需要预测w,因此,词w就是正样本,其他词都是负样本。然而,负样本非常多,至于怎么取,后面部分统一介绍。
给定一个样本(Context(w),w),假定我们选定的负样本集为NEG(w)
其中
可以看出,最大化g(w),也就是让正样本概率最大化,负样本概率最小化。
我们定义:
则此模型的目标函数表示为:
用随机梯度下降法求解:
令
求出
参数更新公式:
与上一个模型相似,这里有两点要说明:
1.由于
2.参数更新时,要等所有的
4 Skip-gram模型+Hierarchical Softmax方法
输入层:只含当前样本的中心词w的词向量v(w)
投影层:恒等投影,依然是v(w)
输出层:与“CBOW模型+Hierarchical Softmax方法”一样,也是一棵huffman树
首先定义:
p(u|w)的求法类似于之前的“CBOW模型+Hierarchical Softmax方法”中求p(w|Context(w) ),之前是用
其中,
于是模型的目标函数为:
用随机梯度下降法求解:
令
则
参数更新公式:
5 Skip-gram模型+ Negative Sampling方法
输入层,投影层:同上一个模型。
输出层:与“CBOW模型+Negative Sampling方法”一样,也是N(=|D|)个 “参数-节点”对。
首先定义:
p(u|w)的求法类似于之前的“CBOW模型+Negative Sampling方法”中求p(w|Context(w) ),之前是用
其中,
于是模型的目标函数为:
用随机梯度下降法求解:
令
则
参数更新公式:
6 Negative Sampling方法
接下来介绍负样本是怎么选取的,见图3.7:
先看上面的线段,其中
其中,
表示词w在语料C中出现的次数,加一个3/4次方是为了削弱极端高频词的影响。
再看下面的线段,
于是,每次随机生成一个数r(0<=r<M) ,则采样的样本为
其它语言模型
C&W 的 SENNA
Ronan Collobert 和 Jason Weston 在 2008 年的 ICML 上发表的《A Unified Architecture for Natural Language Processing: Deep Neural Networks with Multitask Learning》。lz: 提出负采样的方法。
M&H 的 HLBL
Andriy Mnih 和 Geoffrey Hinton 在 2007 年和 2008 年各发表了一篇关于训练语言模型和词向量的文章。2007 年发表在 ICML 上的《Three new graphical models for statistical language modelling》。2008 年发表在 NIPS 上的《A scalable hierarchical distributed language model》则提出了一种层级的思想替换了 Bengio 2003 方法中最后隐藏层到输出层最花时间的矩阵乘法,在保证效果的基础上,同时也提升了速度。lz:主要提出了Hierarchical Softmax。
Mikolov 的 RNNLM语言模型
使用循环神经网络降低Bengio 2003 论文中的参数个数。
循环神经网络的最大优势在于,可以真正充分地利用所有上文信息来预测下一个词,而不像前面的其它工作那样,只能开一个 n 个词的窗口,只用前 n 个词来预测下一个词。
缺陷:用起来却非常难优化,如果优化的不好,长距离的信息就会丢失,甚至还无法达到开窗口看前若干个词的效果。
隐藏层到输出层的巨大计算量,Mikolov 使用了一种分组的方法:根据词频将
[Mikolov, Tomas, et al. "Recurrent neural network based language model." Interspeech2010] code [RNNLM 完美支持中文]
了解 RNNLM,参考其博士论文《Statistical Language Models based on Neural Networks》是最好的选择。
另外还提出上下文相关的语言模型。鉴于句子太长,历史信息无法有效传播。提出了一个RNN-LDA上下文依赖(topic-conditioned RNNLM)的模型,模型通过添加前面词的主题信息作为上下文。They augment the contextual information into the conventional RNNLM via a real-valued input vector, which is the probability distribution computed by LDA topics for using a block of preceding text.
[Mikolov, Tomas, and Geoffrey Zweig. "Context dependent recurrent neural network language model." SLT2012]
段落embedding
考虑语义+词序使用vector来表示paragraph,并用于情感分类和信息检索。propose Paragraph Vector, an unsupervised framework that learns continuous distributed vector representations for pieces of texts. The texts can be of variable-length, ranging from sentences to documents.
Distributed Memory Model of Paragraph Vectors (PV-DM), 类似CBOW。
[Le, Quoc, and Tomas Mikolov. "Distributed representations of sentences and documents." Proceedings of the 31st International Conference on Machine Learning (ICML-14). 2014.]
不同语言模型的评价
Bengio 2003 使用了最朴素的线性变换,直接从隐藏层映射到每个词;C&W 简化了模型(不求语言模型),通过线性变换将隐藏层转换成一个打分;M&H 复用了词向量,进一步强化了语义,并用层级结构加速;Mikolov 则用了分组来加速。
from: http://blog.****.net/pipisorry/article/details/76147604
ref: [斯坦福大学深度学习与自然语言处理第二讲:词向量]
[word2vec原理(一) CBOW与Skip-Gram模型基础]
[Deep Learning in NLP (一)词向量和语言模型]*