深度学习(花书)第八章

ZhuYuanxiang 2021-11-18 00:00:00
Categories: Tags:

C08. 深度模型中的优化

Ch04介绍一般的数值优化问题

Ch08关注特定的数值优化问题:寻找神经网络上的一组参数 $\theta$,用于显著降低代价函数 $J(\theta)$,这个代价函数通常包括整个训练集上的性能评估和额外的正则化项。

8.1 不同数值优化问题的区别

8.1.1 经验风险最小化

将机器学习问题转化为优化问题的方式:最小化训练集上的期望损失。

经验风险(empirical risk):用训练集上的经验分布 $\hat{p}_\text{data}$ 代替真实分布 $p_\text{data}$。

经验风险最小化(empirical risk minimization):基于最小化这种平均训练误差的训练过程

经验风险最小化很容易导致过拟合:因为高容量的模型会记住训练集

8.1.2 现实情况下的损失函数和优化方法

代理损失函数(surrogate loss function)

代理损失函数与纯优化对比

8.1.3 批量算法和小批量算法

机器学习算法的目标函数可以分解为训练样本上的求和

  1. 使用整个训练集的优化算法被称为批量(batch)或者确定性(deterministic)梯度算法
  2. 每次只使用单个样本的优化算法称为随机(stochastic)或者在线(online)算法。
  3. 使用一个以上而不是全部训练样本的深度学习优化算法称为小批量(minibatch)或小批量随机(minibatch stochastic)算法,统称为随机(stochastic)方法。

小批量的大小设置

8.2 神经网络优化中的困难

优化问题本身就是一个极其困难的任务。

8.2.1 病态问题

Hessian 矩阵 $H$ 的病态问题:在随机梯度下降时会「卡」在某些情况下,此时即使很小的更新步长也会增加代价函数,因此学习率必须收缩以弥补更强的曲率。

8.2.2 局部极小值

模型可辨识性(model identifiability)问题:如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型被称为可辨识的。

模型可辨识性问题导致:神经网络代价函数具有非常多甚至不可数无限多的局部极小值,而且这些局部极小值都有相同的代价函数值,因此这些局部极小值不是非凸带来的问题。

学者们猜想:对于足够大的神经网络,大部分局部极小值都具有很小的代价函数,因此找全局最小点不是最重要的,而是需要在参数空间中找到一个代价很小(可能不是最小)的点。

一种排除局部最小值的方法:如果梯度范数没有随着时间缩小到一个微小的值,那么得到的既不是局部极小值,也不是其他形式的临界点。

8.2.3 平坦区域(高原、鞍点)

鞍点:在鞍点处,Hessian矩阵同时具有正负特征值。位于正特征值对应的特征向量方向的点比鞍点的代价大,位于负特征值对应的特征向量方向的点比鞍点的代价小,鞍点为代价函数在某个横截面上的局部极小点,也为代价函数某个横截面上的局部极大点。

随机函数

投影函数($f:\mathbb{R}^n\rightarrow\mathbb{R}$):鞍点和局部极小值的数目比率的期望随 $n$ 指数级增长

随机函数

鞍点

8.2.4 斜率悬崖结构导致的梯度爆炸

长期时间序列会产生大量的权重相乘,几个较大的权重相乘会导致悬崖结构。

当传统的梯度下降算法更新步长过大时,Ch10.md启发式梯度截断(gradient clipping)会干涉来减小步长,从而避免越过悬崖区域。

8.2.5 长期依赖导致的梯度消失

长期依赖问题:变深的神经网络结构使模型丧失了学习到先前信息的能力,从而使优化变得极其困难。

假设某个计算图中包含一条反复与矩阵 $W$ 相乘的路径,那么 $t$ 步后相当于乘以 $W^t$,对 $W$ 进行特征值分解 $W=V\text{diag}(\lambda)V^{-1}$,得 $W^t=(V\text{diag}(\lambda)V^{-1})^t=V\text{diag}(\lambda)^t V^{-1}$,因此计算图上的梯度会因为 $\text{diag}(\lambda)^t$ 而导致梯度消失或者梯度爆炸问题。

循环网络在各个时间步上使用相同的矩阵 $W$,而前馈网络使用不同的矩阵,因此即使非常深层的前馈网络也能在很大程度上有效地避免梯度消失和梯度爆炸问题。

