7.9k 7 分钟

# AdaGrad 算法 🏷 sec_adagrad 我们从有关特征学习中并不常见的问题入手。 # 稀疏特征和学习率 假设我们正在训练一个语言模型。 为了获得良好的准确性,我们大多希望在训练的过程中降低学习率,速度通常为O(t−12)\mathcal{O}(t^{-\frac{1}{2}})O(t−21​) 或更低。 现在讨论关于稀疏特征(即只在偶尔出现的特征)的模型训练,这对自然语言来说很常见。 例如,我们看到 “预先条件” 这个词比 “学习”...
2.6k 2 分钟

# Adadelta 🏷 sec_adadelta Adadelta 是 AdaGrad 的另一种变体( :numref: sec_adagrad ), 主要区别在于前者减少了学习率适应坐标的数量。 此外,广义上 Adadelta 被称为没有学习率,因为它使用变化量本身作为未来变化的校准。 Adadelta 算法是在 :cite: Zeiler.2012 中提出的。 # Adadelta 算法 简而言之,Adadelta 使用两个状态变量,st\mathbf{s}_tst​ 用于存储梯度二阶导数的泄露平均值,Δxt\Delta\mathbf{x}_tΔxt​...
7.7k 7 分钟

# 循环神经网络 🏷 sec_rnn 在 :numref: sec_language_model 中, 我们介绍了nnn 元语法模型, 其中单词xtx_txt​ 在时间步ttt 的条件概率仅取决于前面n−1n-1n−1 个单词。 对于时间步t−(n−1)t-(n-1)t−(n−1) 之前的单词, 如果我们想将其可能产生的影响合并到xtx_txt​ 上, 需要增加nnn,然而模型参数的数量也会随之呈指数增长, 因为词表V\mathcal{V}V 需要存储∣V∣n|\mathcal{V}|^n∣V∣n 个数字, 因此与其将P(xt∣xt−1,…,xt−n+1)P(x_t \mid...
4.8k 4 分钟

# Adam 算法 🏷 sec_adam 本章我们已经学习了许多有效优化的技术。 在本节讨论之前,我们先详细回顾一下这些技术: 在 :numref: sec_sgd 中,我们学习了:随机梯度下降在解决优化问题时比梯度下降更有效。 在 :numref: sec_minibatch_sgd 中,我们学习了:在一个小批量中使用更大的观测值集,可以通过向量化提供额外效率。这是高效的多机、多 GPU 和整体并行处理的关键。 在 :numref: sec_momentum 中我们添加了一种机制,用于汇总过去梯度的历史以加速收敛。 在 :numref: sec_adagrad...
13k 12 分钟

# 凸性 🏷 sec_convexity 凸性(convexity)在优化算法的设计中起到至关重要的作用, 这主要是由于在这种情况下对算法进行分析和测试要容易。 换言之,如果算法在凸性条件设定下的效果很差, 那通常我们很难在其他条件下看到好的结果。 此外,即使深度学习中的优化问题通常是非凸的, 它们也经常在局部极小值附近表现出一些凸性。 这可能会产生一些像 :cite: Izmailov.Podoprikhin.Garipov.ea.2018 这样比较有意思的新优化变体。 %matplotlib inlineimport numpy as npimport torchfrom...
11k 10 分钟

# 梯度下降 🏷 sec_gd 尽管梯度下降(gradient descent)很少直接用于深度学习, 但了解它是理解下一节随机梯度下降算法的关键。 例如,由于学习率过大,优化问题可能会发散,这种现象早已在梯度下降中出现。 同样地,预处理(preconditioning)是梯度下降中的一种常用技术, 还被沿用到更高级的算法中。 让我们从简单的一维梯度下降开始。 # 一维梯度下降 为什么梯度下降算法可以优化目标函数? 一维中的梯度下降给我们很好的启发。 考虑一类连续可微实值函数f:R→Rf: \mathbb{R} \rightarrow...
543 1 分钟

# 优化算法 🏷 chap_optimization 截止到目前,本书已经使用了许多优化算法来训练深度学习模型。优化算法使我们能够继续更新模型参数,并使损失函数的值最小化。这就像在训练集上评估一样。事实上,任何满足于将优化视为黑盒装置,以在简单的设置中最小化目标函数的人,都可能会知道存在着一系列此类 “咒语”(名称如 “SGD” 和...
10k 9 分钟

# 动量法 🏷 sec_momentum 在 :numref: sec_sgd 一节中,我们详述了如何执行随机梯度下降,即在只有嘈杂的梯度可用的情况下执行优化时会发生什么。 对于嘈杂的梯度,我们在选择学习率需要格外谨慎。 如果衰减速度太快,收敛就会停滞。 相反,如果太宽松,我们可能无法收敛到最优解。 # 基础 本节将探讨更有效的优化算法,尤其是针对实验中常见的某些类型的优化问题。 #...
8k 7 分钟

# 学习率调度器 🏷 sec_scheduler 到目前为止,我们主要关注如何更新权重向量的优化算法,而不是它们的更新速率。 然而,调整学习率通常与实际算法同样重要,有如下几方面需要考虑: 首先,学习率的大小很重要。如果它太大,优化就会发散;如果它太小,训练就会需要过长时间,或者我们最终只能得到次优的结果。我们之前看到问题的条件数很重要(有关详细信息,请参见 :numref: sec_momentum )。直观地说,这是最不敏感与最敏感方向的变化量的比率。 其次,衰减速率同样很重要。如果学习率持续过高,我们可能最终会在最小值附近弹跳,从而无法达到最优解。 :numref:...
8.2k 7 分钟

# 小批量随机梯度下降 🏷 sec_minibatch_sgd 到目前为止,我们在基于梯度的学习方法中遇到了两个极端情况: :numref: sec_gd 中使用完整数据集来计算梯度并更新参数, :numref: sec_sgd 中一次处理一个训练样本来取得进展。 二者各有利弊:每当数据非常相似时,梯度下降并不是非常 “数据高效”。 而由于 CPU 和 GPU 无法充分利用向量化,随机梯度下降并不特别 “计算高效”。 这暗示了两者之间可能有折中方案,这便涉及到小批量随机梯度下降(minibatch gradient descent)。 #...