2.3 RNN
在之前介绍的CNN的网络结构中,层与层之间是有连接的,但是每层之间的节点是无连接的,这样会造成网络结构对一些问题无能为力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词之间并不是独立无关的。RNN(Recurrent Neuron Network)是一种对序列数据建模的神经网络,即一个序列当前的输出与之前的输出也有关。具体的表现形式为网络会对上一步的计算信息进行记忆,并应用于当前输出的计算中,对应也可以认为是隐藏层之间的节点不再是无连接而是有连接的。网络结构形式详见后续章节。
2.3.1 RNN结构
RNN的形式非常灵活,下面将介绍RNN的网络结构形式和对应的应用场景。
以下几种形式中one的意思并非指长度为一,而是指数据的长度是固定的,而many则表示长度是变长的。
▼ 一对一形式(One to One):输入和输出是定长的。
例如,文本分类问题,每个文章被转换为向量,计算每个文章所属每个类别的概率。文章向量的特征数和分类数都是确定的,虽然大于一,我们也可以认为是One to One的形式。
▼ 多对一形式(Many to One):整个序列只有一个输出,如情感分析等。
如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等。
▼ 一对多形式(One to Many):一个输入产出一个序列,常用于Seq2Seq的解码阶段。
❍从图像生成文字(image caption),此时输入的x就是图像的特征,而输出的y序列就是一段句子。
❍从类别生成语音或音乐等。
❍单词释义等。
▼ 多对多形式(Many to Many):一个序列对应一个序列。
这种结构又称为Encoder-Decoder模型,也可以称为Seq2Seq模型。
由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此其应用范围非常广泛,具体如下。
❍机器翻译:Encoder-Decoder的最经典应用,事实上这一结构就是由机器翻译领域最先提出的。
❍文本摘要:输入是一段文本序列,输出是这段文本序列的摘要序列。
❍阅读理解:将输入的文章和问题分别编码,再对其进行解码得到问题的答案。
❍语音识别:输入是语音信号序列,输出是文字序列。
接下来我们将以基础的RNN结构讲解其网络结构和训练的过程。
2.3.2 基本结构与前向传播
RNN的基本网络结构如图2-19所示,箭头右侧是左侧网络结构展开的实例。例如,如果我们输入RNN模型的是包含10个单词的句子,那么按照图2-18的展开方式,将会展开为10层的神经网络,每个单词会对应一个层。
图2-18 RNN基本结构示例
图2-19 RNN BPTT求导
▼ xt代表在t时刻的输入。
▼ st是在t时刻的隐藏状态。代表网络不断传递的记忆。st基于之前隐藏层的状态和当前的输入,其计算公式为:
通常使用tanh或ReLU代表f函数。第一个隐藏层的状态输入,默认可以设置为0。
▼ Ot是t时刻的输出。其计算公式为:
例如,RNN模型每个时刻的输入xt可以是一个单词映射成的词向量,输出ot是一个预测所属词概率的向量。
相比较于其他深度学习的网络结构,在每层都使用不同的参数,一个RNN模型共享每一步的(U,V,W)参数,这样就减少了大量要学习的参数,每一步都相当于用同一套参数拟合不同的输入。
2.3.3 BPTT
我们将2.3.3节中的输出符号o换为。RNN的计算公式为计算隐藏层状态S和输出y:
与其他深度学习和机器学习模型一样,我们还需要定义损失函数。这里使用交叉熵(Cross Entropy Loss),公式如下所示:
损失函数公式E中的yt是t时刻输出的真实值,是t时刻输出的预测值。一般情况下,将一个序列和其输出作为一个样本,损失函数整体需要累积这个样本所有时刻的误差,Et代表t时刻的误差,E代表这个序列的误差。
图2-19所示的为RNN BPTT求导过程。
构建好损失函数之后,我们就可以通过梯度下降的方法求解最优参数U、V和W。在每个时间点,对每个训练样本聚合所有时间点的更新梯度,公式如下:
之后,通过之前介绍的反向传播过程中使用到的链式法则进行梯度的计算。后续的例子中将使用E3为例进行介绍。
回归前向传播公式:
我们以对W求导为例。首先记录下类似上面链式求导的例子,如图2-21所示:
式子中S3=tanh(Uxt+Ws2)依赖s2, s 2又依赖W和s1,依次类推。所以对W求导的过程不能将s2当作常数对待,需要继续使用链式法则:
因为循环神经网络每一时刻的计算都要使用W,所以会将从k=0的时刻到k=2的时刻之间所产生的梯度全部进行累加。同理U和V的计算方式与W类似。
从计算过程来看,BPTT与标准反向传播算法非常类似。区别在于RNN在每层计算过程中,参数W、U、V都是共享的,所以每层所得到的W需要累加到一起。而传统的反向传播求导的计算过程中,每一层的参数都是独立的,所以迭代求解参数的过程也是独立的。
2.3.4 LSTM
LSTM的作用表现在如下两个方面。
▼ 模型上:长短时记忆。
▼ 计算上:梯度消失(vanishing gradient)问题,这个问题导致了LSTM和GRU的产生。
由于RNN模型是在序列数据上进行训练的,为了能够记忆这种类型的数据,可以理解为类似人对之前的事情产生了记忆。但是由于RNN的设计结构,只对离得近的记忆更多,对较远的序列因素则记忆较差。
1. LSTM基本结构
从网络结构上来看,因为输入在权重参数和激活函数的层层作用下,容易在传导过程中发生梯度消失或梯度爆炸的问题,造成之前的记忆指数级被遗忘,从而造成信息很难在很长的结构中进行传递的问题。这种长期依赖问题对于自然语言处理等场景来说是需要处理的问题。
为了解决这个问题,研究人员设计了LSTM(Long Short Term Memory Networks),也称为长期记忆网络。
如图2-20~图2-22所示,我们将2.3.3节的隐藏层状态s更换为h。
图2-20 RNN基本网络结构
图2-21 LSTM网络结构
图2-22 LSTM符号说明
LSTM相比较于传统RNN,会多出三个门控制器,输入门(Input Gate)、输出门(Output Gate)和遗忘门(Forget Gate)。三种门控制器的结构相同,由Sigmoid函数(图中α符号)和点积运算(图中×符号)构成。Sigmoid函数的取值范围为0到1,代表能通过门的信息比例。
2.长期记忆单元
对于基本的RNN,每一个时刻的状态中(如ht),其实包含当前的输入和原有记忆的信息。但是这样做会由于记忆信息随着时间步的推进而出现指数级的衰减问题,因此LSTM通过增加长期记忆单元Ct来保存长期记忆的信息,如图2-23中的Ct。
图2-23 LSTM长期记忆单元
其中ft和it分别代表遗忘门(图2-24)和输入门(图2-25)。
图2-24 LSTM长期记忆单元与遗忘门
图2-25 LSTM长期记忆单元与输入门
如图2-24所示,每一个时刻,遗忘门用于控制上一时刻记忆的遗忘程度。
如图2-25所示,每一个时刻,输入门用于控制新记忆写入长期记忆的程度。其中tanh函数取值范围为[-1,1]。
如图2-26所示,长期记忆单元的整体更新可以合并为如下公式的整体,由遗忘门和输入门共同作用产生。
图2-26 LSTM长期记忆单元更新与输出
3.短期记忆单元
对于短期记忆ht的更新如图2-27所示,其中Ot表示输出门,它控制着短期记忆如何受长期记忆影响。
图2-27 LSTM短期记忆单元与输出门
从网络结构上进行观察,LSTM对基础RNN的优化具体体现在通过门控制器增加了对不同时刻的权重的控制,通过跨层权重的连接减少了梯度消失的影响。这与CNN中的跳层连接的思想也很相近。
2.3.5 RNN拓展
根据应用的需求,研究人员基于基本的RNN又设计出了新的RNN变种,例如双向循环神经网络、注意力(Attention)机制、深度循环网络等。
1.双向RNN
由于在某些自然语言处理的场景下,时刻t的输出,不仅会依赖于前面的上下文,还可能会依赖于后面的上下文。例如,预测一个句子中缺失的单词,也希望能够参考前面和后面的上下文,综合考虑进行预测。
如图2-28所示,双向RNN有两个隐藏层RNN,输出结果是基于这两层的隐藏层输出综合计算出来的。
图2-28 双向RNN
2.深度双向RNN
如图2-29所示,深度双向RNN与双向RNN非常相近,相当于多层的双向RNN叠加起来,这样就使得模型具有更强的拟合能力,但是需要更长的训练时间和训练数据才能让模型收敛。
图2-29 深度双向RNN
3.注意力机制
注意力机制(Attention Mechanism)可以提升基于RNN中Encoder-Decoder模型的效果。注意力机制由于其较好的效果,广泛应用于机器翻译、语音识别、图像标注等领域。
注意力机制的思想可以参考这篇具有代表性的论文《Recurrent Models of Visual Attention》。人在观察图像时倾向于根据需求将注意力集中到图像的特定部分。而且人类会根据之前观察的图像学习到未来要观察图像时注意力应该集中的位置。可以将这部分经验融入模型中,让模型能够有针对性地学习到对预测有帮助的重要因素。
注意力机制为每个词赋予不同的权重,使神经网络模型的学习变得更加灵活,同时Attention本身也可以作为一种对齐关系,解释翻译输入与输出句子之间的对齐关系。