8.2.6 非精确梯度

大多数优化算法的先决条件是知道精确的梯度或者 Hessian 矩阵,但是当目标函数不可解时,只有使用近似梯度代替,或者使用代理损失函数来避免这个问题。

8.2.7 局部结构与全局结构之间的弱对应

许多现有研究方法在求解具有困难的全局结构的问题时,旨在寻找良好的初始点,而不是开发非局部范围更新的算法。

基本上所有的可以有效地训练神经网络的学习算法都是基于局部较小更新。

8.2.8 传统的优化理论的限制

为神经网络设计的优化算法都有性能限制,因此研究优化算法现实的性能上界是重要目标。

8.3 基本算法

8.3.1 随机梯度下降(Stochastic Gradient Descent, SGD)

在机器学习和深度学习中,SGD是应用最多的优化算法。按照数据生成分布抽取 $m$ 个小批量(i.i.d.)样本,通过计算它们的梯度均值,得到梯度的无偏估计。

算法描述:

8.3.2 动量

动量算法可以加速随机梯度下降的学习过程,特别是处理高曲率线段、梯度一致并且很小的线段或是梯度带噪声的线段。

动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿着这个方向移动。

动量算法引入了变量 $v$ 作为速度,表示参数在参数空间移动的方向和速率。速度被设为负梯度的指数衰减平均。

算法描述:

8.3.3 Nesterov 动量

受 Nesterov 加速梯度算法的启发,Sutskever 提出了动量算法的变种。

算法描述:

8.4 参数初始化策略

初始参数需要在不同单元间「破坏对称性」。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。如果具有相同的初始参数,然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。即使模型或者训练算法能够使用随机性为不同的单元计算不同的更新,因此初始化每个单元使其和其他单元计算不同的函数效果最好。可能有助于确保没有输入模式丢失在前向传播的零空间中,没有梯度模式丢失在反向传播的零空间中。每个单元计算不同函数的目标促使了参数的随机初始化。

更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元,也有助于避免在每层线性成分的前向或者反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重过大,会在前向传播或者反向传播中产生爆炸的值。在循环网络中,很大的权重可能会导致混沌(chaos)(即对输入中很小的扰动也非常敏感,导致确定性前向传播过程中表现随机)。很大的权重也会使激活函数输出值饱和的值,导致饱和单元的梯度消失。

初始化网络的观点

启发式方法可以用于选择权重的初始大小。

权重初始化的最佳准则不能带来最佳效果的原因:

数值范围准则的缺点:设置所有的初始权重具有了相同的标准差$\frac1{\sqrt{m}}$,当层中单元数很多时每个单一权重会变得很小。

稀疏初始化:每个单元初始化为恰好有 $k$ 个非零权重,从而保持这个单元输入的总数量独立于输入数目 $m$,有助于实现单元之间在初始化时更加具有多样性,但是获得较大取值的权重也被强加了先验,使得错误单元权重的优化时间加长。

如果计算资源允许,将每层权重的初始数值范围设为超参数。

设置偏置的方法与设置权重的方法必须相互协调

使用机器学习初始化模型参数,使用相同的输入数据集,使用无监督模型训练出来的参数来初始化监督模型

8.5 自适应学习率算法

8.5.1 AdaGrad

独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。损失函数中参数的偏导的大小对应学习率的大小,从而参数空间中平缓的方向也有合适的步长。

凸优化问题中,算法具有良好的理论性质,但是实际应用中因为从训练开始时积累梯度平方会导致有效学习率过早和过快地减小。

算法描述:

8.5.2 RMSProp

RMSProp 是深度学习经常采用的优化方法之一。

算法在非凸问题中也能应用,改变梯度积累为指数加权的移动平均。

算法描述:

使用 Nesterov 动量的 RMSProp 算法描述:

8.5.3 Adam

在Adam中,动量直接并入了梯度一阶矩(指数加权)估计;

在Adam中,加入了偏置修正,用于修正从原点初始化的一阶(动量项)和(非中心的)二阶矩的估计;

在Adam中,超参数的选择非常鲁棒。

算法描述:

8.5.4 选择正确的优化算法

以上介绍的五种学习算法都在使用,选择取决于使用者对算法的熟悉程度。