Salvador Dali's answer 已经解释了一些流行方法(即优化器)之间的差异,但我会尝试更多地详细说明它们。
(请注意,我们的回答在某些方面存在分歧,尤其是关于 ADAGRAD。)
经典动量 (CM) 与 Nesterov 加速梯度 (NAG)
(主要基于论文On the importance of initialization and momentum in deep learning中的第2部分。)
CM 和 NAG 中的每个步骤实际上都由两个子步骤组成:
- 动量子步骤 - 这只是最后一步的一小部分(通常在
[0.9,1) 范围内)。
- 依赖于梯度的子步骤 - 这与 SGD 中的常用步骤类似 - 它是学习率和与梯度相反的向量的乘积,而梯度是从该子步骤开始的位置计算的。
CM 先取梯度子步,而 NAG 先取动量子步。
这是来自an answer about intuition for CM and NAG的演示:
所以 NAG 似乎更好(至少在图像中),但为什么呢?
需要注意的重要一点是,动量子步骤何时到来并不重要 - 无论哪种方式都是一样的。因此,如果已经采取了动量子步骤,我们还不如采取行动。
因此,问题实际上是:假设梯度子步在动量子步之后进行,我们是否应该将梯度子步计算为从动量子步之前或之后的位置开始计算?
“在它之后”似乎是正确的答案,通常情况下,某个点的梯度 θ 大致将您指向从 θ 到最小值的方向(具有相对正确的幅度),而在某些点的梯度其他点不太可能将您指向从 θ 到最小值(具有相对正确的幅度)的方向。
这是一个演示(来自下面的 gif):
- 最小值是星星所在的位置,曲线是contour lines。 (有关等高线及其与渐变垂直的原因的说明,请参见传奇3Blue1Brown 的视频1 和2。)
- (长)紫色箭头是动量子步。
- 如果在动量子步骤之前开始,则透明的红色箭头是梯度子步骤。
- 如果黑色箭头在动量子步骤之后开始,则它是梯度子步骤。
- CM 最终会出现在暗红色箭头的目标中。
- NAG 最终会出现在黑色箭头的目标中。
请注意,为什么 NAG 更好的这个论点与算法是否接近最小值无关。
总的来说,NAG 和 CM 都经常存在积蓄多于对它们有利的动量的问题,因此每当它们应该改变方向时,它们都有一个尴尬的“响应时间”。我们解释过的 NAG 相对于 CM 的优势并不能避免问题,只是让 NAG 的“响应时间”不那么令人尴尬(但仍然令人尴尬)。
Alec Radford(出现在Salvador Dali's answer)在 gif 中精美地演示了这个“响应时间”问题:
阿达格拉德
(主要基于ADADELTA: An Adaptive Learning Rate Method(原 ADADELTA 论文)中的第 2.2.2 节,因为我发现它比 Adaptive Subgradient Methods for Online Learning and Stochastic Optimization(原 ADAGRAD 论文)更容易理解。)
在SGD 中,步长由- learning_rate * gradient 给出,而learning_rate 是一个超参数。
ADAGRAD 也有一个learning_rate 超参数,但梯度每个分量的实际学习率是单独计算的。
t-th 步骤的 i-th 组件由以下公式给出:
learning_rate
- --------------------------------------- * gradient_i_t
norm((gradient_i_1, ..., gradient_i_t))
同时:
-
gradient_i_k 是k-th 步骤中梯度的i-th 分量
-
(gradient_i_1, ..., gradient_i_t) 是一个带有 t 分量的向量。构造这样一个向量并不直观(至少对我而言),但这就是算法所做的(从概念上)。
-
norm(vector) 是 vector 的 Eucldiean norm(又名 l2 norm),这是我们对 vector 长度的直观概念。
- 令人困惑的是,在 ADAGRAD(以及其他一些方法)中,乘以
gradient_i_t(在本例中为 learning_rate / norm(...))的表达式通常称为“学习率”(实际上,我称之为“实际学习率”在上一段)。我猜这是因为SGD 中的learning_rate 超参数和这个表达式是一回事。
- 在实际实现中,会向分母添加一些常数,以防止被零除。
例如如果:
- 第一步渐变的
i-th分量是1.15
- 第二步中梯度的
i-th分量为1.35
- 第三步渐变的
i-th分量为0.9
那么(1.15, 1.35, 0.9)的范数就是黄线的长度,即:
sqrt(1.15^2 + 1.35^2 + 0.9^2) = 1.989.
所以第三步的i-th 组件是:- learning_rate / 1.989 * 0.9
请注意有关步骤的i-th 组件的两点:
- 与
learning_rate成正比。
- 在它的计算中,范数在增加,因此学习率在降低。
这意味着 ADAGRAD 对超参数 learning_rate 的选择很敏感。
此外,可能是一段时间后步数变得如此之小,以至于 ADAGRAD 几乎被卡住了。
ADADELTA 和 RMSProp
来自ADADELTA paper:
本文提出的想法源自 ADAGRAD,以改进两个主要缺点
该方法的:1)学习率的不断衰减
在整个培训过程中,以及 2) 需要手动选择
全局学习率。
该论文随后解释了一项旨在解决第一个缺点的改进:
而不是累积所有梯度的平方和
时间,我们限制了过去累积的梯度窗口
是一些固定大小w [...]。这确保了学习的继续
即使经过多次更新迭代也取得进展
已经完成了。
由于存储w之前的平方梯度效率低下,
我们的方法将这种累积实现为指数
平方梯度的衰减平均值。
通过“平方梯度的指数衰减平均值”,该论文意味着对于每个i,我们计算所有已计算梯度的平方i-th 分量的加权平均值。
每个i-th 平方分量的权重大于上一步中i-th 平方分量的权重。
这是大小为w 的窗口的近似值,因为前面步骤中的权重非常小。
(当我想到一个指数衰减的平均值时,我喜欢将comet's 轨迹可视化,随着它离彗星越来越远,它变得越来越暗:
)
如果您只对 ADAGRAD 进行此更改,那么您将获得 RMSProp,这是 Geoff Hinton 在Lecture 6e of his Coursera Class 中提出的一种方法。
所以在 RMSProp 中,t-th 步骤的 i-th 组件由以下公式给出:
learning_rate
- ------------------------------------------------ * gradient_i_t
sqrt(exp_decay_avg_of_squared_grads_i + epsilon)
同时:
-
epsilon 是一个防止被零除的超参数。
-
exp_decay_avg_of_squared_grads_i 是所有计算梯度(包括 gradient_i_t)的平方 i-th 分量的指数衰减平均值。
但如前所述,ADADELTA 还旨在摆脱 learning_rate 超参数,因此其中肯定有更多内容。
在 ADADELTA 中,t-th 步骤的 i-th 组件由以下公式给出:
sqrt(exp_decay_avg_of_squared_steps_i + epsilon)
- ------------------------------------------------ * gradient_i_t
sqrt(exp_decay_avg_of_squared_grads_i + epsilon)
虽然exp_decay_avg_of_squared_steps_i 是计算的所有步骤的平方i-th 分量的指数衰减平均值(直到t-1-th 步骤)。
sqrt(exp_decay_avg_of_squared_steps_i + epsilon) 有点类似于动量,根据the paper,它“充当加速项”。 (论文还给出了添加它的另一个原因,但我的答案已经太长了,所以如果你好奇,请查看第 3.2 节。)
亚当
(主要基于 Adam: A Method for Stochastic Optimization,亚当的原始论文。)
Adam 是 Adaptive Moment Estimation 的缩写(有关名称的说明,请参阅 this answer)。
t-th 步骤的 i-th 组件由以下公式给出:
learning_rate
- ------------------------------------------------ * exp_decay_avg_of_grads_i
sqrt(exp_decay_avg_of_squared_grads_i) + epsilon
同时:
-
exp_decay_avg_of_grads_i 是计算的所有梯度(包括 gradient_i_t)的 i-th 分量的指数衰减平均值。
- 实际上,
exp_decay_avg_of_grads_i 和 exp_decay_avg_of_squared_grads_i 也都已更正以说明对0 的偏见(有关更多信息,请参阅the paper 中的第 3 部分,以及 an answer in stats.stackexchange)。
请注意,Adam 使用梯度的 i-th 分量的指数衰减平均值,而大多数 SGD 方法使用当前梯度的 i-th 分量。这导致 Adam 表现得像“一个有摩擦力的重球”,正如论文 GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium 中所解释的那样。
有关 Adam 的类动量行为与通常的类动量行为有何不同的更多信息,请参阅 this answer。