您的位置:首页 > 其它

Deep Learning 读书笔记(十二):A Neural Probabilistic Language Model

2015-02-13 20:06 260 查看
寒假在家又捡起好久不写的博客。这几天断断续续的在改自己写的第一篇论文,做的是有关图像处理方面的东西。打算在这篇文章完了之后,这方面就告一段落了吧,对这方面不是很能够提起兴趣。打算之后去做自然语言处理吧,这不是最近很多大牛都开始往这个方向转型嘛,就当是随大流了。今年也是捡起来原来看的几篇文章,把深度学习在自然语言处理方面的方法,从基础开始再回顾一遍。今天看的这篇文章呢,也算是拉开了深度学习在NLP方面的新序幕吧,虽然说新的方法较统计语言模型并没有在效果上有质的提升,但对于语意方面的处理较之原来的方法还是具有较大的优势。

在利用统计语言模型来解决自然语言处理问题时,经常会遇见的问题就是维度灾难,特别是当测试数据集中的文本与训练数据集中的文本不太相似时。而且利用统计的方法训练一个较大的模型,同时将训练时间控制在一个合理的时间范围内是一件比较困难的事。而本篇文章就提出了一种关于自然语言处理问题的新模型,它能够同时学习到关于单词的 distributed presentation 和关于单词序列的概率函数。通过实验能够发现,该模型较之原来效果最好的n-gram模型有些许的提升。而且对于处理长文本有着更大的优势。

如何体现出这篇文章的方法与传统方法在算法的泛化能力上的不同,就在于“how probability mass that is initially concentrated on the training points is distributed in a larger volume, usually in some form of neighborhood around the training points.” 在高维空间中,distribute
probability mass 是一件很困难的事,“it matters rather than uniformly in all directions around each training point.”

统计语言模型中,效果最好的还是n-gram模型(这里的n通常取3),如果再结合一些较好的tricks,还能够取得更好的效果。实际上,整个句子包含有更多的信息,如果使用整句来预测是能够取得比只使用前几个词更好的效果的。这篇文章主要解决了两个问题,一个是不会只考虑前一个或是两个词,二是不会只考虑到词之间的相似性。

本篇文章的一个主要贡献在于,能够使用一个庞大的神经网络(之后会看到,这是一个多层的且共享权值的神经网络)来训练一个庞大的数据集。尽管代价较为昂贵,但还是能够接受的,同时对于长文本具有较好的扩展性,最后的结果也是很具有竞争力的。

文章提出的一个关于自然语言处理问题的新模型如下:

(1)为每一个在词典中的单词赋一个实值向量,向量的维度一般取30,60,100。较之原来one-hot的表示方法,维度已经大大减小了。

(2)利用单词的特征向量来构建概率函数,这与n-gram模型中的函数是非常相似的。

(3)对于特征向量和概率函数中的参数都是同时学习得到的。

在新模型中,具有相近语意的单词具有相近的特征向量。如果特征向量有一个小的变化,则在概率模型中也会体现出来。“the presence of only one of the sentence in the training data will increase the probability, not only of that sentence, but also of its combinatorial number of "neighbor"
in the sentence space.”

整个模型的目标就是学习到这样一个函数

,可以将这个函数分为两个部分。第一部分就是将词典中的每一个单词投影到一个实值向量的变换,这个实值向量就是所要学习的
distributed representation 。这个变换中所包含的参数共有|V|xm,其中m是实值向量的维数。这个变换对于词典中的所有单词都是通用的。第二部分就是利用词向量构造一个概率函数来代替之前的函数:


而这个函数可以用一个前向或是循环神经网络带代替:



可以发现整个网络中的参数与词典的大小呈线性关系,与网络中输入窗口的大小也呈线性关系。如果要进一步地减小参数的个数,那么就需要共享更多的结构,可以使用 time-delay 神经网络或是循环神经网络。

在最后的试验中,作者们并没有使用与图中一样的结构,并没有将输出层与输入层连接起来。为了保证最后的输出结果之和为1,采用的是 softmax 分类器。

在整个模型中,多数的参数都被用在了输出层上,但是输出层单词间的语义等信息却被忽略掉了,可以尝试同样的使用词向量来表示输出层单词。

“the joint probability of a sub-sequence

is
proportional to the exponential of a sum of terms associated with each hidden unit j,


.”在处理时,将这个联合概率分解为多个条件概率来计算,其实也可以利用训练DBN网络的对比分歧算法来进行训练。

该模型较之原模型最大的优势就在于可以很容易地处理那些并不在词典中的单词,甚至可以为它赋予一个概率。假设为文本中的一个单词i赋予概率

,之后发现了一个并不在词典中的单词j,则j的词向量可以用以下公式来计算:

。之后可以将单词j合并到词典中去,重新计算下各词的词向量。

这篇文章所提出的词向量的概念,成为了之后深度学习在自然语言处理方面的基础,其对单词的表达维度较原方法大大地减小,而且更多地考虑到了单词的语义。甚至我们可以发现,词向量中存在着一些特定的运算,例如China-Beijing=Japen-Tokyo(这里用单词来表示它们的词向量),这还是很有意思的。这篇文章的 future work 写的非常之详细,提出了一些非常有建设性的想法,感兴趣的可以去看下。知道有一个非常牛逼的人物,就是根据
future work 中的设想,不断地往下做,发了几篇牛逼的文章,也有可能是他导致了现在循环神经网络也是非常的热门。

网上有很多已经训练好了的词向量,其中最著名的还要算是 google 的 word2vec,它的实现跟这篇文章所介绍的还是有所不同,网上也有很多资料来介绍它,源码非常容易获得,可以找来看下,写的非常之精炼,主要的代码有1000多行,也不算特别长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: