第7章 优化与深度学习

本文深入探讨了深度学习中的优化算法,包括随机梯度下降、小批量随机梯度下降、动量法,以及一系列自适应学习率算法,如AdaGrad、RMSProp、AdaDelta和Adam。通过这些算法,可以更有效地训练神经网络模型,解决梯度消失和发散等问题。
摘要由CSDN通过智能技术生成

7.2.4 随机梯度下降

在深度学习中,目标函数通常是训练数据集中有各个样本损失函数的平均。

损失函数:
f ( x ) = 1 n ∑ i = 1 n f i ( x ) f(x)= \frac{1}{n}\sum_{i=1}^nf_i(x) f(x=n1i=1nfi(x)

  • n是训练数据样本数
  • x是模型的参数向量

随机梯度下降(stochastic gradient descent, SGD)减小了每次迭代的计算开销。 而随机梯度下降在每次迭代中只随机采样⼀个样本来计算梯度

7.3 小批量随机梯度下降

使用一个小批量的平均梯度来更新参数

7.4 动量法

目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。

7.4.1 梯度下降的问题

如果自变量的迭代方向仅仅取决于自变量当前的位置,在不同的维度/方向上,权重跟新的量级可能有很大的差异。

7.4.2 动量法

设时间 t t t的自变量为 x t x_t xt,学习率为 η t \eta_t ηt。在时间步0,动量法创建速度变量 v 0 v_0 v0,并将其元素初始化成0,在时间步 t > 0 t > 0 t>0,动量法对每次迭代的步骤做如下修改:
v t ← γ v t − 1 + η t g t , x t ← x t − 1 − v t v_t \leftarrow \gamma v_{t-1}+\eta_t g_t, \\ x_t \leftarrow x_{t-1} - v_t vtγvt1+ηtgt,xtxt1vt
γ \gamma γ范围是 [ 0 , 1 ) [0,1) [0,1),当 γ = 0 \gamma = 0 γ=0时,动量法等价于小批量随机梯度下降。

相比于小批量随机梯度下降,动量法在每个时间步的自变量更新量近似于将前者对应的最近 1 1 − γ \frac{1}{1- \gamma} 1γ1个时间步的更新做了指数加权移动平均后再除以 1 − γ 1-\gamma 1γ。所以,在动量法中,自变量在各个方向上的移动幅度不仅取决于当前速度,还取决于过去的各个梯度在各个方向上是否一致。

小结
  • 动量法使用了指数加权移动平均的思想。它将过去时间步的梯度做了加权平均,且权重按时间步指数衰减。
  • 动量法使得相邻时间步的自变量更新在方向上更加一致。

7.5 AdaGrad算法

动量法依赖指数加权移动平均使得自变量的更新方向更加一致,从而降低发散的可能。

AdaGrad算法:根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。

7.5.1 算法

AdaGrad算法会使用一个小批量随机梯度 g t g_t gt按元素平方的累加变量 s t s_t st。在时间步0,AdaGrad将 s 0 s_0 s0中每个元素初始化为0。在时间步 t t t,首先将小批量随机梯度 g t g_t gt按元素平方后累加到变量 s t s_t st
s t ← s t − 1 + g t ⨀ g t s_t \leftarrow s_{t-1} + g_t \bigodot g_t stst1+gtgt
接着,将目标函数自变量中每个元素的学习率通过按元素运算重新调整以下:

x t ← x t − 1 − η s t + ϵ ⨀ g t x_t \leftarrow x_{t-1}-\frac{\eta}{\sqrt{s_t + \epsilon}} \bigodot g_t xtxt1st+ϵ ηgt

  • η \eta η: 学习率
  • ϵ \epsilon ϵ:为了位置数值稳定性而添加的常数,如 1 0 − 6 10^{-6} 106
  • 开方,除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率。

7.5.2 特点

小批量随机梯度按元素平方的累加变量 s t s_t st出现在学习率的分母项中。如果目标函数有关自变量中某个元素的偏导数一直都比较大,那么该元素的学习率将下降较快;反之,如果目标函数有关自变量中某个元素的偏导数一直都较小,那么该元素的学习率将下降较慢。然而,由于 s t s_t st一直在累加按元素平方的梯度,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。所以,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用得解。

小结
  • AdaGrad算法在迭代过程中不断调整学习率,并让目标函数自变量中每个元素都分别有自己的学习率
  • 使用AdaGrad算法时,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。

7.6 RMSProp算法

为了解决AdaGrad算法的缺点。提出RMSProp算法对AdaGrad算法做了一点小小的修改。

RMSProp:指数加权平均移动AdaGrad

7.6.1 算法

不同于AdaGrad算法里状态变量 s t s_t st是截止时间步所有小批量随机梯度 g t g_t gt按元素平方和 ,RMSProp算法将这些梯度按元素平方做指数加权移动平均。给定超参数 0 ≤ γ < 1 0 \leq \gamma < 1 0γ<1 ,RMSProp算法在时间步 t > 0 t>0 t>0计算

s t ← γ s t − 1 + ( 1 − γ ) g t ⨀ g t x t ← x t − 1 − η s t + ϵ ⨀ g t s_t \leftarrow \gamma s_{t-1}+(1-\gamma)g_t \bigodot g_t \\ x_t \leftarrow x_{t-1} - \frac{\eta}{\sqrt{s_t + \epsilon}} \bigodot g_t stγst1+(1γ)gtgtxtxt1st+ϵ ηgt

  • η \eta η: 学习率
  • ϵ \epsilon ϵ:为了位置数值稳定性而添加的常数,如 1 0 − 6 10^{-6} 106

因为RMSProp算法的状态变量 s t s_t st是对平方项 g t ⨀ g t g_t \bigodot g_t gtgt的指数加权移动平均,所有可以看作最近 1 / ( 1 − γ ) 1/(1-\gamma) 1/(1γ)个时间步的小批量随机梯度平方项的加权平均。这样,自变量每个元素的学习率在迭代过程中就不再一直降低或不变了。

7.7 AdaDelta算法

7.7.1 算法

AdaDelta算法也像RMSProp算法一样,使用了小批量随机梯度 g t g_t gt按元素平方的指数加权移动平均变量 s t s_t st。在时间步0,它的所有元素被初始化为0。给定超参数 0 ≤ 0 < 1 0 \leq 0 < 1 00<1(对应RMSProp算法中的 γ \gamma γ),在时间步 t > 0 t > 0 t>0,同RMSProp算法一样计算
s t ← ρ s t − 1 + ( 1 − ρ ) g t ⨀ g t s_t \leftarrow \rho s_{t-1} + (1-\rho)g_t \bigodot g_t stρst1+(1ρ)gtgt

与RMSProp算法不同的是,AdaDelta算法还维护一个额外的状态变量 Δ x t − 1 \Delta x_{t-1} Δxt1,其元素同样在时间步0时被初始化为0。使用 Δ x t − 1 \Delta x_{t-1} Δxt1来计算自变量的变化量:
g t ′ ← Δ x t − 1 + ϵ s t + ϵ ⨀ g t g^{'}_t \leftarrow \sqrt{\frac{\Delta x_{t-1} + \epsilon}{s_t + \epsilon}} \bigodot g_t gtst+ϵΔxt1+ϵ gt

  • ϵ \epsilon ϵ:为了位置数值稳定性而添加的常数,如 1 0 − 5 10^{-5} 105

更新自变量:
x t ← x t − 1 − g t ′ x_t \leftarrow x_{t-1} - g^{'}_t xtxt1gt

最后,使用 Δ x t \Delta x_t Δxt来记录自变量的变化量 g t ′ g_t^{'} gt按元素平方的指数加权移动平均:
Δ x t ← ρ Δ x t − 1 + ( 1 − ρ ) g t ′ ⨀ g t ′ \Delta x_t \leftarrow \rho \Delta x_{t-1} + (1 - \rho)g_t^{'} \bigodot g_t^{'} ΔxtρΔxt1+(1ρ)gtgt

AdaDelta算法与RMSProp算法的不同之处是使用了 Δ x t − 1 + ϵ \sqrt{\Delta x_{t-1} + \epsilon} Δxt1+ϵ 来代替超参数 η \eta η

小结

  • AdaDelta算法没有学习率超参数,它通过使用有关自变量的更新量的平方的指数加权移动平均来代替RMSProp算法中的学习率。

7.8 Adam算法

Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。

7.8.1 算法

Adam算法使用了动量变量 v t v_t vt和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量 s t s_t st,并在时间步0将它们中每个元素初始化为0。给定超参数 0 ≤ β 1 < 1 0\leq \beta_1 < 1 0β1<1(建议0.9),时间步 t t t的动量变量 v t v_t vt即小批量随机梯度 g t g_t gt的指数加权移动平均:

v t ← β 1 v t − 1 + ( 1 − β 1 ) g t v_t \leftarrow \beta_1 v_{t-1} + (1-\beta_1)g_t vtβ1vt1+1β1gt
给定超参数 0 ≤ β 2 < 1 0 \leq \beta_2 < 1 0β2<1(建议0.999),将小批量随机梯度按元素平方后的项 g t ⨀ g t g_t \bigodot g_t gtgt作指数加权移动平均得到 s t s_t st:
s t ← β 2 s t − 1 + ( 1 − β 2 ) g t ⨀ g t s_t \leftarrow \beta_2 s_{t-1}+(1- \beta_2)g_t \bigodot g_t stβ2st1+(1β2)gtgt

当时间步很小时,因为初始 v 0 , s 0 v_0,s_0 v0,s0都设为0,迭代初期的梯度很小。为了消除这个影响, 引入偏差修正。对于任意时间步 t t t,将 v t v_t vt再除以 1 − β 1 t 1-\beta^t_1 1β1t,从而使过去各时间步小批量随机梯度权值之和为1。对变量 v t , s t v_t,s_t vt,st作偏差修正:
v t ^ ← v t 1 − β 1 t s t ^ ← s t 1 − β 2 t \hat{v_t} \leftarrow \frac{v_t}{1-\beta^t_1} \\ \hat{s_t} \leftarrow \frac{s_t}{1-\beta^t_2} vt^1β1tvtst^1β2tst

Adam算法使用以上偏差修正后的变量 v t ^ , s t ^ \hat{v_t}, \hat{s_t} vt^,st^,将模型参数中每个元素的学习率通过按元素运算重新调整:
g t ′ ← η v t ^ s t ^ + ϵ g^{'}_t \leftarrow \frac{\eta \hat{v_t}}{\sqrt{\hat{s_t}}+\epsilon} gtst^ +ϵηvt^.

  • η \eta η: 学习率
  • ϵ \epsilon ϵ:为了位置数值稳定性而添加的常数,如 1 0 − 8 10^{-8} 108

和AdaGrad算法,RMSProp算法以及AdaDelta算法一样,目标函数自变量中每个元素都分别拥有自己的学习率。最后,使用 g t ′ g^{'}_t gt迭代自变量:
x t ← x t − 1 − g t ′ x_t \leftarrow x_{t-1} - g^{'}_t xtxt1gt

  • Adam算法在RMProp算法的基础上对小批量随机梯度也做了指数加权移动平均
  • Adam算法使用了偏差修正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值