🎨
Bible-DeepLearning
  • Introduction
  • 第6章 深度前馈网络
    • 6.1 例子:学习XOR
    • 6.2 基于梯度的学习
      • 6.2.1 代价函数
        • 6.2.1.1 使用最大似然学习条件分布
        • 6.2.1.2 学习条件统计量
      • 6.2.2 输出单元
        • 6.2.2.1 用于高斯输出分布的线性神单元
        • 6.2.2.2 用于Bernoulli输出分布的sigmoid单元
        • 6.2.2.3 用于Multinoulli输出分布的softmax单元
    • 6.3 隐藏单元
      • 6.3.1 ReLU及其扩展
      • 6.3.2 logistic sigmoid与双曲正切函数
      • 6.3.3 其他隐藏单元
      • 李宏毅补充 SELU
    • 6.4 架构设计
    • 6.5 反向传播和其他的微分算法
      • 6.5.1 计算图
      • 6.5.2 微积分中的链式法则
      • 6.5.3 递归地使用链式法则来实现反向传播
      • 6.5.4 全连接MLP中的反向传播计算
      • 6.5.5 符号到符号的导数
      • 6.5.6 一般化的反向传播
      • 6.5.7 实例:用于MLP 训练的反向传播
      • 6.5.8 复杂化
  • 第7章 深度学习中的正则化
    • 7.1 参数范数惩罚
      • 7.1.1 L2参数正则化
      • 7.1.2 L1参数正则化
    • 7.2 作为约束的范数惩罚
    • 7.3 正则化和欠约束问题
    • 7.4 数据集增强
    • 7.5 噪声鲁棒性
    • 7.6 半监督学习
    • 7.7 多任务学习
    • 7.8 提前终止
    • 7.9 参数绑定和参数共享
    • 7.10 稀疏表示
    • 7.11 Bagging 和其他集成方法
    • 7.12 Dropout
    • 7.13 对抗训练
    • 7.14 切面距离、正切传播和流形正切分类器
    • Ag补充 一些能用于提升比赛成绩的方法
  • 第8章 深度模型中的优化
    • 8.1 学习和纯优化有什么不同
      • 8.1.1 经验风险最小化
      • 8.1.2 代理损失函数和提前终止
      • 8.1.3 批量算法和小批量算法
    • 8.2 神经网络优化中的挑战
      • 8.2.1 病态
      • 8.2.2 局部极小值
      • 8.2.3 8.2.3 高原、鞍点和其他平坦区域
      • 8.2.4 悬崖和梯度爆炸
      • 8.2.5 长期依赖
      • 8.2.6 非精确梯度
    • 8.3 基本算法
      • 8.3.1 随机梯度下降
      • 8.3.2 动量
      • 8.3.3 Nesterov 动量
    • 8.4 参数初始化策略
    • 8.5 自适应学习率算法
      • 8.5.1 AdaGrad
      • 8.5.2 RMSProp
      • 8.5.3 Adam
      • 8.5.4 选择正确的优化算法
    • 8.6 二阶近似方法
      • 8.6.1 牛顿法
      • 8.6.2 共轭梯度
      • 8.6.3 BFGS
    • 8.7 优化策略和元算法
      • 8.7.1 批标准化
      • 8.7.2 坐标下降
      • 8.7.3 Polyak 平均
      • 8.7.4 监督预训练
      • 8.7.5 设计有助于优化的模型
  • 第9章 卷积网络
    • 9.1 卷积运算
    • 9.2 动机
    • 9.3 池化
    • 9.4 卷积与池化作为一种无限强的先验
    • 9.5 基本卷积函数的变体
    • 9.6 结构化输出
    • 9.7 数据类型
  • 第10章 序列建模:循环和递归网络
    • 10.1 展开计算图
    • 10.2 循环神经网络
      • 10.2.1 导师驱动过程和输出循环网络
      • 10.2.2 计算循环神经网络的梯度
      • 10.2.3 作为有向图模型的循环网络
      • 10.2.4 基于上下文的RNN序列建模
    • 10.3 双向RNN
    • 10.4 基于编码 - 解码的序列到序列架构
    • 10.5 深度循环网络
    • 10.6 递归神经网络
    • 10.7 长期依赖的挑战
    • 10.9 渗漏单元和其他多时间尺度的策略
    • 10.10 长短期记忆和其他门控RNN
      • 10.10.1 LSTM
      • 10.10.2 其他门控RNN
    • 10.11 优化长期依赖
      • 10.11.1 梯度截断
      • 10.11.2 引导信息流的正则化
    • 10.12 外显记忆
  • 第11章 实践方法论
    • 11.1 性能度量
    • 11.2 默认的基准模型
    • 11.3 决定是否收集更多数据
    • 11.4 选择超参数
      • 11.4.1 手动选择超参数
      • 11.4.3 网络搜索
      • 11.4.4 随机搜索
    • 11.5 调试策略
