深度学习第10、11章学习笔记
第10章 序列建模:循环和递归网络
循环神经网络(recurrent neural network)或 RNN是一类用于处理序列数据的神经网络。是专门用于处理序列 x(1), . . . , x(τ )的神经网络。循环网络可以扩展到更长的序列(比不基于序列的特化网络长得多)。大多数循环网络也能处理可变长度的序列。
对比:传统的全连接前馈网络会给每个输入特征分配一个单独的参数,所以需要分别学习句子每个位置的所有语言规则。相比之下,循环神经网络在几个时间步内共享相同的权重,不需要分别学习句子每个位置的所有语言规则。
展开计算图
计算图是形式化一组计算结构的方式,如那些涉及将输入和参数映射到输出和损失的计算。展开(unfolding)计算图将导致深度网络结构中的参数共享。
考虑动态系统的经典形式:
s 在时刻t 的定义需要参考时刻 t − 1 时同样的定义,对有限时间步τ,τ− 1 次应用这个定义可以展开这个图。展开计算图如下图所示:
当训练循环网络根据过去预测未来时,网络通常要学会使用h(t)作为过去序列(直到t)与任务相关方面的有损摘要。摘要可能选择性地精确保留过去序列的某些方面。例如,如果在统计语言建模中使用的 RNN,通常给定前一个词预测下一个词,可能没有必要存储时刻 t 前输入序列中的所有信息;而仅仅存储足够预测句子其余部分的信息。
展开过程的两个主要优点:
1. 无论序列的长度,学成的模型始终具有相同的输入大小,因为它指定的是从一种状态到另一种状态的转移,而不是在可变长度的历史状态上操作。
2. 我们可以在每个时间步使用相同参数的相同转移函数 f 。
循环神经网络
循环神经网络中一些重要的设计模式:
1. 每个时间步都有输出,并且隐藏单元之间有循环连接的循环网络,如下图所示。
2. 每个时间步都产生一个输出,只有当前时刻的输出到下个时刻的隐藏单元之间有循环连接的循环网络,如图所示。
3. 隐藏单元之间存在循环连接,但读取整个序列后产生单个输出的循环网络,如图所示。
导师驱动过程和输出循环网络
消除隐藏到隐藏循环的优点在于,任何基于比较时刻 t 的预测和时刻 t 的训练目标损失函数中的所有时间步都解耦了。因此训练可以并行化,即在各时刻 t 分别计算梯度。因为训练集提供输出的理想值,所以没有必要先计算前一时刻的输出。
由输出反馈到模型而产生循环连接的模型可用导师驱动过程(teacher forcing)进行训练。训练模型时,导师驱动过程不再使用最大似然准则,而在时刻 t + 1 接收真实值 y(t)作为输入。条件最大似然准则是:
我们使用导师驱动过程的最初动机是为了在缺乏隐藏到隐藏连接的模型中避免通过时间反向传播。然而,只要隐藏单元成为较早时间步的函数,BPTT算法是必要的。因此训练某些模型时要同时使用导师驱动过程和 BPTT。
计算循环神经网络的梯度
可以简单地将推广反向传播算法应用于展开的计算图,而不需要特殊化的算法。由反向传播计算得到的梯度,并结合任何通用的基于梯度的技术就可以训练 RNN。
作为有向图模型的循环网络
解释 RNN 作为图模型的一种方法是将RNN视为定义一个结构为完全图的图模型,且能够表示任何一对 y 值之间的直接联系。图模型中的边表示哪些变量直接依赖于其他变量。许多图模型的目标是省略不存在强相互作用的边以实现统计和计算的效率。
将隐藏单元 h(t)视为随机变量,从而产生 RNN 的图模型结构1。在图模型中包括隐藏单元预示 RNN 能对观测的联合分布提供非常有效的参数化。
基于上下文的RNN序列建模
将额外输入提供到 RNN 的一些常见方法是:
1. 在每个时刻作为一个额外输入,或
2. 作为初始状态 h(0),或
3. 结合两种方式。
双向 RNN
在许多应用中,我们要输出的 y(t)的预测可能依赖于整个输入序列。双向循环神经网络(或双向 RNN)为满足这种需要而被发明 (Schuster and Paliwal, 1997)。他们在需要双向信息的应用中非常成功,如手写识别,语音识别以及生物信息学。顾名思义,双向RNN 结合时间上从序列起点开始移动的 RNN 和另一个时间上从序列末尾开始移动的RNN。
下图为典型的双向循环神经网络中的计算,意图学习将输入序列 x 映射到目标序列 y(在每个步骤 t 具有损失 L(t))。
基于编码-解码的序列到序列架构
(1) 编码器(encoder)或 读取器 (reader) 或 输入(input) RNN 处理输入序列。编码器输出上下文 C(通常是最终隐藏状态的简单函数)。
(2)解码器(decoder)或 写入器(writer) 或 输出 (output) RNN 则以固定长度的向量为条件产生输出序列 Y = (y(1), . . . , y(ny ))。
深度循环网络
大多数 RNN 中的计算可以分解成三块参数及其相关的变换:
1. 从输入到隐藏状态,
2. 从前一隐藏状态到下一隐藏状态,以及
3. 从隐藏状态到输出。
这三个块都与单个权重矩阵相关联。换句话说,当网络被展开时,每个块对应一个浅的变换。能通过深度 MLP 内单个层来表示的变换称为浅变换。通常,这是由学成的仿射变换和一个固定非线性表示组成的变换。
递归神经网络
递归神经网络代表循环网络的另一个扩展,它被构造为深的树状结构而不是 RNN 的链状结构,因此是不同类型的计算图。递归网络的典型计算图如下图所示。递归网络已成功地应用于输入是数据结构的神经网络,如自然语言处理和计算机视觉。
可变大小的序列 x(1), x(2), . . . , x(t)可以通过固定的参数集合(权重矩阵 U, V, W)映射到固定大小的表示(输出 o)。
长期依赖的挑战
学习循环网络长期依赖的数学挑战根本问题是,经过许多阶段传播后的梯度倾向于消失(大部分情况)或爆炸(很少,但对优化过程影响很大)。即使我们假设循环网络是参数稳定的(可存储记忆,且梯度不爆炸),但长期依赖的困难来自比短期相互作用指数小的权重(涉及许多 Jacobian 相乘)。
循环网络涉及相同函数的多次组合,每个时间步一次。这些组合可以导致极端非线性行为。特别地,循环神经网络所使用的函数组合有点像矩阵乘法。我们可以认为,循环联系是一个非常简单的、缺少非线性激活函数和输入x的循环神经网络。非常深的前馈网络通过精心设计的比例可以避免梯度消失和爆炸问题。
回声状态网络
回声状态网络(echo state network)或 ESN,以及 流体状态机(liquid state machine)分别独立地提出:循环权重映射以及输入权重映射是循环网络中最难学习的参数,避免这种困难的方法是设定循环隐藏单元,使其能很好地捕捉过去输入历史,并且只学习输出权重。ESN 和流体状态机都被称为储层计算,因为隐藏单元形成了可能捕获输入历史不同方面的临时特征池。储层计算将循环网络视为动态系统,并设定让动态系统接近稳定边缘的输入和循环权重。
渗漏单元和其他多时间尺度的策略
“渗漏单元”使用不同时间常数整合信号,并去除一些用于建模细粒度时间尺度的连接。使模型的某些部分在细粒度时间尺度上操作并能处理小细节,而其他部分在粗时间尺度上操作并能把遥远过去的信息更有效地传递过来。
增加从遥远过去的变量到目前变量的直接连接是得到粗时间尺度的一种方法。我们可以通过两种基本策略设置渗漏单元使用的时间常数。一种策略是手动将其固定为常数,例如在初始化时从某些分布采样它们的值。另一种策略是使时间常数成为自由变量,并学习出来。
长短期记忆和其他门控RNN
目前,实际应用中最有效的序列模型称为门控 RNN(gated RNN)。包括基于长短期记忆(long short-term memory)和基于 门控循环单元(gated recurrent unit)的网络。
长短期记忆模型中一个关键扩展是使自循环的权重视上下文而定,而不是固定的。门控此自循环(由另一个隐藏单元控制)的权重,累积的时间尺度可以动态地改变。
优化长期依赖
二阶导数可能在一阶导数消失的同时消失。二阶优化算法可以大致被理解为将一阶导数除以二阶导数(在更高维数,由梯度乘以Hessian 的逆)。如果二阶导数与一阶导数以类似的速率收缩,那么一阶和二阶导数的比率可保持相对恒定。
强非线性函数(如由许多时间步计算的循环网络)往往倾向于非常大或非常小幅度的梯度。当参数梯度非常大时,梯度下降的参数更新可以将参数抛出很远,进入目标函数较大的区域,到达当前解所作的努力变成了无用功。截断梯度为一种较为广泛的解决方案。一种选择是在参数更新之前,逐元素地截断小批量产生的参数梯度。另一种是在参数更新之前截断梯度 g 的范数 ||g||.
梯度截断有助于处理爆炸的梯度,但它无助于消失的梯度。为了解决消失的梯度问题并更好地捕获长期依赖,可以在展开循环架构的计算图中,沿着与弧边相关联的梯度乘积接近 1 的部分创建路径。另一个想法是正则化或约束参数,以引导‘‘信息流’’。特别是即使损失函数只对序列尾部的输出作惩罚,我们也希望梯度向量 ∇h(t)L 在反向传播时能维持其幅度。
外显记忆
如果一个存储单元的内容在大多数时间步上会被复制(不被忘记),则它包含的信息可以在时间上向前传播,随时间向后传播的梯度也不会消失或爆炸。
第11章 实践方法论
一个优秀的机器学习实践者还需要知道如何针对具体应用挑选一个合适的算法以及如何监控,并根据实验反馈改进机器学习系统。
性能度量
实际情况中,正确率很难描述部分系统的性能。解决这个问题的方法是度量 精度(precision)和 召回率(recall)。精度是模型报告的检测是正确的比率,而召回率则是真实事件被检测到的比率。当使用精度和召回率时,我们通常会画 PR 曲线(PR curve),y 轴表示精度,x 轴表示召回率。如果检测到的事件发生了,那么分类器会返回一个较高的得分。
我们可以将精度 p 和召回率 r 转换为 F 分数:
覆盖是机器学习系统能够产生响应的样本所占的比率。我们权衡覆盖和精度。一个系统可以通过拒绝处理任意样本的方式来达到 100% 的精度,但是覆盖降到了 0%。
默认的基准模型
如果问题属于“AI-完全’’类的,如对象识别、语音识别、机器翻译等等,那么项目开始于一个合适的深度学习模型,效果会比较好。
首先,根据数据的结构选择一类合适的模型。具有衰减学习率以及动量的SGD是优化算法一个合理的选择;除非训练集包含数千万以及更多的样本,否则项目应该在一开始就包含一些温和的正则化。根据特定领域确定项目开始时是否该使用无监督学习。
决定是否收集更多数据
首先,确定训练集上的性能是否可接受。如果模型在训练集上的性能就很差,学习算法都不能在训练集上学习出良好的模型,那么就没必要收集更多的数据。此外,也可以尝试调整学习率等超参数的措施来改进学习算法。在决定是否收集更多的数据时,也需要确定收集多少数据。如果收集更多的数据是不可行的,那么改进泛化误差的唯一方法是改进学习算法本身。
选择超参数
大部分深度学习算法都有许多超参数来控制不同方面的算法表现。其基本方法有:手动选择和自动选择。手动选择超参数需要了解超参数做了些什么,以及机器学习模型如何才能取得良好的泛化。自动选择超参数算法大大减少了解这些想法的需要,但它们往往需要更高的计算成本。
调试策略
由于各种原因,机器学习系统很难调试。由于大多数情况下,我们不能提前知道算法的行为。另一个难点为,大部分机器学习模型有多个自适应的部分。
一些重要的调试检测如下:可视化计算中模型的行为、可视化最严重的错误、根据训练和测试误差检测软件、拟合极小的数据集、比较反向传播导数和数值导数、监控激活函数值和梯度的直方图。
#笔记#