梯度下降的优化方法
动量优化法
动量梯度下降法(Momentum)
动量梯度下降法,Gradient descent with momentum,其速度总是快于标准的梯度下降算法。
方法
对于普通的梯度下降算法,如果学习率过大,很可能起到负面作用,使得损失函数不降反升,反而使学习速度过慢。
造成这种情况的原因是当前的选择最优解(选取“坡度最大”的方向)仅仅是局部最优,其实偏离了真正的极小值,如果学习率较小,虽然效率不高,但依旧可以靠近极小值,但如果学习率过大,反而会离目标更远。

为了解决这个问题,也就是让梯度下降的运动曲线不再这么蜿蜒曲折,我们可以使用动量梯度下降法,也就是给梯度下降加上“动量”,考虑之前的几次梯度下降,动量梯度下降法会将它们共同方向的“动量”叠加,将相反方向的“动量”相抵消,使得曲线能够朝着它们共同的运动方向加速运动。这样可以有效避免蜿蜒曲折。(将运动曲线拆分成各个参数的维度,有些参数可能在往复运动,有些参数在往正确的方向学习,往复运动的参数如果有较高的学习率,那么其反而会导致损失函数“海拔升高”,而如果选用较低的学习率,正确学习的参数的学习速度反而变慢,为了解决这种“木桶效应”,理论上我们可以给这些参数设置不同的学习率,但实际上,我们使用的学习率都是相同的,那么我们可以改的就是梯度下降中与学习率相乘的梯度,让往复运动参数的梯度变得更小,这样我们的学习率就可以更大了。而正确学习的参数,考虑了之前的运动后,其往该方向的学习速度还会加快。综上,总体的学习速度会加快)
或者我们可以这么考虑:这次的梯度下降中,有部分数据其实是噪声数据,也就是这次的梯度下降的方向带了噪声,因此,我们不应该仅仅考虑这次的最优选择,我们应该再带上之前几次的梯度下降一起考虑,这样可以过滤噪声,当前的选择便具有“平均性”,不会出现剧烈来回波动的情况。而离这次梯度时间越近的梯度下降对这次梯度下降的选择的影响应该更大,因此,我们可以利用指数加权移动平均线的思想,对这些梯度进行指数加权平均,得到这次梯度下降的选择: \[ \left\{ \begin{aligned} &v_{dW^{[l]}} = \beta v_{dW^{[l]}} + (1-\beta)dW^{[l]}\\\ &v_{db^{[l]}} = \beta v_{db^{[l]}} + (1-\beta)db^{[l]} \end{aligned} \right. \] 其中,\(dW^{[l]}\)代表\(\frac{\partial L}{\partial W^{[l]}}\),\(db^{[l]}\)代表\(\frac{\partial L}{\partial b^{[l]}}\),\(v_{dW^{[l]}}\)代表加上了“动量”的梯度\(\frac{\partial L}{\partial W^{[l]}}\),\(v_{db^{[l]}}\)代表加上了“动量”的梯度\(\frac{\partial L}{\partial b^{[l]}}\)
梯度下降: \[ \left\{ \begin{aligned} &W^{[l]} = W^{[l]} - \alpha v_{dW^{[l]}}\\\ &b^{[l]} = b^{[l]} - \alpha v_{db^{[l]}} \end{aligned} \right. \] 现在,我们有两个超参数:\(\alpha\)和\(\beta\),其中\(\alpha\)为学习率,\(\beta\)控制着指数加权平均数
\(\beta\)常用的值为0.9,经验告诉我们,\(\beta=0.9\)具有不错的鲁棒性
至于偏差修正,通常人们都不会这么做,因为\(\beta=0.9\)时,仅仅只是前面十几次梯度下降时偏差比较大(“值”更小),后面的训练几乎不会受到影响,而且我们通常会训练很多次,因此,不使用偏差修正,对于我们的训练几乎没有影响。但如果使用了偏差修正,虽然我们可以是前面十几次学习速度加快,但对于整体而言,却加大了计算量,在后面大部分的训练中,偏差修正只是累赘。当然,我们可以选择只在前面十几次使用偏差修正,这样不会添加计算负担,但其实没有这个必要。

有些地方的动量梯度下降算法会写为: \[ \left\{ \begin{aligned} &v_{dW^{[l]}} = \beta v_{dW^{[l]}} + dW^{[l]}\\\ &v_{db^{[l]}} = \beta v_{db^{[l]}} + db^{[l]} \end{aligned} \right. \] 如果使用这个版本,相当于只对这些实际梯度进行了加权,而没有平均,因此,当\(\beta\)不同时,会对于\(v_{dW^{[l]}}\)和\(v_{db^{[l]}}\)的大小造成一定影响,学习率也因此会受到影响(\(\beta\)越大,合适的学习率\(\alpha\)会更小)
但不论是哪个版本,\(\beta=0.9\)都具有不错的性能
使用了动量梯度下降法后,我们可以使用更大的学习率\(\alpha\),加快学习速度

NAG
待补充......
自适应学习率优化算法
RMSprop
RMSprop,root means square prop,均方根支柱算法。
RMSprop对梯度的调整,其实等价于对学习率的调整,这部分详见后面的AdaGrad。RMSprop借鉴了AdaGrad的思想,又避免了学习率越来越低的问题。
RMSProp算法在经验上已经被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。
- 自适应学习率:RMSprop 为每个参数分配不同的学习率,这有助于加快收敛速度。
- 对初始学习率的选择不那么敏感:相比传统梯度下降,RMSprop 对初始学习率的选择更为宽容。
- 适用于非平稳目标:RMSprop 能够适应梯度变化较大的情况,如训练深度神经网络时常见的梯度爆炸或消失问题。
方法
RMSprop的作用是均衡每一个参数的梯度下降,使原本下降过快的下降速度变慢,使原本下降过慢的下降速度变快(使陡峭变得更平缓,使平缓变得更陡峭),(加长木桶短板,缩短木桶长板),这可能会形成两种情况:
- 正确更新的参数更新幅度更大,错误更新的参数更新幅度更小,避免“来回摆动”的情况
- 正确更新的参数更新幅度更小,错误更新的参数更新幅度更大
但总体上,RMSprop“中和”了好与坏,使得总体上优于标准的梯度下降算法。 \[ \left\{ \begin{aligned} &S_{dW^{[l]}} = \beta S_{dW^{[l]}} + (1-\beta)\times(dW^{[l]})^2\\\ &S_{db^{[l]}} = \beta S_{db^{[l]}} + (1-\beta)\times(db^{[l]})^2 \end{aligned} \right. \] (梯度平方项的指数加权平均,能够避免正负梯度的抵消)
梯度下降: \[ \left\{ \begin{aligned} &W^{[l]} = W^{[l]} - \alpha\frac{dW^{[l]}}{\sqrt{S_{dW^{[l]}}}}\\\ &b^{[l]} = b^{[l]} - \alpha\frac{db^{[l]}}{\sqrt{S_{db^{[l]}}}} \end{aligned} \right. \]
(梯度平方项指数加权平均开根号,能够避免平方和导致的数量级差异)
如果最近的\(w_{i,j}\)的梯度过大,其对应的\(\sqrt{S_{w_{i,j}}}\)也会较大,会减小梯度,相反则会增大梯度。
当然,使用该算法需要保证\(\sqrt{S_{dW^{[l]}}}\)和\(\sqrt{S_{db^{[l]}}}\)不会等于0或者趋近于0,如果等于0,则除法无意义;如果趋近于0,则会导致\(\frac{dW^{[l]}}{\sqrt{S_{dW^{[l]}}}}\)、\(\frac{db^{[l]}}{\sqrt{S_{db^{[l]}}}}\)过大。为了确保数值稳定,在实际操作时,我们一般在分母上加上一个很小很小的\(\epsilon\),\(\epsilon\)是多少没关系,只是保证数值能稳定一些。一般我们会选择\(\epsilon = 10^{-8}\)。 \[ \left\{ \begin{aligned} &W^{[l]} = W^{[l]} - \alpha\frac{dW^{[l]}}{\sqrt{S_{dW^{[l]}}}+\epsilon}\\\ &b^{[l]} = b^{[l]} - \alpha\frac{db^{[l]}}{\sqrt{S_{db^{[l]}}}+\epsilon} \end{aligned} \right. \]
AdaGrad
AdaGrad适用于稀疏数据,因为稀疏数据中的0较多,根据后面梯度更新的公式,我们会知道,这部分数据更新幅度会变大,学习率调整会变小,学习速度快。
AdaGrad非常适合处理稀疏数据。
- 在稀疏矩阵中,大部分元素都是0,只有少数元素是非零的。AdaGrad为每个参数独立调整学习率,这意味着只有那些实际被更新的参数(即非零元素对应的参数)会调整其学习率。这样,频繁更新的参数(通常对应于数据中的非零特征)会有较小的学习率,而较少更新的参数(对应于零特征)会有较大的学习率。这种自适应特性使得AdaGrad能够更好地处理稀疏数据。
AdaGrad的优点是消除了手动调整学习率的需要,AdaGrad在迭代过程中不断调整学习率,并让目标函数的每个参数都分别拥有自己的学习率。(根据下面的梯度下降公式,学习率与后面部分相乘,后面调整,等价于后面不变学习率调整)
AdaGrad的缺点是它在分母中积累平方梯度,并没有进行平均,由于平方梯度每个都是非负数,因此在训练过程中积累量不断增加。这反过来又会导致学习率不断变小最终变得无限小。
方法
与RMSprop相比,AdaGrad计算的并不是指数加权平均,而仅仅是普通的相加: \[ \left\{ \begin{aligned} &S_{dW^{[l]}} = S_{dW^{[l]}} + (dW^{[l]})^2\\\ &S_{db^{[l]}} = S_{db^{[l]}} + (db^{[l]})^2 \end{aligned} \right. \] 梯度下降: \[ \left\{ \begin{aligned} &W^{[l]} = W^{[l]} - \alpha\frac{dW^{[l]}}{\sqrt{S_{dW^{[l]}}}+\epsilon}\\\ &b^{[l]} = b^{[l]} - \alpha\frac{db^{[l]}}{\sqrt{S_{db^{[l]}}}+\epsilon} \end{aligned} \right. \] 大多数时候,使用AdaGrad初始默认的学习率\(\alpha = 0.01\)
Adam
Adam优化算法,Adam optimizational algorithm,Adam代表的是Adaptive Moment Estimation(自适应矩估计)
方法
Adam优化算法基本上就是将Momentum和RMSprop两种优化算法结合起来。 \[ \left\{ \begin{aligned} &v_{dW^{[l]}} = \beta_1 v_{dW^{[l]}} + (1-\beta_1)dW^{[l]}\\\ &v_{db^{[l]}} = \beta_1 v_{db^{[l]}} + (1-\beta_1)db^{[l]} \end{aligned} \right. \]
\[ \left\{ \begin{aligned} &S_{dW^{[l]}} = \beta_2 S_{dW^{[l]}} + (1-\beta_2)(dW^{[l]})^2\\\ &S_{db^{[l]}} = \beta_2 S_{db^{[l]}} + (1-\beta_2)(db^{[l]})^2 \end{aligned} \right. \]
梯度下降: \[ \left\{ \begin{aligned} &W^{[l]} = W^{[l]} - \alpha\frac{v_{dW^{[l]}}}{\sqrt{S_{dW^{[l]}}}+\epsilon}\\\ &b^{[l]} = b^{[l]} - \alpha\frac{v_{db^{[l]}}}{\sqrt{S_{db^{[l]}}}+\epsilon} \end{aligned} \right. \] Adam论文的作者建议: \[ \begin{aligned} &\beta_1 = 0.9\\\ &\beta_2 = 0.999\\\ &\epsilon = 10^{-8} \end{aligned} \] 通常我们就使用这些默认值,不作调整(实际上很少有人调整这些参数)
如果我们要使用偏差修正: \[ \left\{ \begin{aligned} &v_{dW^{[l]}} = \beta_1 v_{dW^{[l]}} + (1-\beta_1)dW^{[l]}\\\ &v_{db^{[l]}} = \beta_1 v_{db^{[l]}} + (1-\beta_1)db^{[l]} \end{aligned} \right. \]
\[ \left\{ \begin{aligned} &S_{dW^{[l]}} = \beta_2 S_{dW^{[l]}} + (1-\beta_2)(dW^{[l]})^2\\\ &S_{db^{[l]}} = \beta_2 S_{db^{[l]}} + (1-\beta_2)(db^{[l]})^2 \end{aligned} \right. \]
\[ \left\{ \begin{aligned} &v_{dW^{[l]}}^{correct} = \frac{v_{dW^{[l]}}}{1-\beta_1^t}\\\ &v_{db^{[l]}}^{correct} = \frac{v_{db^{[l]}}}{1-\beta_1^t} \end{aligned} \right. \]
\[ \left\{ \begin{aligned} &S_{dW^{[l]}}^{correct} = \frac{S_{dW^{[l]}}}{1-\beta_2^t}\\\ &S_{db^{[l]}}^{correct} = \frac{S_{db^{[l]}}}{1-\beta_2^t} \end{aligned} \right. \]
梯度下降: \[ \left\{ \begin{aligned} &W^{[l]} = W^{[l]} - \alpha\frac{v_{dW^{[l]}}^{correct}}{\sqrt{S_{dW^{[l]}}^{correct}}+\epsilon}\\\ &b^{[l]} = b^{[l]} - \alpha\frac{v_{db^{[l]}}^{correct}}{\sqrt{S_{db^{[l]}}^{correct}}+\epsilon} \end{aligned} \right. \] 注意:我们通常不使用偏差修正
Adadelta
AdaGrad和RMSprop都需要指定全局学习率,,AdaDelta算法结合两种算法,不需要我们设置学习率
方法
证明待补充...... \[ E[g^2]_t = \beta E[g^2]_{t-1}+(1-\beta)g_t^2 \]
\[ RMS[g]_t = \sqrt{E[g^2]_t+\delta} \]
\[ \Delta\theta_t = -\frac{RMS[\Delta\theta]_{t-1}}{RMS[g]_t}g_t \]
\[ E[\Delta\theta^2]_t = \beta E[\Delta\theta^2]_{t-1}+(1-\beta)\Delta\theta_t^2 \]
\[ \theta_{t+1} = \theta_t + \Delta\theta_t \]
其中,\(g_t\)代表第\(t\)次迭代的梯度,\(\theta_t\)代表所有在第\(t\)次迭代的参数,\(\Delta\theta_t\)代表第\(t\)次迭代时各参数的梯度
即: \[ \begin{aligned} &S_{dW^{[l]}} = \beta S_{dW^{[l]}} + (1-\beta)(dW^{[l]})^2\\\ &S_{db^{[l]}} = \beta S_{db^{[l]}} + (1-\beta)(db^{[l]})^2\\\ &RMS_{dW^{[l]}} = \sqrt{S_{dW^{[l]}}+\epsilon}\\\ &RMS_{db^{[l]}} = \sqrt{S_{db^{[l]}}+\epsilon}\\\ &\Delta W^{[l]} = -\frac{RMS_{\Delta W^{[l-1]}}}{RMS_{dW^{[l]}}}dW^{[l]}\\\ &\Delta b^{[l]} = -\frac{RMS_{\Delta b^{[l-1]}}}{RMS_{db^{[l]}}}db^{[l]}\\\ &RMS_{\Delta W^{[l]}} = \beta \Delta W^{[l-1]} + (1-\beta)(\Delta W^{[l]})^2\\\ &RMS_{\Delta b^{[l]}} = \beta \Delta b^{[l-1]} + (1-\beta)(\Delta b^{[l]})^2\\\ &W^{[l]} = W^{[l]} - \Delta W^{[l]}\\\ &b^{[l]} = b^{[l]} - \Delta b^{[l]} \end{aligned} \]
AdaMAX
待补充......
Nadam
待补充......
AMSGrad
待补充......
图像表示
.gif)
