第十章 序列建模:循环和递归网络
2020-2-21 深度学习笔记10 - 序列建模:循环和递归网络 1(展开计算图,循环神经网络–经典 / 导师驱动 / 唯一单向量输出 / 基于上下文RNN建模)
2020-2-23 深度学习笔记10 - 序列建模:循环和递归网络 2(双向RNN,基于编码 - 解码的序列到序列结构–不等长输出序列,计算循环神经网络的梯度)
2020-2-24 深度学习笔记10 - 序列建模:循环和递归网络 3(深度循环网络,递归神经网络,长期依赖的挑战,回声状态网络ESN)
渗漏单元和其他多时间尺度的策略
介绍长期依赖时候曾经说过,解决长期依赖有3个办法,其中1个就是本单元要介绍的《渗漏单元和其他多时间尺度的策略》。
处理长期依赖的一种思路是:让模型在多个时间尺度下工作,使模型的某些部分在细粒度时间尺度上操作以处理小的细节,而其他部分在粗时间尺度上操作以处理遥远的信息。
这种思路衍生出众多的方法,包括本节要介绍的:在时间轴增加跳跃连接。
渗漏单元正是使用了不同时间常数的整合信号,并且去除了一些细粒度时间尺度的连接。
1-时间维度的跳跃连接
增加从遥远过去的变量到目前变量的直接连接是得到粗时间尺度的一种方法。
梯度可能关于时间步数呈指数消失或爆炸。算法引入了d延时的循环连接以减轻这个问题。 现在导数指数减小的速度与 τ d \fracτd dτ相关而不是τ。 既然同时存在延迟和单步连接,梯度仍可能成t指数爆炸。 这允许学习算法捕获更长的依赖性,但不是所有的长期依赖都能在这种方式下良好地表示。
2-渗漏单元和一系列不同时间尺度
该思想类似于TensorFlow里的滑动平均模型和影子变量。
滑动平均值实际上包含了很长一段时间的信息。
在长期依赖问题中,我们可以用滑动平均值来代替真实参数,使得参数更迭时考虑更多的长期信息。
设μ(t)是v(t)累积的一个滑动平均值。即当参数更迭时,我们总是利用μ(t)而不是v(t)。
其求法为:
μ ( t ) = α μ ( t − 1 ) + ( 1 − α ) v ( t ) μ^{(t)}=αμ^{(t−1)}+(1−α)v^{(t)} μ(t)=αμ(t−1)+(1−α)v(t)
当α→1时,μ^{(t)}几乎全采用上一个滑动平均值,几乎不发生变化,对历史信息沿用较大;
当α→0时,μ^{(t)}几乎全采用算法输出值,历史信息基本被全部丢弃。
这些从μ(t−1)连接到μ(t)的方式,称为线性自连接;
而α→1的线性自连接隐藏单元,我们称之为渗漏单元
leaky unit。
我们设置线性自连接单元,并且令连接权重接近1,从而使得导数乘积接近1。
这样,我们就避免了跳跃,而是采取了这种更平滑的方式,来保持更久远的长期依赖。
3-删除连接
和跳跃连接不同的是,跳跃连接是添加边,单元可以自我选择有利的依赖;
而删除连接直接把长度为1的连接删除了,强迫连接是较长的。
总的来说,上述两种方法都在保持深度τ
不变的情况下,尽可能迫使模型学习长期依赖。
长短期记忆和其他门控RNN
这个是解决长期依赖的另外一个办法。
目前,实际应用中最有效的序列模型称为门控
RNN(gated RNN)。包括基于长短期记忆(long short-term memory)和基于门控循环单元(gated recurrent unit)的网络。
和渗漏单元类似,门控RNN也是要生成通过时间的路径,使其导数既不消失也不爆炸。
不同的是,渗漏单元中的连接权重一般是手动设置或设为参量的常量,而门控RNN中的连接权重在每一个时间步都有可能改变。
回顾渗漏单元,我们会注意到一个问题:渗漏单元允许网络累积长期信息,但如果该信息已经被使用或无用,神经网络应该丢弃这些信息。但由于连接权重是常量,这一点无法做到。
一个很明显的例子是:我们的长序列由一系列子序列组成,子序列之间是无关的。
显然,我们希望在每个子序列内积累信息,但切换到另一子序列时,应该遗忘历史。
进一步,我们希望RNN自行决定何时遗忘。这就是门控RNN的设计初衷。
1-LSTM
先看图:
主要创新有:
- 输入、状态、输出都有门控制
- 门控系数都是根据上下文训练得到的
如图,输入和输出比较好理解,分别由外部输入门
external input gate和输出门
output gate控制:
i n p u t = x ( t ) input=x^{(t)} input=x(t)
o u t p u t _ i n p u t g a t e = g ( t ) = σ ( b g + ∑ j U j g x j ( t ) + ∑ j W j g h j