序言
在深度学习中,模型优化是提升模型性能与收敛速度的关键环节。传统固定学习率的优化方法,如梯度下降法,往往难以适应复杂的训练过程,易导致学习率过大引发震荡或学习率过小导致收敛缓慢。为此,具有自适应学习速率的优化算法应运而生,它们能够根据训练过程中的梯度变化动态调整学习率,从而提高模型的训练效率和性能。
具有自适应学习速率的算法
- 神经网络研究员早就意识到学习速率肯定是难以设置的超参数之一,因为它对模型的性能有显著的影响。正如我们在数值计算篇 - 基于梯度的优化方法和神经网络优化中的挑战篇中探讨的,损失通常高度敏感于参数空间中的某些方向,而不敏感于其他。 动量算法可以在一定程度缓解这些问题,但这样做的代价是引入了另一个超参数。在这种情况下,自然会问有没有其他方法。如果我们相信方向敏感度有些轴对齐,那么每个参数设置不同的学习速率,在整个学习过程中自动适应这些学习速率便是有道理的。
- delta-bar-delta算法 ( Jacobs, 1988 \text{Jacobs, 1988} Jacobs, 1988)是一个早期的在训练时适应模型参数单独学习速率的启发式方法。该方法基于一个很简单的想法,如果损失对于某个给定模型参数的偏导保持相同的符号,那么学习速率应该增加。如果对于该参数的偏导变化了符号,那么学习速率应减小。当然,这种方法只能应用于全 batch \text{batch} batch优化中。
- 最近,一些增量(或者基于 minibatch \text{minibatch} minibatch)的算法被提出适应模型参数的学习速率。这节将简要回顾一些这种算法。
A d a G r a d \bold{AdaGrad} AdaGrad
-
A
d
a
G
r
a
d
\bold{AdaGrad}
AdaGrad算法,如算法1独立地适应所有模型参数的学习速率,放缩每个参数反比于其所有梯度历史平方值总和的平方根(
Duchi et al., 2011
\text{Duchi et al., 2011}
Duchi et al., 2011)。
- 具有损失最大偏导的参数相应地有一个快速下降的学习速率,而具有小偏导的参数在学习速率上有相对较小的下降。
- 净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。
- 在凸优化背景中, AdaGrad \text{AdaGrad} AdaGrad算法具有一些令人满意的理论性质。然而,经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习速率过早和过量的减小。 AdaGrad \text{AdaGrad} AdaGrad在某些深度学习模型上效果不错,但不是全部。
R M S P r o p \bold{RMSProp} RMSProp
-
R
M
S
P
r
o
p
\bold{RMSProp}
RMSProp算法(Hinton, 2012)修改
AdaGrad
\text{AdaGrad}
AdaGrad以在非凸设定下效果更好,改变梯度积累为指数加权的移动均值。
- AdaGrad \text{AdaGrad} AdaGrad旨在应用于凸问题时快速收敛。
- 当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一个局部是凸碗的区域。
- AdaGrad \text{AdaGrad} AdaGrad 根据平方梯度的整个历史收缩学习速率,可能使得学习速率在达到这样的凸结构前就变得太小了。
- RMSProp \text{RMSProp} RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在找到凸碗状结构后快速收敛,它就像一个初始化于该碗状结构的 AdaGrad \text{AdaGrad} AdaGrad算法实例。
- RMSProp \text{RMSProp} RMSProp的标准形式如算法2结合 Nesterov \text{Nesterov} Nesterov动量的形式如算法3所示。相比于 AdaGrad \text{AdaGrad} AdaGrad,使用移动均值引入了一个新的超参数 ρ \rho ρ,控制移动平均的长度范围。
- 经验上, RMSProp \text{RMSProp} RMSProp已被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。
A d a m \bold{Adam} Adam
-
A
d
a
m
\bold{Adam}
Adam(
Kingma and Ba, 2014
\text{Kingma and Ba, 2014}
Kingma and Ba, 2014)是另一种学习速率自适应的优化算法,如算法4所示。”
Adam
\text{Adam}
Adam“这个名字派生自短语”
Adaptive moments
\text{Adaptive moments}
Adaptive moments“。
- 早期算法背景下,它也许最好被看作结合 RMSProp \text{RMSProp} RMSProp和具有一些重要区别的动量的变种。
- 首先,在 Adam \text{Adam} Adam中, 动量直接并入了梯度一阶矩(带指数加权)的估计。将动量加入 RMSProp \text{RMSProp} RMSProp最直观的方法是应用动量于缩放后的梯度。结合重放缩的动量使用没有明确的理论动机。
- 其次, Adam \text{Adam} Adam包括负责原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计修正偏置(算法4)。 RMSProp \text{RMSProp} RMSProp也采用了(非中心的)二阶矩估计,然而缺失了修正因子。
- 因此,不像 Adam \text{Adam} Adam, RMSProp \text{RMSProp} RMSProp二阶矩估计可能在训练初期有很高的偏置。 Adam \text{Adam} Adam通常被认为对超参数的选择相当鲁棒,尽管学习速率有时需要从建议的默认修改。
选择正确的优化算法
-
我们讨论了一系列算法,通过自适应每个模型参数的学习速率以解决优化深度模型中的难题。此时,一个自然的问题是:该选择哪种算法呢?
-
遗憾的是,目前在这一点上没有达成共识。
- Schaul et al. (2014) \text{Schaul et al. (2014)} Schaul et al. (2014)展示了许多优化算法在大量学习任务上的价值比较。
- 虽然结果表明,具有自适应学习速率(由 RMSProp \text{RMSProp} RMSProp和 AdaDelta \text{AdaDelta} AdaDelta代表的算法族表现得相当鲁棒,但没有单一的算法表现为最好的。
-
目前,最流行的活跃使用的优化算法包括 SGD \text{SGD} SGD,具动量的 SGD \text{SGD} SGD, RMSProp \text{RMSProp} RMSProp,具动量的 RMSProp \text{RMSProp} RMSProp, AdaDelta \text{AdaDelta} AdaDelta和 Adam \text{Adam} Adam。
-
此时,选择哪一个算法似乎主要取决于使用者对算法的熟悉程度(以便调节超参数)。
-
算法1: AdaGrad \text{AdaGrad} AdaGrad算法
算法1描述: AdaGrad \text{AdaGrad} AdaGrad算法
伪代码:
R e q u i r e \bold{Require} Require: 全局学习速率 ϵ \epsilon ϵ
R e q u i r e \bold{Require} Require: 初始参数 θ \boldsymbol{\theta} θ
R e q u i r e \bold{Require} Require: 小常数 δ \delta δ,为了数值稳定大约设为 1 0 − 7 10^{-7} 10−7
\quad 初始化梯度累积变量 r = 0 \boldsymbol{r}=0 r=0
w h i l e \quad\bold{while} while 没有达到停止准则 d o \bold{do} do
\qquad 从训练集中采包含 m m m个样本 { x ( i ) , … , x ( m ) } \{\boldsymbol{x}^{(i)},\dots,\boldsymbol{x}^{(m)}\} {x(i),…,x(m)}的 minibatch \text{minibatch} minibatch,对应目标为 y ( i ) \boldsymbol{y}^{(i)} y(i)
\qquad 计算梯度: g ← 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) \boldsymbol{g}\gets\frac{1}{m}\nabla_{\boldsymbol{\theta}}\sum_i L(f(\boldsymbol{x}^{(i)};\boldsymbol{\theta}),\boldsymbol{y}^{(i)}) g←m1∇θ∑iL(f(x(i);θ),y(i))
\qquad 累积平方梯度: r ← r + g ⊙ g \boldsymbol{r}\gets\boldsymbol{r}+\boldsymbol{g}\odot\boldsymbol{g} r←r+g⊙g
\qquad 计算更新: Δ θ ← − ϵ δ + r ⊙ g \Delta\boldsymbol{\theta}\gets-\frac{\epsilon}{\delta+\sqrt{\boldsymbol{r}}}\odot\boldsymbol{g} Δθ←−δ+rϵ⊙g
\qquad 应用更新: θ ← θ + Δ θ \boldsymbol{\theta}\gets\boldsymbol{\theta}+\Delta\boldsymbol{\theta} θ←θ+Δθ
e n d \quad\bold{end} end w h i l e \bold{while} while
-
算法2: RMSProp \text{RMSProp} RMSProp算法
算法2描述: RMSProp \text{RMSProp} RMSProp算法
伪代码:
R e q u i r e \bold{Require} Require: 全局学习速率 ϵ \epsilon ϵ,衰减速率 ρ \rho ρ
R e q u i r e \bold{Require} Require: 初始参数 θ \boldsymbol{\theta} θ
R e q u i r e \bold{Require} Require: 小常数 δ \delta δ,为了数值稳定大约设为 1 0 − 6 10^{-6} 10−6(用于被小数除时的数值稳定)
\quad 初始化累积变量 r = 0 \boldsymbol{r}=0 r=0
w h i l e \quad\bold{while} while 没有达到停止准则 d o \bold{do} do
\qquad 从训练集中采包含 m m m个样本 { x ( i ) , … , x ( m ) } \{\boldsymbol{x}^{(i)},\dots,\boldsymbol{x}^{(m)}\} {x(i),…,x(m)}的 minibatch \text{minibatch} minibatch,对应目标为 y ( i ) \boldsymbol{y}^{(i)} y(i)
\qquad 计算梯度: g ← 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) \boldsymbol{g}\gets\frac{1}{m}\nabla_{\boldsymbol{\theta}}\sum_i L(f(\boldsymbol{x}^{(i)};\boldsymbol{\theta}),\boldsymbol{y}^{(i)}) g←m1∇θ∑iL(f(x(i);θ),y(i))
\qquad 累积平方梯度: r ← ρ r + ( 1 − ρ ) g ⊙ g \boldsymbol{r}\gets\rho\boldsymbol{r}+(1-\rho)\boldsymbol{g}\odot\boldsymbol{g} r←ρr+(1−ρ)g⊙g
\qquad 计算参数更新: Δ θ = − ϵ δ + r ⊙ g \Delta\boldsymbol{\theta}=-\frac{\epsilon}{\delta+\sqrt{\boldsymbol{r}}}\odot\boldsymbol{g} Δθ=−δ+rϵ⊙g ( 1 δ + r \frac{1}{\delta+\sqrt{\boldsymbol{r}}} δ+r1逐元素应用)
\qquad 应用更新: θ ← θ + Δ θ \boldsymbol{\theta}\gets\boldsymbol{\theta}+\Delta\boldsymbol{\theta} θ←θ+Δθ
e n d \quad\bold{end} end w h i l e \bold{while} while
-
算法3:使用 Nesterov动量的 \text{Nesterov}动量的 Nesterov动量的 RMSProp \text{RMSProp} RMSProp算法
算法3描述:使用 Nesterov动量的 \text{Nesterov}动量的 Nesterov动量的 RMSProp \text{RMSProp} RMSProp算法
伪代码:
R e q u i r e \bold{Require} Require: 全局学习速率 ϵ \epsilon ϵ,衰减速率 ρ \rho ρ,动量系数 α \alpha α
R e q u i r e \bold{Require} Require: 初始参数 θ \boldsymbol{\theta} θ,初始速度 v \boldsymbol{v} v
\quad 初始化累积变量 r = 0 \boldsymbol{r}=0 r=0
w h i l e \quad\bold{while} while 没有达到停止准则 d o \bold{do} do
\qquad 从训练集中采包含 m m m个样本 { x ( i ) , … , x ( m ) } \{\boldsymbol{x}^{(i)},\dots,\boldsymbol{x}^{(m)}\} {x(i),…,x(m)}的 minibatch \text{minibatch} minibatch,对应目标为 y ( i ) \boldsymbol{y}^{(i)} y(i)
\qquad 计算临时更新: θ ~ ← θ + α v \tilde{\theta}\gets\boldsymbol{\theta}+\alpha\boldsymbol{v} θ~←θ+αv
\qquad 计算梯度: g ← 1 m ∇ θ ~ ∑ i L ( f ( x ( i ) ; θ ~ ) , y ( i ) ) \boldsymbol{g}\gets\frac{1}{m}\nabla_{\tilde{\boldsymbol{\theta}}}\sum_i L(f(\boldsymbol{x}^{(i)};\tilde{\boldsymbol{\theta}}),\boldsymbol{y}^{(i)}) g←m1∇θ~∑iL(f(x(i);θ~),y(i))
\qquad 累积梯度: r ← ρ r + ( 1 − ρ ) g ⊙ g \boldsymbol{r}\gets\rho\boldsymbol{r}+(1-\rho)\boldsymbol{g}\odot\boldsymbol{g} r←ρr+(1−ρ)g⊙g
\qquad 计算速度更新: v ← α v − ϵ r ⊙ g \boldsymbol{v}\gets\alpha\boldsymbol{v}-\frac{\epsilon}{\sqrt{\boldsymbol{r}}}\odot\boldsymbol{g} v←αv−rϵ⊙g ( 1 r \frac{1}{\sqrt{\boldsymbol{r}}} r1逐元素应用)
\qquad 应用更新: θ ← θ + v \boldsymbol{\theta}\gets\boldsymbol{\theta}+\boldsymbol{v} θ←θ+v
e n d \quad\bold{end} end w h i l e \bold{while} while
-
算法4: Adam \text{Adam} Adam算法
算法4描述: Adam \text{Adam} Adam算法
伪代码:
R e q u i r e \bold{Require} Require: 步长 ϵ \epsilon ϵ(建议默认为: 0.001 0.001 0.001)
R e q u i r e \bold{Require} Require: 矩估计的指数衰减速率, ρ 1 \rho_1 ρ1和 ρ 2 \rho_2 ρ2在区间 [0,1) \text{[0,1)} [0,1)内。(建议默认为:分别为 0.9 0.9 0.9和 0.999 0.999 0.999)
R e q u i r e \bold{Require} Require: 用于数值稳定的小常数 δ \delta δ(建议默认为: 1 0 − 8 10^{-8} 10−8)
R e q u i r e \bold{Require} Require: 初始参数 θ \boldsymbol{\theta} θ
\quad 初始化一阶和二阶矩变量 s = 0 , r = 0 \boldsymbol{s}=0,\boldsymbol{r}=0 s=0,r=0
\quad 初始化时间步 t = 0 t=0 t=0
w h i l e \quad\bold{while} while 没有达到停止准则 d o \bold{do} do
\qquad 从训练集中采包含 m m m个样本 { x ( i ) , … , x ( m ) } \{\boldsymbol{x}^{(i)},\dots,\boldsymbol{x}^{(m)}\} {x(i),…,x(m)}的 minibatch \text{minibatch} minibatch,对应目标为 y ( i ) \boldsymbol{y}^{(i)} y(i)
\qquad 计算梯度: g ← 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) \boldsymbol{g}\gets\frac{1}{m}\nabla_{\boldsymbol{\theta}}\sum_i L(f(\boldsymbol{x}^{(i)};\boldsymbol{\theta}),\boldsymbol{y}^{(i)}) g←m1∇θ∑iL(f(x(i);θ),y(i))
t ← t + 1 \qquad t\gets t+1 t←t+1
\qquad 更新有偏一阶矩估计: s ← ρ 1 s + ( 1 − ρ 1 ) g \boldsymbol{s}\gets\rho_1\boldsymbol{s}+(1-\rho_1)\boldsymbol{g} s←ρ1s+(1−ρ1)g
\qquad 更新有偏二阶矩估计: r ← ρ 2 r + ( 1 − ρ 2 ) g ⊙ g \boldsymbol{r}\gets\rho_2\boldsymbol{r}+(1-\rho_2)\boldsymbol{g}\odot\boldsymbol{g} r←ρ2r+(1−ρ2)g⊙g
\qquad 修正一阶矩的偏差: s ^ ← s 1 − ρ 1 t \hat{\boldsymbol{s}}\gets\frac{\boldsymbol{s}}{1-\rho_1^t} s^←1−ρ1ts
\qquad 修正二阶矩的偏差: r ^ ← r 1 − ρ 2 t \hat{\boldsymbol{r}}\gets\frac{\boldsymbol{r}}{1-\rho_2^t} r^←1−ρ2tr
\qquad 计算更新: Δ θ = − ϵ s ^ r ^ + δ \Delta\boldsymbol{\theta}=-\epsilon\frac{\hat{\boldsymbol{s}}}{\sqrt{\hat{\boldsymbol{r}}}+\delta} Δθ=−ϵr^+δs^ (逐元素应用操作)
\qquad 应用更新: θ ← θ + Δ θ \boldsymbol{\theta}\gets\boldsymbol{\theta}+\Delta\boldsymbol{\theta} θ←θ+Δθ
e n d \quad\bold{end} end w h i l e \bold{while} while
总结
-
自适应学习速率优化算法,如 AdaGrad \text{AdaGrad} AdaGrad、 RMSprop \text{RMSprop} RMSprop、 Adam \text{Adam} Adam和 AdaDelta \text{AdaDelta} AdaDelta等,通过累积历史梯度信息,智能地调整每个参数的学习率。
- AdaGrad \text{AdaGrad} AdaGrad通过累积梯度平方的平均值调整学习率,适用于稀疏特征;
- RMSprop \text{RMSprop} RMSprop则通过指数加权平均的方式改进了 AdaGrad \text{AdaGrad} AdaGrad,解决了学习率衰减过快的问题;
- Adam \text{Adam} Adam结合了动量和自适应学习率,综合考虑梯度的一阶矩和二阶矩估计,具有较快的收敛速度和较好的性能;
- AdaDelta \text{AdaDelta} AdaDelta则无需手动设置学习率,通过移动平均梯度的二阶矩估计自动调整。
-
这些算法在深度学习中广泛应用,显著提升了模型的训练效果和性能,是深度学习优化领域的重要研究方向。
-
未来,随着深度学习技术的不断发展,自适应学习速率优化算法将持续演进,为深度学习模型的优化提供更加有力的支持。