liqing 2019-02-28
循环神经网络(RNN)的思路是处理序列信息。「循环」表示 RNN 模型对序列中的每一个实例都执行同样的任务,从而使输出依赖于之前的计算和结果。通常,RNN 通过将 token 挨个输入到循环单元中,来生成表示序列的固定大小向量。一定程度上,RNN 对之前的计算有「记忆」,并在当前的处理中使用对之前的记忆。该模板天然适合很多 NLP 任务,如语言建模、机器翻译、语音识别、图像字幕生成。因此近年来,RNN 在 NLP 任务中逐渐流行。
对 RNN 的需求
这部分将分析支持 RNN 在大量 NLP 任务中广泛使用的基本因素。鉴于 RNN 通过建模序列中的单元来处理序列,它能够捕获到语言中的内在序列本质,序列中的单元是字符、单词甚至句子。语言中的单词基于之前的单词形成语义,一个简单的示例是「dog」和「hot dog」。RNN 非常适合建模语言和类似序列建模任务中的此类语境依赖,这使得大量研究者在这些领域中使用 RNN,频率多于 CNN。
RNN 适合序列建模任务的另一个因素是它能够建模不定长文本,包括非常长的句子、段落甚至文档。与 CNN 不同,RNN 的计算步灵活,从而提供更好的建模能力,为捕获无限上下文创造了可能。这种处理任意长度输入的能力是使用 RNN 的主要研究的卖点之一。
很多 NLP 任务要求对整个句子进行语义建模。这需要在固定维度超空间中创建句子的大意。RNN 对句子的总结能力使得它们在机器翻译等任务中得到更多应用,机器翻译任务中整个句子被总结为固定向量,然后映射回不定长目标序列。
RNN 还对执行时间分布式联合处理(time distributed joint processing)提供网络支持,大部分序列标注任务(如词性标注)属于该领域。具体用例包括多标签文本分类、多模态情感分析等应用。
上文介绍了研究人员偏好使用 RNN 的几个主要因素。然而,就此认为 RNN 优于其他深度网络则大错特错。近期,多项研究就 CNN 优于 RNN 提出了证据。甚至在 RNN 适合的语言建模等任务中,CNN 的性能与 RNN 相当。CNN 与 RNN 在建模句子时的目标函数不同。RNN 尝试建模任意长度的句子和无限的上下文,而 CNN 尝试提取最重要的 n-gram。尽管研究证明 CNN 是捕捉 n-gram 特征的有效方式,这在特定长度的句子分类任务中差不多足够了,但 CNN 对词序的敏感度有限,容易限于局部信息,忽略长期依赖。
《Comparative Study of CNN and RNN for Natural Language Processing》对 CNN 和 RNN 的性能提供了有趣的见解。研究人员在多项 NLP 任务(包括情感分类、问答和词性标注)上测试后,发现没有明确的赢家:二者的性能依赖于任务所需的全局语义。
下面,我们讨论了文献中广泛使用的一些 RNN 模型。
RNN 模型
1. 简单 RNN
在 NLP 中,RNN 主要基于 Elman 网络,最初是三层网络。图 9 展示了一个较通用的 RNN,它按时间展开以适应整个序列。图中 x_t 作为网络在时间步 t 处的输入,s_t 表示在时间步 t 处的隐藏状态。s_t 的计算公式如下:
因此,s_t 的计算基于当前输入和之前时间步的隐藏状态。函数 f 用来做非线性变换,如 tanh、ReLU,U、V、W 表示在不同时间上共享的权重。在 NLP 任务中,x_t 通常由 one-hot 编码或嵌入组成。它们还可以是文本内容的抽象表征。o_t 表示网络输出,通常也是非线性的,尤其是当网络下游还有其他层的时候。
图 9:简单 RNN 网络(图源:https://www.nature.com/articles/nature14539)
RNN 的隐藏状态通常被认为是其最重要的元素。如前所述,它被视为 RNN 的记忆元素,从其他时间步中累积信息。但是,在实践中,这些简单 RNN 网络会遇到梯度消失问题,使学习和调整网络之前层的参数变得非常困难。
该局限被很多网络解决,如长短期记忆(LSTM)、门控循环单元(GRU)和残差网络(ResNet),前两个是 NLP 应用中广泛使用的 RNN 变体。
2. 长短期记忆(LSTM)
LSTM 比简单 RNN 多了『遗忘』门,其独特机制帮助该网络克服了梯度消失和梯度爆炸问题。
图 10:LSTM 和 GRU 门图示(图源:https://arxiv.org/abs/1412.3555)
与原版 RNN 不同,LSTM 允许误差通过无限数量的时间步进行反向传播。它包含三个门:输入门、遗忘门和输出门,并通过结合这三个门来计算隐藏状态,如下面的公式所示:
3. 门控循环单元(GRU)
另一个门控 RNN 变体是 GRU,复杂度更小,其在大部分任务中的实验性能与 LSTM 类似。GRU 包括两个门:重置门和更新门,并像没有记忆单元的 LSTM 那样处理信息流。因此,GRU 不加控制地暴露出所有的隐藏内容。由于 GRU 的复杂度较低,它比 LSTM 更加高效。其工作原理如下:
研究者通常面临选择合适门控 RNN 的难题,这个问题同样困扰 NLP 领域开发者。纵观历史,大部分对 RNN 变体的选择都是启发式的。《Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling》对前面三种 RNN 变体进行了对比评估,不过评估不是在 NLP 任务上进行的,而是复调音乐建模和语音信号建模相关任务。他们的评估结果明确表明门控单元(LSTM 和 GRU)优于传统的简单 RNN(实验中用的是 tanh 激活函数),如下图所示。但是,他们对这两种门控单元哪个更好没有定论。其他研究也注意到了这一点,因此人们在二者之间作出选择时通常利用算力等其他因素。
图 11:不同 RNN 变体在训练集和验证集上的学习曲线,上图 x 轴表示迭代次数,下图 x 轴表示挂钟时间,y 轴表示模型的负对数似然(以对数标尺显示)。
应用
1. 用于单词级别分类任务的 RNN
之前,RNN 经常出现在单词级别的分类任务中。其中的很多应用到现在仍然是所在任务中的最优结果。论文《Neural Architectures for Named Entity Recognition》提出 LSTM+CRF 架构。它使用双向 LSTM 解决命名实体识别问题,该网络捕捉目标单词周围的任意长度上下文信息(缓解了固定窗口大小的约束),从而生成两个固定大小的向量,再在向量之上构建另一个全连接层。最终的实体标注部分使用的是 CRF 层。
RNN 在语言建模任务上也极大地改善了基于 count statistics 的传统方法。该领域的开创性研究是 Alex Graves 2013 年的研究《Generating Sequences With Recurrent Neural Networks》,介绍了 RNN 能够有效建模具备长距离语境结构的复杂序列。该研究首次将 RNN 的应用扩展到 NLP 以外。之后,Sundermeyer 等人的研究《From Feedforward to Recurrent LSTM Neural Networks for Language Modeling》对比了在单词预测任务中用 RNN 替换前馈神经网络获得的收益。该研究提出一种典型的神经网络层级架构,其中前馈神经网络比基于 count 的传统语言模型有较大改善,RNN 效果更好,LSTM 的效果又有改进。该研究的一个重点是他们的结论可应用于多种其他任务,如统计机器翻译。
2. 用于句子级别分类任务的 RNN
Xin Wang 等人 2015 年的研究《Predicting Polarities of Tweets by Composing Word Embeddings with Long Short-Term Memory》提出使用 LSTM 编码整篇推文(tweet),用 LSTM 的隐藏状态预测情感极性。这种简单的策略被证明与 Nal Kalchbrenner 等人 2014 年的研究《A Convolutional Neural Network for Modelling Sentences》提出的较复杂 DCNN 结构性能相当,DCNN 旨在使 CNN 模型具备捕捉长期依赖的能力。在一个研究否定词组(negation phrase)的特殊案例中,Xin Wang 等人展示了 LSTM 门的动态可以捕捉单词 not 的反转效应。
与 CNN 类似,RNN 的隐藏状态也可用于文本之间的语义匹配。在对话系统中,Lowe 等人 2015 年的研究《The Ubuntu Dialogue Corpus: A Large Dataset for Research in Unstructured Multi-Turn Dialogue Systems》提出用 Dual-LSTM 匹配信息和候选回复,Dual-LSTM 将二者编码为固定大小的向量,然后衡量它们的内积用于对候选回复进行排序。
3. 用于生成语言的 RNN
NLP 领域中的一大难题是生成自然语言,而这是 RNN 另一个恰当的应用。基于文本或视觉数据,深度 LSTM 在机器翻译、图像字幕生成等任务中能够生成合理的任务特定文本。在这些案例中,RNN 作为解码器。
在 Ilya Sutskever 等人 2014 年的研究《Sequence to Sequence Learning with Neural Networks》中,作者提出了一种通用深度 LSTM 编码器-解码器框架,可以实现序列之间的映射。使用一个 LSTM 将源序列编码为定长向量,源序列可以是机器翻译任务中的源语言、问答任务中的问题或对话系统中的待回复信息。然后将该向量作为另一个 LSTM(即解码器)的初始状态。在推断过程中,解码器逐个生成 token,同时使用最后生成的 token 更新隐藏状态。束搜索通常用于近似最优序列。
该研究使用了一个 4 层 LSTM 在机器翻译任务上进行端到端实验,结果颇具竞争力。《A Neural Conversational Model》使用了同样的编码器-解码器框架来生成开放域的有趣回复。使用 LSTM 解码器处理额外信号从而获取某种效果现在是一种普遍做法了。《A Persona-Based Neural Conversation Model》提出用解码器处理恒定人物向量(constant persona vector),该向量捕捉单个说话人的个人信息。在上述案例中,语言生成主要基于表示文本输入的语义向量。类似的框架还可用于基于图像的语言生成,使用视觉特征作为 LSTM 解码器的初始状态(图 12)。
视觉 QA 是另一种任务,需要基于文本和视觉线索生成语言。2015 年的论文《Ask Your Neurons: A Neural-based Approach to Answering Questions about Images》是首个提供端到端深度学习解决方案的研究,他们使用 CNN 建模输入图像、LSTM 建模文本,从而预测答案(一组单词)。
图 12:结合 LSTM 解码器和 CNN 图像嵌入器,生成图像字幕(图源:https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Vinyals_Show_and_Tell_2015_CVPR_paper.pdf)
《Ask Me Anything: Dynamic Memory Networks for Natural Language Processing》提出动态记忆网络(dynamic memory network,DMN)来解决这个问题。其思路是重复关注输入文本和图像,以使每次迭代中的信息都得到改善。注意力网络用于关注输入文本词组。
图 13:神经图像 QA(图源:https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Malinowski_Ask_Your_Neurons_ICCV_2015_paper.pdf)
注意力机制
传统编码器-解码器框架的一个潜在问题是:有时编码器会强制编码可能与目前任务不完全相关的信息。这个问题在输入过长或信息量过大时也会出现,选择性编码是不可能的。
例如,文本摘要任务可以被视为序列到序列的学习问题,其中输入是原始文本,输出是压缩文本。直观上看,让固定大小向量编码长文本中的全部信息是不切实际的。类似的问题在机器翻译任务中也有出现。
在文本摘要和机器翻译等任务中,输入文本和输出文本之间存在某种对齐,这意味着每个 token 生成步都与输入文本的某个部分高度相关。这启发了注意力机制。该机制尝试通过让解码器回溯到输入序列来缓解上述问题。具体在解码过程中,除了最后的隐藏状态和生成 token 以外,解码器还需要处理基于输入隐藏状态序列计算出的语境向量。
《Neural Machine Translation by Jointly Learning to Align and Translate》首次将注意力机制应用到机器翻译任务,尤其改进了在长序列上的性能。该论文中,关注输入隐藏状态序列的注意力信号由解码器最后的隐藏状态的多层感知机决定。通过在每个解码步中可视化输入序列的注意力信号,可以获得源语言和目标语言之间的清晰对齐(图 14)。
图 14:词对齐矩阵(图源:https://arxiv.org/abs/1409.0473)
类似的方法也被应用到摘要任务中,《A Neural Attention Model for Abstractive Sentence Summarization》用注意力机制处理输入句子从而得到摘要中的每个输出单词。作者执行 abstractive summarization,它与 extractive summarization 不同,但可以扩展到具备最小语言输入的大型数据。
在图像字幕生成任务中,《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》用 LSTM 解码器在每个解码步中处理输入图像的不同部分。注意力信号由之前的隐藏状态和 CNN 特征决定。《Grammar as a Foreign Language》将解析树线性化,从而将句法解析问题作为序列到序列学习任务。该研究证明注意力机制更加数据高效。指回输入序列的进一步步骤是:在特定条件下,直接将输入中的单词或子序列复制到输出序列,这在对话生成和文本摘要等任务中也有用。解码过程中的每个时间步可以选择复制还是生成。(参见:新闻太长不想看?深度解析 MetaMind 文本摘要新研究)
在基于 aspect 的情感分析中,《Attention-based LSTM for Aspect-level Sentiment Classification》提出基于注意力的解决方案,使用 aspect 嵌入为分类提供额外支持(图 15)。注意力模块选择性关注句子的某些区域,这会影响 aspect 的分类。图 16 中,对于 a 中的 aspect「service」,注意力模块动态聚焦词组「fastest delivery times」,b 中对于 aspect「food」,注意力在整个句子中识别了多个关键点,包括「tasteless」和「too sweet」。近期,《Targeted Aspect-Based Sentiment Analysis via Embedding Commonsense Knowledge into an Attentive LSTM》用层级注意力机制(包含目标级注意力和句子级注意力)增强 LSTM,利用常识处理基于目标 aspect 的情感分析。
图 15:使用注意力机制进行 aspect 分类(图源:https://aclanthology.coli.uni-saarland.de/papers/D16-1058/d16-1058)
图 16:对于特定 aspect,注意力模块对句子的关注点(图源:https://aclanthology.coli.uni-saarland.de/papers/D16-1058/d16-1058)
另一方面,《Aspect Level Sentiment Classification with Deep Memory Network》采用基于记忆网络(也叫 MemNet)的解决方案,使用多跳注意力(multiple-hop attention)。记忆网络上的多个注意力计算层可以改善对记忆中大部分信息区域的查找,从而有助于分类。这一研究目前仍是该领域的当前最优结果。
由于注意力模块应用的直观性,NLP 研究者和开发者在越来越多的应用中积极使用注意力模块。
并行化注意力:Transformer
CNN 和 RNN 在包括编码器-解码器架构在内的序列传导应用中非常关键。注意力机制可以进一步提升这些模型的性能。但是,这些架构面临的一个瓶颈是编码步中的序列处理。为了解决该问题,《Attention Is All You Need》提出了 Transformer,它完全去除了编码步中的循环和卷积,仅依赖注意力机制来捕捉输入和输出之间的全局关系。因此,整个架构更加并行化,在翻译、解析等任务上训练得到积极结果所需的时间也更少。
图 17:multi-head 注意力(图源:https://arxiv.org/abs/1706.03762)
Transformer 的编码器和解码器部分都有一些堆叠层。每个层有两个由 multi-head 注意力层组成的子层(图 17),之后是 position-wise 前馈网络。对于查询集 Q、关键 K 和值 V,multi-head 注意力模块执行注意力 h 次,计算公式如下:
此处,W_i^{[.]} 和 W^o 是投影参数。该模型融合了残差连接、层归一化、dropout、位置编码等技术,在英语-德语、英语-法语翻译和 constituency parsing 中获得了当前最优结果。