AI机动队
首发于AI机动队
循环神经网络RNN——深度学习第十章

循环神经网络RNN——深度学习第十章

继续深度学习花书的读书笔记总结。这一章主要介绍了循环神经网络(Recurrent neural network, 简称RNN),主要用来处理序列数据,比如一些文字序列或时序数据。对于这类数据,基本的前馈神经网络会对每一个输入的特征都训练一个单独的参数,而不能很好的进行参数的共享,而RNN就可以通过对不同时间点的特征共享参数而更容易的进行训练,泛化效果也更好。上一章卷积神经网络——深度学习第九章总结过CNN也可以实现参数共享,RNN与其不同的地方在于其每一点的输出还依赖于之前的结果。

毅种循环

对于动态系统,我们常常可以用状态机(state machine)来模拟 s^{(t)}=f(s^{(t-1)};\theta) ,RNN中的recurrent也得名于 t 时刻的状态依赖于 t-1 时刻的状态。当然,我们可以把该式不断的展开直至可以用对于初始状态 s^{(1)} 的不断的函数叠加来表示,如图所示,我们可以将计算图展开(unfold)如下

如果我们对于该系统由外部信号驱动,则可以表示为 s^{(t)}=f(s^{(t-1)},x^{(t)};\theta) 。RNN就采取的类似的循环公式,只不过用hidden units来代表状态,即 h^{(t)}=f(h^{(t-1)},x^{(t)};\theta) 。同样的,可以将其计算图展开如下,展开图可以有助于理解信息传播方向和梯度的反向传播方向:

我们可以将 h^{(t)} 看做是之前的输入向量序列 (x^{(t)},x^{(t-1)},...,x^{(1)}) 的一种有损的表示。根据不同的需要,我们可以控制损失的精度,例如对于一些语言模型,可能只有附近的文字信息比较重要,我们就不需要存储所有t之前的序列信息。

了解了这些基本概念,我们就可以构建RNN了,最基本的结构如下图所示

即在每一个时间点都产生输出,并且hidden units之间有循环链接,图中 y 为该点的真实目标值, L 为模型预测的输出值 o 与真实值 y 间的损失函数如交叉熵,总的损失为各 L^{(t)} 之和。由于该结构hidden units间有循环链接,计算时我们需要顺序计算,而不能进行并行计算,所以训练过程较为缓慢。而且该模型需要输入与输出序列长度相同。

假如我们损失一点模型普适性,去掉hidden units之间的循环链接,而是建立前一时间点真实目标值与当前hidden unit的链接,则当前点hidden unit并不依赖于前一点hidden unit计算结束,则我们可以有效地将训练过程并行化,当然 y^{(t-1)} 并不能完全代表 h^{(t-1)} 所包含的所有信息,所以在提高训练效率的同时降低了一些模型的普适性,这一方法叫做teacher forcing,其计算图可作如下展开:

还有一种常见的结构是将一个向量而不是向量序列作为输入,输出一个序列,这经常用在image caption中,即给定一个图像,我们常常用CNN得到其特征向量,再将这个特征向量作为输入,得到描述该图片的输出文字序列。这种结构如下图所示:

由于之前基本的RNN结构要求输入与输出同等长度,而实际应用如语音识别、机器翻译等往往输入输出的长度不同,为了解决这一问题我们可以把上述两种结构结合起来,即先用一个RNN将输入序列转化为一个向量,通常是其最终的隐藏态的一个函数,这一过程称作encoder或reader,然后再将这一定长的向量作为输入,利用上图所示结构产生序列输出,这一过程称作decoder或reader,结合起来就是经典的encoder-decoder或称作sequence-to-sequence结构。注意经过这两步,输出和输入序列不再需要满足长度相同的条件,如下图所示 n_{y}n_{x} 可取不同长度:

LSTM与GRU

一个需要注意的问题是,在RNN中,由于相同的权重矩阵被不断的在hidden state上叠加,梯度会随着循环次数的增加呈指数的衰减或爆炸,造成模型无法有效的学习long-term的相互作用。即我们每次循环可用 h^{(t)} = Wh^{(t-1)} 表示,假设对权重矩阵 W 可做本征分解 W=Q\Lambda Q^T ,则 h^{(t)} = Q\Lambda ^t Q h^{(0)} ,为本征值的t次方的形式,对于本征值小于1的方向会衰减至零而本征值大于1的方向爆炸。为了解决这种长程作用的问题,一系列gated RNN模型被提出,其中比较常用的是LSTM和GRU。

LSTM(Long short-term memory)基本单元结构如下图所示,在hidden state h_t 的基础上又添加了一个新的cell state c_t ,旨在长程有效的传递信息。同时引入了四个作用不同的gate:1) f代表forget gate,经过sigmoid函数,其大小在(0,1]之间,代表了我们会保留之前的cell state的多少信息。2) i代表input gate,同样的经过sigmoid函数大小在(0,1]之间,代表对于这个cell,有哪些值需要更新。3)g经过tanh函数,其大小在(-1,1)之间,代表了这些需要更新的值得具体的大小,与input gate做元素积则可求出cell state需要update的值。4)o代表output gate,即需要将哪些c_t的值输出到hidden state h_t。通过这一结构,在一个单元中,我们可以合理的保存某些前一个单元携带的长程信息,以及本单元的一些更新信息,而不是简单的权重矩阵的乘积,从而解决了长程作用的问题。

GRU(gated recurrent unit)可以看做是将LSTM中的forget gate和input gate合并成了一个update gate,即下式中的 z_{t} ,同时将cell state也合并到hidden state中。由于该模型相较LSTM更为简化,计算量更小,且最终模型性能类似,所以最近越来越广泛的得到应用。

总结

第十章主要介绍了为处理序列数据而采用的RNN模型,它的不同架构可以处理各种不同的输入输出格式,如sequence to vector, vector to sequence 及sequence to sequence。而为了解决长程作用的问题,各种gated RNN方法被提出,比较普及的是LSTM以及GRU模型。


注:截图均来自Ian Goodfellow等合著的Deep Learning一书以及斯坦福CS231n讲义CS231n: Convolutional Neural Networks for Visual Recognition,推荐阅读原书及原课程。

编辑于 2018-09-12

文章被以下专栏收录