Powered by GitBook
On this page
  • 引入动量算法
  • 动量算法
  • 怎样理解动量算法
  • 动量算法中的力

Was this helpful?

  1. 第8章 深度模型中的优化
  2. 8.3 基本算法

8.3.2 动量

Previous8.3.1 随机梯度下降Next8.3.3 Nesterov 动量

Last updated 4 years ago

Was this helpful?

引入动量算法

虽然随机梯度下降仍然是非常受欢迎的优化方法,但其学习过程有时会很慢。 动量方法旨在加速学习,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。

[success] 问: 为什么动量方法适用于高曲率的梯度? 答:高曲率代表二阶导数大。动量算法不仅考虑一阶偏导、还考虑了二阶偏导。较大的二阶偏导也对参数的移动方向有指导意义。 问: 为什么动量方法适用于小但一致的梯度? 动量算法会考虑历史梯度的积累。小的梯度导致在普通梯度下降法上学习速度慢。但由于它的方向一致,动量算法会通过积累历史梯度而增大当前的step,从而加速学习。 问: 为什么动量方法适用于带噪声的梯度? 答:,因此这些地方的偏导数为0。但动量算法能解决这一问题。

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

[success]

动量的效果如图8.5所示。

[info] 动量的主要目的是解决两个问题:Hessian矩阵的病态条件和随机梯度的方差。 我们通过此图说明动量如何克服这两个问题的第一个。 等高线描绘了一个二次损失函数(具有病态条件的Hessian矩阵)。 横跨轮廓的红色路径表示动量学习规则所遵循的路径,它使该函数最小化。 我们在该路径的每个步骤画一个箭头,表示梯度下降将在该点采取的步骤。 我们可以看到,一个病态条件的二次目标函数看起来像一个长而窄的山谷或具有陡峭边的峡谷。 动量正确地纵向穿过峡谷,而普通的梯度步骤则会浪费时间在峡谷的窄轴上来回移动。 比较图4.6,它也显示了没有动量的梯度下降的行为。

[warning] [?]“动量用于解决随机梯度的方差”是什么意思?要看下原文,感觉是没翻译好

[success] 关于Hessian矩阵病态问题。 $\Delta \theta = \epsilon g$ 病态的Hessian矩阵对DL训练会产生问题,是因为上图中椭圆的长轴和短轴差别太大。而同样的学习率,在长轴方向上$\Delta \theta$效果不够,而难以收敛。在短轴方向上$\Delta \theta$用力过猛而来回震荡。 根据椭圆的曲率自适应地计算出合适的学习率,从而使得$\Delta \theta$在每个方向的表现都是合适的。 动量算法从另一个角度来解决问题,它保持学习率不变调整g。在长轴方向上,g因积累而越来越大,加速收敛(这句我觉得不对)。在短轴方向是,g因来回震荡而萎缩,抑制了震荡。 因为动量算法的原因,短轴方向的g会自动调小,这样可以设置较大的lr而不用担心短轴方向的震荡和不收敛。lr大了训练也就快了。但(不考虑增加lr)动量算法本身不能增大长轴方向的g,因为这个g是真实g的平均。真实g没有变,经过指数衰减后的g也不会自己变大。

动量算法

从形式上看,动量算法引入了变量$v$充当速度角色——它代表参数在参数空间移动的方向和速率。 速度被设为负梯度的指数衰减平均。

[success]

