🎨
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
  • 什么是随机梯度下降法
  • 怎样设计SGD的学习率
  • 随机梯度下降法 VS 批量梯度下降法

Was this helpful?

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

8.3.1 随机梯度下降

Previous8.3 基本算法Next8.3.2 动量

Last updated 4 years ago

Was this helpful?

什么是随机梯度下降法

随机梯度下降及其变种很可能是一般机器学习中应用最多的优化算法,特别是在深度学习中。 如第8.1.3节中所讨论的,按照数据生成分布抽取$m$个小批量(独立同分布的)样本,通过计算它们梯度均值,我们可以得到梯度的无偏估计。

算法8.1展示了如何沿着这个梯度的估计下降。

怎样设计SGD的学习率

SGD算法中的一个关键参数是学习率。 之前,我们介绍的SGD使用固定的学习率。 在实践中,有必要随着时间的推移逐渐降低学习率,因此我们将第$k$步迭代的学习率记作$\epsilon_k$。

这是因为SGD中梯度估计引入的噪声源($m$个训练样本的随机采样)并不会在极小点处消失。 相比之下,当我们使用批量梯度下降到达极小点时,整个代价函数的真实梯度会变得很小,之后为$\mathbf{0}$,因此批量梯度下降可以使用固定的学习率。

[success] SGD引入的噪声不变而真实梯度变小,那么SGD的梯度的可靠性降低,因此使用逐渐降低的学习率。 使用有真实梯度没有噪声,因此可以使用固定学习率。 学习率衰减算法 from Ag

a=11+衰减率×epoch(1)a=0.95epoch(2)a=kepocha0(3)\begin{aligned} a = \frac{1}{1 + \text{衰减率} \times\text{epoch}} && (1) \\ a = 0.95^{\text{epoch}} && (2) \\ a = \frac{k}{\sqrt{\text{epoch}}}a_0 && (3) \\ \end{aligned}a=1+衰减率×epoch1​a=0.95epocha=epoch​k​a0​​​(1)(2)(3)​

说明: epoch是一次代码完整过一遍,不是一个batch跑一遍 有时会手动设置衰减,这是在跑模型的过程中,根据当时的状况调整参数。

保证SGD收敛的一个充分条件是

[warning] 8.12、8.13公式怎么推的?有什么指导意义?

∑k=1∞ϵk=∞(8.12)\begin{aligned} \sum_{k=1}^\infty \epsilon_k = \infty && (8.12) \end{aligned}k=1∑∞​ϵk​=∞​​(8.12)​

且

实践中,一般会线性衰减学习率直到第$\tau$次迭代:

其中$\alpha = \frac{k}{\tau}$。 在$\tau$步迭代之后,一般使$\epsilon$保持常数。

[warning] 如果$\epsilon$保持常数,就不满足8.13了。

学习率可通过试验和误差来选取,通常最好的选择方法是监测目标函数值随时间变化的学习曲线。 与其说是科学,这更像是一门艺术,我们应该谨慎地参考关于这个问题的大部分指导。 使用线性策略时,需要选择的参数为$\epsilon0$,$\epsilon\tau$,$\tau$。

通常$\tau$被设为需要反复遍历训练集几百次的迭代次数。 通常$\epsilon_\tau$应设为大约$\epsilon_0$的$1\%$。 主要问题是如何设置$\epsilon_0$。 若$\epsilon_0$太大,学习曲线将会剧烈振荡,代价函数值通常会明显增加。 温和的振荡是良好的,容易在训练随机代价函数(例如使用\,Dropout\,的代价函数)时出现。 如果学习率太小,那么学习过程会很缓慢。 如果初始学习率太低,那么学习可能会卡在一个相当高的代价值。 通常,就总训练时间和最终代价值而言,最优的初始学习率会高于在大约迭代$100$次左右后效果最佳的学习率。

[warning] 就是说,如果学习率选择得好,迭代100次左右就可以了?

因此,通常最好是检测最早的几轮迭代,选择一个比在效果上表现最佳的学习率更大的学习率,但又不能太大导致严重的震荡。

随机梯度下降法 VS 批量梯度下降法

SGD及相关的小批量亦或更广义的基于梯度优化的在线学习算法,一个重要的性质是每一步更新的计算时间不依赖完整训练集样本数目的多寡。 即使训练集样本数目非常大时,它们也能收敛。 对于足够大的数据集,SGD\,可能会在处理完整个训练集之前就收敛到最终测试集误差的某个固定容差范围内。

[success] "处理完整个训练集"是指把所有的训练数据都迭代一遍。

研究优化算法的收敛率,一般会衡量额外误差(excess error) $J(\theta) - \min_{\theta} J(\theta)$,即当前代价函数超出最低可能代价的量。

[warning] 什么是收敛率?与“额外误差”有什么关系?

SGD应用于凸问题时,$k$步迭代后的额外误差量级是$O(\frac{1}{\sqrt{k}})$,在强凸情况下是$O(\frac{1}{k})$。

除非假定额外的条件,否则这些界限不能进一步改进。 批量梯度下降在理论上比随机梯度下降有更好的收敛率。 然而,Cram\'er-Rao界限指出,泛化误差的下降速度不会快于$O(\frac{1}{k})$。 因此认为对于机器学习任务,不值得探寻收敛快于$O(\frac{1}{k})$的优化算法——更快的收敛可能对应着过拟合。 此外,渐近分析掩盖了随机梯度下降在少量更新步之后的很多优点。 对于大数据集,SGD只需非常少量样本计算梯度从而实现初始快速更新,其好处超过了其缓慢的渐近收敛带来的坏处。 本章剩余部分介绍的大多数算法致力于追求实践中有价值的好处,而不在意它的学习率有常数级别的额外误差(在渐进分析上比不上$O(\frac{1}{k})$的额外误差)。 我们也可以在学习过程中逐渐增大小批量的大小,以此权衡批量梯度下降和随机梯度下降两者的优点。

了解SGD更多的信息,请查看Bottou98。

∑k=1∞ϵk2<∞(8.13)\begin{aligned} \sum_{k=1}^\infty \epsilon_k^2 < \infty && (8.13) \end{aligned}k=1∑∞​ϵk2​<∞​​(8.13)​
ϵk=(1−α)ϵ0+αϵτ(8.14)\begin{aligned} \epsilon_k = (1-\alpha) \epsilon_0 + \alpha \epsilon_\tau && (8.14) \end{aligned}ϵk​=(1−α)ϵ0​+αϵτ​​​(8.14)​

[success] 线性策略,即公式8.14 $\tau$:使训练集遍历几百次 $\epsilon_\tau$:约为$\epsilon_0$的$1\%$ $\epsilon_0$:检测最早的几轮迭代,选择一个比在效果上表现最佳的学习率更大的学习率,但又不能太大导致严重的震荡。具体步骤在Nilson的书里有介绍。

[warning] ?

[success] Ng补充:SGD和BGD的比较 一个epoch是把所有样本pass through一遍 一个iteration是把一个batch pass through一遍 BGD每一步都是更接近最小值点,SGD的趋势是接近最小值点,但不一定每一次都是 BGD会无限接近最小值点,SGD会在最小值点附近徘徊,迭代的过程中逐渐调小lr,最后徘徊的区域会较小。 SGD的loss有noise,可以通过减少lr来缓解这个问题。 SGD loss speedup from向量化。而BGD make pross without waiting entire training。通过选择合适的batch size,得到收敛最快。

link
强凸问题
BGD