原文出处:Recurrent Neural Networks 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
课前小测
在前面的几节里,我们一直用这种方式处理文本:先取文本的丰富语义表示,再在嵌入(embedding)之上套一个简单的线性分类器。这种结构捕捉的是句子里所有词聚合起来的含义,却没有考虑词的顺序,因为对嵌入做聚合的那一步,已经把顺序信息从原始文本中抹掉了。这些模型无法刻画词序,所以处理不了更复杂或有歧义的任务,比如文本生成和问答。
要捕捉文本序列(sequence)的含义,得换一种神经网络结构,叫循环神经网络(Recurrent Neural Network,RNN)。在 RNN 里,我们把句子一个符号一个符号地送进网络,网络产生某种状态,这个状态再连同下一个符号一起传回网络。
给定由词元(token)组成的输入序列 X0,...,Xn,RNN 会展开成一串神经网络块,并通过反向传播端到端地训练这一整串。每个网络块接收一对 (Xi,Si) 作为输入,产出 Si+1。最终状态 Sn(也就是输出 Yn)进入一个线性分类器得到结果。所有网络块共享同一套权重,在一次反向传播中端到端地训练。
因为状态向量 S0,...,Sn 在网络中逐层传递,网络就能学到词与词之间的序列依赖。举例来说,当 not 这个词出现在序列中某个位置时,网络可以学会去否定状态向量里的某些元素,从而表达否定含义。
由于 RNN 各个块的权重是共享的,展开后的网络可以等价地画成一个块,外面套一条循环反馈回路:把网络的输出状态重新送回输入端。
RNN 单元的内部结构
我们来看看一个简单的 RNN 单元是怎么组织的。它接收前一个状态 Si-1 和当前符号 Xi 作为输入,要产出输出状态 Si(有时我们也关心另一个输出 Yi,比如在生成式网络里就是这样)。
一个简单的 RNN 单元内部有两个权重矩阵:一个变换输入符号(记作 W),一个变换输入状态(记作 H)。这时网络的输出按 σ(W×Xi+H×Si-1+b) 计算,其中 σ 是激活函数,b 是附加的偏置。
很多情况下,输入词元在进入 RNN 之前会先过一层嵌入层,用来降低维度。这时如果输入向量的维度是 emb_size、状态向量的维度是 hid_size,那么 W 的大小就是 emb_size×hid_size,H 的大小就是 hid_size×hid_size。
长短期记忆(LSTM)
经典 RNN 的主要问题之一,是所谓的梯度消失。RNN 是在一次反向传播里端到端训练的,误差很难传回网络靠前的层,于是网络学不到相距较远的词元之间的关联。规避这个问题的一个办法,是用所谓的门来做显式的状态管理。这类结构里有两种知名架构:长短期记忆(Long Short Term Memory,LSTM)和门控循环单元(Gated Relay Unit,GRU)。
LSTM 网络的组织方式和 RNN 类似,但层与层之间传递的状态有两个:真实状态 C 和隐藏向量 H。在每个单元里,隐藏向量 Hi 与输入 Xi 拼接在一起,共同通过门来控制状态 C 发生什么变化。每扇门都是一个带 sigmoid 激活的神经网络(输出在 [0,1] 区间),与状态向量相乘时,可以把它看成按位掩码。门有下面几种:
- 遗忘门(forget gate)接收隐藏向量,决定向量 C 中哪些分量需要被忘掉、哪些需要原样传递。
- 输入门(input gate)从输入向量和隐藏向量中取一部分信息,写入状态。
- 输出门(output gate)先通过一个带 tanh 激活的线性层变换状态,再用隐藏向量 Hi 挑选其中一些分量,产出新的状态 Ci+1。
状态 C 的各个分量可以理解为一些能打开、能关闭的标记。比如,当我们在序列中遇到名字 Alice,可能想假定它指的是女性角色,就把"句子里有阴性名词"这个标记在状态里打开。再遇到 and Tom 这样的短语时,就把"句子里有复数名词"的标记打开。这样通过操作状态,理论上就能追踪句子各部分的语法属性。
想弄明白 LSTM 内部原理,Christopher Olah 的这篇Understanding LSTM Networks 是很好的材料。
双向与多层 RNN
上面讨论的循环网络都只朝一个方向运行:从序列开头走到结尾。这看起来很自然,跟我们阅读、听话的方式一致。不过很多实际场景里,我们对输入序列是随机访问的,这时候让循环计算朝两个方向各跑一遍,就更合理。这样的网络叫双向 RNN。处理双向网络时,我们需要两个隐藏状态向量,一个方向对应一个。
不管是单向还是双向,循环网络捕捉的是序列中的某些模式,可以把它们存进状态向量,也可以传向输出。和卷积网络一样,我们可以在第一层循环层之上再叠一层循环层,用第一层提取的低层模式去构建更高层的模式。这就引出了多层 RNN 的概念:由两个或更多循环网络组成,前一层的输出作为输入传给下一层。
练习:词嵌入
请在以下笔记本中继续学习:
小结
这一单元我们看到了 RNN 可以用于序列分类。实际上,它还能处理多得多的任务,比如文本生成、机器翻译等等。下一单元我们就来讨论这些任务。
挑战
阅读一些关于 LSTM 的文献,思考它们的应用:
- Grid Long Short-Term Memory
- Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
课后小测
复习与自学
- Understanding LSTM Networks by Christopher Olah.