名称动量来自物理类比,根据牛顿运动定律,负梯度是移动参数空间中粒子的力。 动量在物理学上定义为质量乘以速度。 在动量学习算法中,我们假设是单位质量,因此速度向量$v$也可以看作是粒子的动量。 超参数$\alpha\in[0,1)$决定了之前梯度的贡献衰减得有多快。

[success] Ng补充:$\alpha$通常设置为0.9

更新规则如下:

v←αv−ϵ∇θ(1m∑i=1mL(f(x(i);θ),y(i)))θ←θ+v\begin{aligned} v & \leftarrow \alpha v - \epsilon \nabla_{\theta} \left( \frac{1}{m} \sum_{i=1}^m L(f(x^{(i)}; \theta), y^{(i)} ) \right) \\ \theta & \leftarrow \theta + v \end{aligned}vθ​←αv−ϵ∇θ​(m1​i=1∑m​L(f(x(i);θ),y(i)))←θ+v​

速度$v$累积了梯度元素$\nabla{\theta}( \frac{1}{m} \sum{i=1}^m L( f(x^{(i)}; \theta), y^{(i)} ) )$。

相对于$\epsilon$,$\alpha$越大,之前梯度对现在方向的影响也越大。 带动量的SGD算法如算法8.2所示。

\begin{algorithm}[ht]
\caption{使用动量的随机梯度下降(SGD)}
\label{alg:momentum}
\begin{algorithmic}
\REQUIRE 学习率 $\epsilon$, 动量参数 $\alpha$
\REQUIRE 初始参数 $\theta$,初始速度 $v$
\WHILE{没有达到停止准则}
    \STATE 从训练集中采包含$m$个样本$\{ x^{(1)},\cdots, x^{(m)}\}$ 的小批量,对应目标为$y^{(i)}$。
    \STATE 计算梯度估计:$g \leftarrow 
         \frac{1}{m} \nabla_{\theta} \sum_i L(f(x^{(i)};\theta),y^{(i)})$
    \STATE  计算速度更新:$v \leftarrow \alpha v - 
    \epsilon g$
    \STATE 应用更新:$\theta \leftarrow \theta + v$ 
\ENDWHILE
\end{algorithmic}
\end{algorithm}

之前,步长只是梯度范数乘以学习率。 现在,步长取决于梯度序列的大小和排列。 当许多连续的梯度指向相同的方向时,步长最大。 如果动量算法总是观测到梯度$g$,那么它会在方向$-g$上不停加速,直到达到最终速度,其中步长大小为

[info] 为什么步长公式里没有上一次的v?

ϵ∣∣g∣∣1−α\begin{aligned} \frac{\epsilon ||g||}{1-\alpha} \end{aligned}1−αϵ∣∣g∣∣​​

因此将动量的超参数视为$\frac{1}{1-\alpha}$有助于理解。 例如,$\alpha=0.9$对应着最大速度$10$倍于梯度下降算法。

在实践中,$\alpha$的一般取值为$0.5$,$0.9$和$0.99$。 和学习率一样,$\alpha$也会随着时间不断调整。 一般初始值是一个较小的值,随后会慢慢变大。 随着时间推移调整$\alpha$没有收缩$\epsilon$重要。

怎样理解动量算法

我们可以将动量算法视为模拟连续时间下牛顿动力学下的粒子。 这种物理类比有助于直觉上理解动量和梯度下降算法是如何表现的。

粒子在任意时间点的位置由$\theta(t)$给定。 粒子会受到净力$f(t)$。 该力会导致粒子加速:

f(t)=∂2∂t2θ(t)\begin{aligned} f(t) = \frac{\partial^2}{\partial t^2} \theta(t) \end{aligned}f(t)=∂t2∂2​θ(t)​

与其将其视为位置的二阶微分方程,我们不如引入表示粒子在时间$t$处速度的变量$v(t)$,将牛顿动力学重写为一阶微分方程:

v(t)=∂∂tθ(t)f(t)=∂∂tv(t)\begin{aligned} v(t) &= \frac{\partial}{\partial t} \theta(t) \\ f(t) &= \frac{\partial}{\partial t} v(t) \end{aligned}v(t)f(t)​=∂t∂​θ(t)=∂t∂​v(t)​

