自然语言处理是研究和实现人与计算机之间利用自然语言进行有效交流的各种理论和方法。本文主要介绍深度学习在自然语言处理中的应用。自然语言处理简介自然语言处理是研究和实现人与计算机之间使用自然语言进行有效交流的各种理论和方法。具体任务包括:问答系统(如Siri、Alexa、Cortana的功能)情感分析(判断一个句子表达的是积极情绪还是消极情绪)图文映射(看图写词)机器翻译(相互翻译)languages)语音识别句子成分分析命名实体识别传统的NLP方法需要广泛的语言领域知识。理解音素和语素等术语是一项基本技能,并且有专门的语言培训课程。我们先来看看传统的NLP方法是如何理解下面这个词的:假设我们的目标是从这个词中提取一些信息(情感偏见,词义等)。根据语言学知识,该词可分为以下三部分:我们知道,前缀“un”表示相反或否定的意思,后缀“ed”表示该词的时态(过去时)。通过识别词干“兴趣”的含义,我们可以很容易地推断出这个词的含义和情感倾向。看起来很简单,对吧?但是当你真正梳理过英语中所有的前缀和后缀时,你会发现所有的前缀和后缀的组合有很多很多,只有非常有经验的语言学家才能理解它们的意思。深度学习的介入深度学习本质上是一种表征学习的方法。例如,CNN模型使用过滤器组合将对象分类为不同的类别。因此,笔者认为,我们也可以借用同样的方法来表示词。本文概述了作者构建深度神经网络模型以撰写本文的基本顺序,然后结合近期的研究论文讨论了一些实际应用。或许,有些读者在看完全文后,仍然对为什么使用RNN模型,或者为什么LSTM网络有效有疑问。不过笔者的本意是希望大家能够对深度学习在自然语言处理领域的应用有一个感性的认识。词向量由于深度学习方法喜欢使用数学符号,我们将每个词表示为一个d维向量。假设d=6。应该使用什么值来表示这个向量?我们希望这个向量可以表示单词的含义或语义。一种方法是创建共现矩阵。假设现在有一个句子:我们要将句子中的每一个词表示为一个向量:共现矩阵的每一个元素代表一个词和另一个词在整个文档中相邻出现的次数。具体如下图所示:我们可以将共现矩阵的每一行作为词向量的初始值:读者请注意,仅仅通过观察这个简单的矩阵,我们就可以获得很多有用的信息。例如,单词“love”和“like”都与名词词(NLP和dogs)共现1次,并且它们都与“I”共现一次。这意味着这两个词很可能是动词。如果我们手中的数据集足够大,可以想象“喜欢”和“喜欢”的相似度会越来越高。同样,其他同义词的词向量也会越来越相似,因为它们总是处于相似的上下文中。出现在。虽然我们找到了一个很好的起点,但我们需要注意,这个向量表示的维度会随着语料库的增长而线性增长。如果我们有一百万个词(在NLP问题中不算太多),我们会得到一个1000,000x1000,000的矩阵,而且这个矩阵非常稀疏。就存储效率而言,这显然不是一个很好的代表。已经有很多不错的词向量表示方法,其中最著名的就是word2vec。Word2Vec词向量方法的基本思想是让向量尽可能完整地表示词中包含的信息,同时保持向量维度在可控范围内(合适的维度在25到1000维度之间)。Word2vec的思想是预测一个中心词附近出现其他词的概率。还是拿前一句“我爱NLP,我喜欢狗”。举个例子。我们先看句子的前三个词。因此,窗口的宽度为m=3:接下来,我们的目标是根据中心词“love”来预测其周围可能出现的词。如何实现?当然,首先要确定一个优化目标函数。假设确定了一个中心词,我们把这个函数设置为最大化周围词的对数概率:这个函数很重要,作者强调一定要仔细理解。仍然以“爱”为中心词为例,目标函数的含义是累加左边“我”、“爱”这四个词与“NLP”、“爱”的对数概率值在右侧。变量T表示训练句子的数量。下式是对数函数的公式:Vc是中心词的词向量。每个词都有两个表示向量(Uo和Uw)——一个用于该词是中心词的场景,一个用于该词不是中心词的场景。我们使用随机梯度下降训练词向量。这个过程是最令人费解的。如果读者对以上解释感到困惑,笔者还推荐两篇文章进一步阅读。第一个(https://dzone.com/articles/natural-language-processing-adit-deshpande-cs-unde)和第二个(https://www.youtube.com/watch?v=D-ekE-世界)。一句话总结:给定中心词,Word2vec的目标是最大化上下文词的对数函数值,优化方法通常是SGD。word2vec方法最亮眼的效果就是可以发现词向量之间的线性关系。经过训练,词嵌入似乎捕获了不同的句法和语义概念:如此简单的目标函数和优化方法如何捕获如此线性关系,真是令人惊讶。递归神经网络(RecurrentNeuralNetworks)好了,现在我们已经得到了词向量,下一步就是将它们整合到递归神经网络模型中。RNN现在是NLP任务最常用的方法之一。RNN模型的优势之一是它可以有效地利用先前传递到网络中的信息。下图是RNN模型的简单示意图:在上图的最下方,输入x是词的词向量。每个向量x对应一个隐藏层的向量h。下图中的橙色框是一个输入单元:每个单元的隐藏层向量是当前输入词向量和之前隐藏层状态的函数。计算公式如下:仔细看会发现公式中有两个上标不同的权重矩阵Whx和Whh分别与输入词向量和最后的隐藏状态相乘。这两个权重矩阵由网络的所有单元共享。这就是RNN模型的症结所在。仔细想想这个过程,和传统的二层神经网络有很大的不同。在传统的两层神经网络中,每一层都有不同的权重矩阵(W1和W2),而在循环计算机网络中,整个序列共享相同的权重矩阵。具体到某个单元,它的输出值y是h和Ws的乘积,是另一个权重矩阵:我们再回顾一下RNN的优点。RNN与传统NN最大的区别在于RNN的输入是一个序列(这里是一系列的词)。CNN模型的输入只是单张图片,而RNN的输入可以是短句或5段文章。输入序列的顺序也会极大地影响训练效果。理想情况下,隐藏状态应该捕获过去的信息(历史输入内容)。门控循环单元(GatedRecurrentUnits)我们再介绍一下门控循环单元。这个门控单元的目的是为RNN模型提供一种更复杂的方法来计算隐藏层的状态。这种方法将使我们的模型能够保留更早以前的信息。为什么保持长期依赖是传统循环神经网络中的一个问题?因为在误差反向传播的过程中,梯度是沿着RNN模型由近到远反向传播的。如果初始梯度是一个很小的值(例如<0.25),那么在传播到第三或第四个模块(多级梯度乘法)时梯度几乎会消失,因此前面单元的隐藏状态无法得到更新。在传统的RNN模型中,隐藏状态向量的计算公式如下:而GRU则采用了另一种计算方式。计算过程分为三个部分:更新门、重置门和新的内存存储。两个门都是输入词向量和上一步隐藏状态的函数:其实最关键的区别是不同的门有不同的权值矩阵,在公式中用上标来区分。更新门的符号是Wz和Uz,重置门的符号是WT和UT。新内存的计算公式如下:公式中的空心点代表逐元素相乘(https://en.wikipedia.org/wiki/Hadamard_product_%28matrices%29)。仔细观察公式会发现,如果重置门单元的输出值接近于0,那么整个项的值也接近于0,相当于忽略了ht-1步的状态。此时,模型只考虑当前输入的词向量xt。h(t)的最终形式如下式所示:h(t)函数由三部分组成:updategate、resetgate和memorystore。当zt接近1时,新的隐藏状态ht几乎完全依赖于前一个状态,因为(1-zt)接近0,后项的乘积也接近0。zt接近于0。长短期记忆单元(LongShort-TermMemoryUnits)如果你已经了解了GRU的原理,那么你就可以轻松理解LSTM。LSTM也是由多个门控模块组成的:显然,LSTM引入了更多的信息。由于LSTM可以看作是GRU思想的延伸,笔者不打算做太深入的分析。如果读者想了解每个门和每个公式的来龙去脉,ChrisOlah写了一篇精彩的文章(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)。这是迄今为止介绍LSTM最精彩的教程,一定会帮助你理解每个单元的原理。LSTM和GRU的比较我们先来探究一下两者的相似之处。原作者认为,这两种模型都具有保留序列数据长期信息依赖性的特殊能力。长时信息是指两个单词或短语之间的距离,但它们之间的关系对于理解句子至关重要。LSTM和GRU都通过门控模块捕获或有选择地忽略这些依赖关系。两者的区别在于门的数量,GRU有两个门,LSTM有三个门。门的数量也会影响输入词之间的非线性关系,影响最终的计算结果。GRU也没有LSTM模型的记忆单元。在阅读论文之前,我想提醒大家,在NLP领域还有很多其他类型的深度学习模型。有时循环神经网络和卷积神经网络也用于NLP任务,但它们没有RNN广泛。是的,现在我们对深度学习在自然语言处理领域的应用有了清晰的认识,下面我们一起看几篇论文。NLP领域的方向很多(比如机器翻译、问答系统等),可供我们选择阅读的文献也很多。笔者选取了三个具有代表性的。MemoryNetworks(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)原作者入选的第一篇论文是问答领域非常有影响力的文章。由JasonWeston、SumitChopra和AntoineBordes撰写的这篇论文介绍了一类称为记忆网络的模型。直观的想法是,为了准确回答文本问题,我们需要以某种方式存储初始信息。如果问大家“RNN指的是什么”?仔细阅读了文章前半部分的读者就能回答出来。只是你可能要花几秒钟才能找到上一篇文章中的相关段落。我们不知道人脑执行这种行为的机制,但通常认为大脑中有一个区域存储这种信息。本文描述的内存网络的独特之处在于它有一个可以读写的关联内存区域。CNN模型、强化学习和传统的神经网络都没有这种记忆功能。也许是因为问答系统严重依赖长期上下文信息,例如跟踪事件的时间线。对于CNN和强化学习,它们通过训练不同的过滤器或状态到行为的映射关系,将“记忆”体现在权重矩阵中。乍一看,RNN和LSTM符合要求,但通常不能记住历史输入(对问答系统至关重要)。网络结构我们来看看网络是如何处理初始输入的。与大多数机器学习算法一样,此方法首先将输入映射到特征表示中。映射方法可以是词向量、成分标注或语法分析等。下一步根据特征表示I(x)更新记忆内容m,反馈新输入内容x引入的信息。我们可以把m看成是一个由若干mi组成的数组。每个独立的mi又可以被视为m的函数G,即特征表示I(x)及其自身。内存内容的更新是通过G功能完成的。第三步和第四步是读取内存信息,根据问题生成特征表示o,然后解码输出得到最终答案r。函数R可以是一个RNN模型,它将特征表示转换为我们人类可读的文本答案。对于第三步,我们希望O模块输出的特征表示是最符合问题的答案。接下来的问题就是将每个记忆单元一个一个地进行比较,并计算出它们之间的匹配分数。最后,使用argmax函数选择得分最高的项目(或项目)。计算分数的方式是将问题的嵌入向量乘以每个记忆单元的特征表示向量(详见论文https://arxiv.org/pdf/1410.3916v11.pdf)。这个过程类似于计算两个词向量之间的相似度。输出表示特征o被发送到RNN或LSTM模型以生成最终可读答案。整个训练过程属于监督学习,训练数据包括问题、原始语料和标注答案。目标函数如下图所示:更多相关信息请参考以下论文:End-to-EndMemoryNetworkshttps://arxiv.org/pdf/1503.08895v5.pdfDynamicMemoryNetworkshttps://arxiv.org/pdf/1506.07285v5.pdfDynamicCoattentionNetworkshttps://arxiv.org/pdf/1611.01604v2.pdfTreeLSTMModelforSentimentAnalysis下一篇论文(https://arxiv.org/pdf/1503.00075v3.pdf)主要内容是介绍情感分析的方法,分析一个短语是否包含积极或消极的情感。《心理学大辞典》认为:“情感是人对客观事物是否满足自己需要的态度体验。”LSTM是目前最常用的情感分析网络结构。这篇由KaiShengTai、RichardSocher和ChristopherManning撰写的论文介绍了一种将LSTM网络级联到非线性结构中的新方法。这种非线性排列的动机是自然语言的单词序列形成短语的特性。但是,单词的排列次序不同,所组成的词组的意思也不同,甚至与单个单词的意思完全相反。为了体现这一特点,由LSTM单元组成的网络必须以树状结构排列,不同的单元受其子节点的影响。树形LSTM与标准网络结构的区别之一在于,后者的隐藏状态是当前输入和上一步隐藏状态的函数,而前者的隐藏状态是当前输入及其子节点的隐藏状态。由于网络结构的变化,训练方式也发生了变化。详情请参考这篇文章(https://arxiv.org/pdf/1503.00075v3.pdf)。作者的重点是为什么这个模型比线性LSTM效果更好。基于树结构,每个单独单元的状态与其所有子节点的隐藏状态相关。这很重要,因为每个节点都可以不同地对待其子节点。在训练过程中,网络模型可以了解到某些特殊词(如“not”和“very”)对于整个句子的情感分析非常重要。如果模型能给这些节点更多的权重,最终的效果会更好。NeuralMachineTranslation作者选择的最后一篇论文(https://arxiv.org/pdf/1609.08144v2.pdf)是关于机器翻译的。这篇文章的作者是谷歌的机器学习专家JeffDean、GregCorrado、OrialVinyals等,本文介绍了支持谷歌翻译服务的基础系统。与谷歌之前使用的系统相比,该系统将翻译的平均错误率降低了60%。传统的自动翻译方法包括多种词组匹配方法。这种方法需要大量的语言领域知识,最终证明其设计过于脆弱,缺乏泛化能力。传统方法的问题之一是它试图逐段翻译输入的句子。事实证明,最有效的方法(即神经机器翻译技术)是一次翻译整个句子,这样翻译看起来更自然流畅。网络结构本文介绍了一个深度LSTM神经网络,包括8个编码和解码层,以实现端到端的训练过程。该系统可以分为三个部分:编码RNN、解码RNN和注意力模块。从宏观上看,编码器以向量的形式表示输入句子,解码器生成输出表示,注意力模块告诉解码器在解码阶段要关注哪部分内容(这是出处theideausingtheglobalcontextofthesentence):论文余下部分主要讨论了本系统大规模部署的挑战,包括计算资源消耗、延迟、高并发等。综上所述,作者相信未来,深度学习将在客服机器人、机器翻译、复杂的问答系统中发挥作用。特别感谢RichardSocher和斯坦福CS224D课程(http://cs224d.stanford.edu/index.html)老师的精彩讲座和幻灯片。
