http://blog.csdn.net/pipisorry/article/details/76147604
深度学习在自然语言处理中第一个应用:训练词嵌入。通过词嵌入的词表示方式,大量的nlp领域的任务都得到了提升。Google 的 Tomas Mikolov 在《Efficient Estimation of Word Representation in Vector Space》提出 Word2Vec,就成为了深度学习在自然语言处理中的基础部件。
目前官方最新的word2vec工具包发布于2013年,为c语言版本,此外还有非官方版本:python版本和java版本。
Word2Vec 的基本思想是把自然语言中的每一个词,表示成一个统一意义统一维度的短向量。至于向量中的每个维度也许对应于世界上的一些最基本的概念。一个人读书时,如果遇到了生僻的词,一般能根据上下文大概猜出生僻词的意思,而 Word2Vec 正是很好的捕捉了这种人类的行为。
word2vec工具包输入是一个文本文件,称为训练语料,输出是一个词典,词典中包含训练语料中出现的单词以及它们的词嵌入表示。单词的词嵌入表示,就是用一个n维的实数向量来代表一个单词,单词之间的语义关系可以通过词嵌入体现出来,所以,要衡量词嵌入好与不好,可以观察词嵌入可以多大程度体现单词的语义信息。使用word2vec训练词向量的一个基本假设就是分布式假设,分布式假设是说词语的表示反映了它们的上下文,也就是它认为,有相似上下文的单词的语义也是相近的。
使用word2vec训练出的词嵌入有两个特点:
在介绍word2vec前,先介绍一些基础知识,包括词向量和语言模型。然后介绍word2vec训练词嵌入时可以选择的四种模型,分别介绍它们的模型结构,以及使用梯度更新训练过程的数学推导。
NLP(Natural Language Processing)问题要转化为机器学习的问题,首先就要把单词数学化表示,就是用n维实数向量来代表一个单词,常见的词向量有以下两种:
例如: “话筒”表示为 [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.词汇鸿沟:任意两个词之间都是孤立的,不能体现词和词之间的关系(因为编码过程仅仅使用了它们在词表中的编号信息)。
例如: [0.792, −0.177, −0.107, 0.109, 0.542, …],每个维度用一个实数值表示
克服了One-hot表示存在的两个问题:
1.解决了维度大的问题:常见维度50或者100。
2.解决了“词汇鸿沟”问题:可以通过计算向量之间的距离(欧式距离、余弦距离等)来体现词与词的相似性。
这样的词向量称为词嵌入(word-embedding),那么如何训练这样的词向量呢?我们可以通过训练语言模型的同时,得到词向量。
接下来本文将介绍语言模型的概念,并介绍几种常见的语言模型。
语言模型其实就是判断一句话是不是正常人说出来的。用数学符号描述为:
给定一个字符串“
简单表示为:p(s)=
从上面的公式可以看出,建立语言模型要解决的核心问题就是如何计算
该模型基于这样一种假设:某个词的出现只与前面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模型]
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]
训练语言模型的最经典之作[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。训练完成后,就得到了每个词到隐含层的每个维度的权重,就是每个词的向量。
一个实例:窗口长度为2时:
两个模型都包含3层:输入层,投影层,输出层。
CBOW模型:已知上下文
Skip-gram模型:已知当前词
1.输入层:包含Context(w)中2c个词的词向量
2.投影层:将输入层的2c个词向量求和,即
3.输出层:输出层对应一棵二叉树,它是以词典D中的词作叶子节点,以该词在语料中的频数作为权值构造的一棵Huffman树。这棵树中,叶子节点有N(=|D|)个,分别对应词典D中的词,非叶子节点有N-1个。
对一个样本进行预测的例子:
句子:我,喜欢,观看,巴西,足球,世界杯
w=足球
正类概率:
负类概率:
“足球”叶子节点经过4次二分类,每次分类结果对应的概率为:
第一次:
第二次:
第三次:
第四次:
由Context(“足球”)预测“足球”出现的概率为: