直观比较四种NLP模型 - 神经网络,RNN,CNN,LSTM
文/ 阿里淘系 F(x) Team - 紫矜
NLP中使用的每种模型的差异有时令人难以把握,因为它们具有相似之处,并且通常设想使用新模型来克服以前模型的缺点。因此,本文将深入探讨每种模型的本质,并了解其优缺点。
在对模型如何工作有了基本了解之后,我们将在本文的第二部分中尝试NLP分类(情感分析)练习,并查看每个模型如何堆叠。希望到本文结尾,您将对最常见的NLP模型有一个高级的了解。
本文的内容主要基于斯坦福大学的CS224N课程,强烈推荐给对NLP感兴趣的每个人。每个部分还将提供与相关论文和文章的其他链接,供您深入研究该主题。
神经网络
拓展阅读:在此推荐 Michael Nelson 的书 Neural Networks and Deep Learning
原理
Feed-forward neural networks, 来源: 'A Primer on Neural Network Models for Natural Language Processing’.
以一个单词序列(sequence of words)作为输入(input),单词的数量是固定的,这称为固定窗口(fixed window)。
对于每个单词,查找单词嵌入(word embedding)以将单词转换为向量(vector),然后将单词向量连接起来以得到一个矩阵。
通过将连接词矩阵通过线性层(linear layer)和非线性函数(nonlinearity function)来获得隐藏层(hidden layer)。
通过将隐藏层置于另一个线性层和激活函数(activation function),如softmax或tanh,中,获得输出的分布概率(output distribution)。通过具有额外的隐藏层,模型可以学习输入单词因子之间的非线性交互作用。
神经网络的问题
固定窗口可能会太小。例如,考虑上面的句子。如果固定窗口输入了5个单词,那么我们将得出“我的日子开始了不起(my day started off terrific)”,而在句子的其余部分中忽略了上下文。
扩大固定窗口会使模型复杂化。如果我们扩大模型,则用于计算线性层的权重矩阵(weight matrix)也将扩大。如果您进行了冗长的复核(review)操作,那么您的窗口将永远不会足够大,无法容纳所有上下文。
由于每个单词的权重是独立的,因此每次将权重矩阵列中的一个调整为1个单词时,其他列均不会相应调整,这会使模型效率低下。这是一个问题,因为句子中的单词应该有共同点,而单独学习每个单词将不会利用此特性。
RNN(循环神经网络)
为了理解人类语言的顺序特性(sequential characteristic),研究人员构思了循环神经网络(RNN)以改进传统的神经网络。RNN的基本原理是,从左到右浏览每个单词向量,保留每个单词的数据,这样当我们到达最后一个单词时,我们仍然可以获得有关先前单词的信息。
原理
选择一个序列的词语(句子)作为输入。
查找每个词的嵌入(word embedding)以将单词转换为向量。与神经网络不同,RNN不会将所有单词向量连接到1个矩阵中,因为RNN的目的是分别从每个单词向量中吸收信息以获得顺序信息。
对于每个步骤(每个单词向量),我们都使用当前隐藏状态(乘以权重矩阵)和新单词向量中的信息来计算当前隐藏状态。实际上,当模型到达文本的最后一个单词时,我们将获得一个隐藏状态,其中包含来自先前隐藏状态(以及先前单词)的信息。
根据我们正在解决的问题,有几种计算输出的方法。例如,如果我们正在研究一种语言模型(给一个句子找到后面的直接单词),那么我们可以通过另一个线性层和激活函数来放置最后一个隐藏状态。在这种情况下,使用最后一个隐藏状态是有意义的,因为下一个单词可能与上一个单词最相关。但是如果我们正在进行情感分析,虽然我们可以使用最后的隐藏状态,一种更有效的方法是为所有先前的隐藏状态计算输出状态,并获得这些输出状态的平均值。使用所有先前隐藏状态的输出状态的基本原理是,可能在文本中的任何地方(不仅仅是从最后一个词开始)都暗示了总体的情绪。
与神经网络相比的优势
可以处理任何长度的输入,解决了神经网络的固定窗口大小的问题。
将相同的权重矩阵应用于每个输入,这是神经网络所面临的问题。通过具有相同的权重矩阵,在这方面,使用RNN优化权重矩阵更为有效。
对于任何长度的输入来说,模型大小都保持为常数。
从理论上讲,RNN仍会考虑许多在句子前部的单词,这将为模型提供整个文本的上下文。在我们进行电影评论的情感分析练习中,上下文将是非常重要的,评论者可能经常在单个评论中包含正面情绪“特殊效果太棒了”和负面句子“表演很糟糕”,因此该模型能够理解整个评论的背景至关重要。
RNN的问题
由于每个隐含状态在计算出先前的隐含状态之前无法计算,因此RNN计算速度很慢。与神经网络不同,RNN无法并行(parallel)计算,训练RNN模型会占用大量资源。
消失梯度问题:消失梯度问题是指较早的隐藏状态对最终隐藏状态的影响较小的现象,从而减弱了较早的单词对整个上下文的影响。这意味着,尽管来自较旧的隐藏状态的信息仍将继续传递到较新的隐藏状态,但在每个新的隐藏状态下,信息将变得越来越小。例如,如果第一个隐藏状态= [1],权重矩阵= [0.1],则第一个隐藏状态对第二个隐藏状态的影响将为[第一隐藏状态x权重矩阵] = [0.1]。在第三隐藏状态下,第一隐藏状态对第三隐藏状态的影响为[0.1 x 0.1] = [0.01]。这表明较旧的隐藏状态的影响将逐渐变小,直到影响不明显为止。可以使用链规则通过计算相对于任何隐藏状态的损耗梯度来从数学上推论消失的梯度问题。如果您有兴趣了解更多有关此内容的信息,Denny Britz的这篇文章将提供非常详细的解释。
为了解决这些问题,研究员们已经开发出了很多RNN的变体。在本文中,我们将讨论LSTM,并简要介绍双向RNN(bidireactional RNN),不过您也可以自行进一步研究更多示例,例如多层RNN(multi-layer RNN)和GRU。
LSTM(长短期记忆模型)
LSTM是对RNN消失梯度问题的回应解决方案。还记得RNN如何尝试保留先前单词中的信息吗? LSTM背后的原理是该机器将学习先前单词的重要性,从而我们不会丢失来自较早隐藏状态的信息。有关LSTM的详细指南,Colah对此的插图说明非常棒。
原理
选择一个序列的词语(句子)作为输入。
查找每个词的嵌入(word embedding)以将单词转换为向量。
对于每个步骤(wording embedding),我们从前一个状态中选择要忘记的信息(例如,前一个句子处于过去时态,而当前句子处于当前时态,那么我们“忘记”前一个句子处于过去时态的事实,因为这与当前这句话无关),从当前状态记住哪些信息。所有这些信息都存储在称为单元状态(cell state)的新状态中,单元状态的作用就是携带过去的信息,因为这些信息是应当被记住的。
每个步骤都具有隐藏状态,该状态从单元状态(cell state)获取信息来决定每个单词要输出什么。
与RNN相比的优势
LSTM可以保留句子前部的信息,因此提供了RNN的梯度消失问题。
问题
与RNN一样,LSTM不能解决RNN的并行化问题,因为必须先计算每个隐藏状态和单元状态,然后才能计算下一个隐藏状态和单元状态。这也意味着LSTM需要花费更长的时间来训练,并且需要更多的记忆(memory)。
到目前为止,RNN和LSTM都描述了一个方向:从左到右。这意味着对于诸如机器翻译之类的任务,我们缺少尚未看到的单词的上下文(主要为下文)。这推动了RNN和LSTM的另一个变体的衍生,我们称之为双向RNN或双向LSTM。由于它在理解上下文方面很有用,因此经常在论文和应用中看到双向LSTM。
为LSTM添加注意力层(attention layer)
本文的这一部分基于Google的 Attention is All You Need 论文和CMU、微软联合产出的论文 Hierarchical Attention Networks for Document Classification。
首先我们用一段从Attention is All You Need 中,解释注意力(attention)这个概念。
自我注意(self-attention),有时也称为内部注意(intra-attention),是一种与单个序列的不同位置相关的注意力机制,目的是计算序列的表示形式。
假设我们要将 “the table is red” 翻译成法语。注意,我们给原始句子中的每个单词一个注意力向量(attention vector),例如“ the”将具有注意力向量,“ table”将具有注意力向量,依此类推。在每个单词的注意力向量中,假设“ the”的注意力向量,我们在句子中有每个单词的元素,而注意力向量中的第n个元素表示第n个单词与单词“ the ”。例如,如果“ the”的注意力向量为[0.6、0.3、0.07、0.03],则“ the”与“ the”最相关(原始单词与其自身最相关)和“ red” ”最不相关。
由于我们的练习将基于情感分析(而不是翻译),因此我们将不涉及“注意”文件中描述的编码器-解码器机制。取而代之的是,让我们看一下Hierarchical的那篇论文,看看注意力如何适合我们在文本分类中的标准LSTM模型。
原理
进行 LSTM 的步骤 1-3,来为每一个词产出一个隐藏状态(hidden state)。
对于每个隐藏状态,我们将其送到神经网络的另一个隐藏层。这样可以同时计算所有隐藏状态,因此可以解决LSTM的并行化问题。
我们获得每个单词从0到1的归一化重要性。例如,在“I love this movie”中,“爱”对句子的含义最为重要,因此“爱”将被赋予更高的归一化重要性。
使用每个隐藏状态和归一化的重要性来计算句子向量,这是每个句子的“分数”。句子向量在此模型中非常重要,因为每个句子向量将在LSTM的另一层中使用,以找到文本的一般情绪,从而找到文本的分类.
与LSTM相比的优势
更好的性能:如在 Hierarchical 论文中指出的那样,使用 transformer 可以胜过以前的模型。由于每个单词的标准化重要性,很可能是这种情况。本文以“好”一词为例来说明词的重要性高度依赖于上下文。在评价中使用“好”一词并不能自动表示它是正面评价,因为在上下文中它可以用作“不好”。该模型能够强调重要句子中的重要单词。
CNN(卷积神经网络)
CNN通常用于图像处理中,但此架构已被证明可成功解决NLP问题,尤其是在文本分类中。与上述模型类似,CNN的工作方式是“获得最重要的单词”以对句子进行分类。