放牧代码和思想
专注自然语言处理、机器学习算法
    This thing called love. Know I would've. Thrown it all away. Wouldn't hesitate.

Hinton神经网络公开课7 Recurrent neural networks

目录

一个应用RNN的玩具

2017年05月17日23-22-54.png

训练一个神经网络用于二进制加法。我们当然可以用普通的前向神经网络来实现,但它有很多限制:

  • 必须事先确定输入和输出的长度,这是个固定值

  • 知识无法泛化,因为每一比特都对应了不同的权值

最终的结果是虽然能实现固定长度的二进制加法,但泛化得不佳,也不是优雅的解决方案。

加法器算法

2017年05月18日20-48-06.png

这是一个摩尔自动机,共有四个状态。类似于HMM,不过状态并不是隐藏的。

加法器递归神经网络

有两个输入单元和一个输出单元。类似于电路的delay,输入两个input后需要两个单位的时间才能获取到这一位对应的output。其中一单位花在了更新隐藏层,另一单位花在了输出上。

hankcs.com 2017-05-18 下午8.50.25.png

网络结构

2017年05月18日20-57-58.png

只需要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型函数防止激活值爆炸。

2017年05月18日21-19-15.png

S函数将激活值限制在了0到1之间,但反向传播则完全是线性的。如果你将最后一层的误差导数翻倍,那么反向传播过程中的所有误差导数都会翻倍。

假设上图中的红点是前向传播时的激活值,那么在反向传播时利用的就是该点处的切线斜率。在前向传播结束后,切线的斜率就确定并固定下来。然后反向传播开始,根据链式法则,误差梯度进入了一个线性系统。线性系统的毛病就是,多次迭代后输出值要么趋近0,要么趋近$\infty$(比如$y=kx$,其中$0< k < 1$,多次迭代后就趋近0了)。

梯度爆炸或消失

如果权值很小的话,则梯度会指数级减小,也即消失;反之会指数级增长,也就是爆炸。普通神经网络中这个问题并不明显,因为其层数毕竟有限。但RNN中往往特别严峻,因为序列长度一般不短,比如100个时间单位。不过我们可以通过精心初始化权值来防止这个问题。

即便如此,RNN依然很难学习到“当前输出依赖于很久之前的输入”这种pattern,也即是RNN不擅长处理长距离的依存关系。

2017年05月18日21-40-42.png

在上图的吸引子系统中,假设有两种状态:蓝色和红色。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个门。

实现记忆单元

2017年05月18日22-13-29.png

记忆单元是一个自连接的单元,其权值可以改变。当权值是1的时候,信息(记忆)保持不变;当权值是0的时候,信息消失(遗忘)。还有一个write门控制新信息的存储,有点像D-Latch;一个read门将信息输出到RNN。

记忆单元是logistics,因为导数比较漂亮。

通过记忆单元的反向传播

2017年05月18日22-16-34.png

这张图从左到右看演示了前向传播中,记忆单元从记住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

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的作品

HanLP自然语言处理包《自然语言处理入门》