假设粒子的质量为1 $\theta(t)$ = t时刻的位置 $v(t) = \frac{\partial \theta}{\partial t}$ = t时刻的速度 = t时刻的动量 $f(t) = \frac{\partial v}{\partial t} = \frac{\partial^2 \theta}{\partial^2 t}$ = t时刻的力 = t时刻的加速度

由此,动量算法包括通过数值模拟求解微分方程。 求解微分方程的一个简单数值方法是欧拉方法,通过在每个梯度方向上小且有限的步来简单模拟该等式定义的动力学。

[success] 通过数值模拟求解微分方程?欧拉方法?

动量算法中的力

这解释了动量更新的基本形式,但具体是哪些力呢?

[success]

v=av−ϵgv = av - \epsilon gv=av−ϵg

作用力:$- \epsilon g$,正比于代价函数的负梯度的力 粘性阻力:av,正比于$-v(t)$的力

动力

一个力正比于代价函数的负梯度$-\nabla_{\theta} J(\theta)$。 该力推动粒子沿着代价函数表面下坡的方向移动。 梯度下降算法基于每个梯度简单地更新一步,而使用动量算法的牛顿方案则使用该力改变粒子的速度。 我们可以将粒子视作在冰面上滑行的冰球。 每当它沿着表面最陡的部分下降时,它会沿该方向加速滑行,直到开始向上滑动为止。

阻力

另一个力也是必要的。 如果代价函数的梯度是唯一的力,那么粒子可能永远不会停下来。 想象一下,假设理想情况下冰面没有摩擦,一个冰球从山谷的一端下滑,上升到另一端,永远来回振荡。 要解决这个问题,我们添加另一个正比于$-v(t)$的力。 在物理术语中,此力对应于粘性阻力,就像粒子必须通过一个抵抗介质,如糖浆。 这会导致粒子随着时间推移逐渐失去能量,最终收敛到局部极小点。

为什么要特别使用$-v(t)$和粘性阻力呢? 部分原因是因为$-v(t)$在数学上的便利——速度的整数幂很容易处理。 然而,其他物理系统具有基于速度的其他整数幂的其他类型的阻力。 例如,颗粒通过空气时会受到正比于速度平方的湍流阻力,而颗粒沿着地面移动时会受到恒定大小的摩擦力。 这些选择都不合适。 湍流阻力,正比于速度的平方,在速度很小时会很弱。 不够强到使粒子停下来。 非零值初始速度的粒子仅受到湍流阻力,会从初始位置永远地移动下去,和初始位置的距离大概正比于$O(\log t)$。 因此我们必须使用速度较低幂次的力。 如果幂次为零,相当于干摩擦,那么力太强了。 当代价函数的梯度表示的力很小但非零时,由于摩擦导致的恒力会使得粒子在达到局部极小点之前就停下来。 粘性阻力避免了这两个问题——它足够弱,可以使梯度引起的运动直到达到最小,但又足够强,使得坡度不够时可以阻止运动。

[success] 湍流阻力:$a v^2$ 干摩擦力:$a v^0$ 粘性阻力:$a v^1$

[success] 对比原始的随机梯度下降算法$v \leftarrow - \epsilon \nabla{\theta} \left( \frac{1}{m} \sum{i=1}^m L(f(x^{(i)}; \theta), y^{(i)} ) \right)$ 相当于$\alpha=0$,计算新速度时不考虑原速度。 一张图解释动量算法的过程:

[success] 计算梯度:$g \leftarrow \frac{1}{m} \nabla_{\theta} \sum_i L(f(x^{(i)};\theta),y^{(i)})$ 更新速度:$v \leftarrow \alpha v - \epsilon g$ 更新参数:$\theta \leftarrow \theta + v$ 以上过程中,“更新速度”这一步利用了的原理。 指数衰减平均: 更新速度:$v = \alpha v + (1-\alpha)g$ 更新参数:$\theta \leftarrow \theta + \epsilon v$ 在现在标准版本中,将“更新参数”中的$\epsilon$代替“更新速度”中的$(1-\alpha)$ 这样做的好处是:调度$\alpha$不影响$\epsilon$。

指数衰减平均
普通的梯度下降法会可能会卡平坦点、鞍点、局部最小点
指数级衰减的移动平均
具有病态问题的Hessian矩阵
DL中的病态问题
牛顿法
指数衰减平均