目录
一个应用RNN的玩具
训练一个神经网络用于二进制加法。我们当然可以用普通的前向神经网络来实现,但它有很多限制:
-
必须事先确定输入和输出的长度,这是个固定值
-
知识无法泛化,因为每一比特都对应了不同的权值
最终的结果是虽然能实现固定长度的二进制加法,但泛化得不佳,也不是优雅的解决方案。
加法器算法
这是一个摩尔自动机,共有四个状态。类似于HMM,不过状态并不是隐藏的。
加法器递归神经网络
有两个输入单元和一个输出单元。类似于电路的delay,输入两个input后需要两个单位的时间才能获取到这一位对应的output。其中一单位花在了更新隐藏层,另一单位花在了输出上。
网络结构
只需要3个隐藏单元即可完成任务(我猜是因为$delay=2$,网络必须记住至少2个step前的事情)。
网络学会了什么
网络使用3个隐藏单元学习了4种不同的激活值,对应自动机中的4个节点。
-
不要将神经网络中的单元与自动机中的状态混淆。
-
自动机任意时刻只能处于一个状态,但隐藏单元则被限制为一个激活值向量。
RNN可以模拟有限状态自动机,但前者明显更强大。在N个隐藏单元的RNN中,一共存在$2^N$个布尔激活值(比如是否输出0),但只需$N^2$个权值。
如果输入流中有两个事件或两种pattern,则FSA需要将状态数平方才能处理(增加维度);而RNN只需将N双倍即可得到$2^{2N}=(2^N)^2$。
为什么RNN很难训练
这一节将会探讨RNN训练中的“梯度爆炸(exploding)”和“梯度消失”问题。
反向传播是线性的
在前向传播中,我们使用S型函数防止激活值爆炸。
S函数将激活值限制在了0到1之间,但反向传播则完全是线性的。如果你将最后一层的误差导数翻倍,那么反向传播过程中的所有误差导数都会翻倍。
假设上图中的红点是前向传播时的激活值,那么在反向传播时利用的就是该点处的切线斜率。在前向传播结束后,切线的斜率就确定并固定下来。然后反向传播开始,根据链式法则,误差梯度进入了一个线性系统。线性系统的毛病就是,多次迭代后输出值要么趋近0,要么趋近$\infty$(比如$y=kx$,其中$0< k < 1$,多次迭代后就趋近0了)。
梯度爆炸或消失
如果权值很小的话,则梯度会指数级减小,也即消失;反之会指数级增长,也就是爆炸。普通神经网络中这个问题并不明显,因为其层数毕竟有限。但RNN中往往特别严峻,因为序列长度一般不短,比如100个时间单位。不过我们可以通过精心初始化权值来防止这个问题。
即便如此,RNN依然很难学习到“当前输出依赖于很久之前的输入”这种pattern,也即是RNN不擅长处理长距离的依存关系。
在上图的吸引子系统中,假设有两种状态:蓝色和红色。RNN学到了两个盆地,在蓝色盆地中,无论初始状态是哪里,最终都会稳定在盆地的最低点;同理红色。这就是梯度消失的后果:初始值不影响最终结果。而如果初始值位于两个盆地的交界,则微小的变化都会导致截然不同的结果,这就是梯度爆炸的结果。
训练RNN的四种有效方法
-
LSTM
加入被特别设计为能够长时间记忆的单元。 -
Hessian Free Optimization
通过fancy的优化算法解决梯度消失问题。 -
Echo State Networks
初始化input到hidden、 hidden到hidden 和 output到hidden的权值;只学习hidden到output 的权值 -
在ESN的基础上加上动量
LSTM
可以把普通RNN想象成短时记忆网络,现在的目的是让短时记忆持续较长的时间。这是通过加入一个控制信息进出的门完成的,想要记住的时候,就开门把信息写入记忆单元然后把门关上。
LSTM
Hochreiter & Schmidhuber 在1997年的时候使用逻辑斯谛和线性单元设计了记忆单元,一共有write、keep和read 3个门。
实现记忆单元
记忆单元是一个自连接的单元,其权值可以改变。当权值是1的时候,信息(记忆)保持不变;当权值是0的时候,信息消失(遗忘)。还有一个write门控制新信息的存储,有点像D-Latch;一个read门将信息输出到RNN。
记忆单元是logistics,因为导数比较漂亮。
通过记忆单元的反向传播
这张图从左到右看演示了前向传播中,记忆单元从记住1.7到输出1.7并遗忘它的全部过程。
反向传播时,黑色三角代表了连接的权值是1。所以无论读取1.7的时候误差梯度是多少,在储存的时候一定变成了1.7。梯度没有消失或爆炸,这正是我们想要的。
应用
RNN特别适用于识别草书。这个任务中,输入是(x,y,p) ,x和y是笔尖的坐标,p是笔是否落下。输出是一段文本。Graves & Schmidhuber在2009年的工作证明了RNN-LSTM是最佳的方案。
第一行是识别出来的字母,由于该系统不会修改决策,所以较难的决策往往会延时决定。
第二行是部分记忆单元的状态(会在识别出一个字母后reset)。
第三行是手写笔迹。
第四行是反向传播到输入的梯度(或说哪些信息在决定当前的决策)。
知识共享署名-非商业性使用-相同方式共享:码农场 » Hinton神经网络公开课7 Recurrent neural networks