机器学习:神经网络常见的几种梯度下降优化方式

当我们训练一个神经网络模型的时候,一般来说会构建一个目标函数,构建一个网络,设置好超参数: 比如学习率,batch size 的大小,迭代次数,weight decay 的比重等等,然后利用 back propagation 开始训练,随着 loss 慢慢减小,收敛到某个最小值,模型训练结束。

一般目标函数都是非凸函数,这意味着函数的全局最小值很难找到,目前所采用的优化方法,都只能寻找目标函数的局部最小值。神经网络由于其多次的非线性变换,很难利用解析的方法一次性求解。幸好,我们有 随机梯度下降算法

随机梯度下降,可以说是深度学习的基石,这个看似简单的优化方法,却撑起了整个深度学习,深度神经网络的各种应用,只要涉及到深度神经网络的训练,就一定会用到梯度下降。随机梯度下降,利用一种迭代的方式,将复杂的神经网络训练变得可行。

我们知道,常规的随机梯度下降法都如下所示:

w t + 1 = w t − η Δ w t Δ w t = ∂ J ∂ w w_{t+1} = w_t - \eta \Delta w_t \\ \Delta w_t = \frac{\partial J}{\partial w} wt+1=wtηΔwtΔwt=wJ

其中, η \eta η 是学习率,或者可以理解为步长,表示参数每次变化的幅度,学习率太小,变化的幅度比较小,目标函数收敛将要更长的时间,而学习率太大,参数的变化可能呈现 “震荡” 模式,目标函数可能会错过某些 “最小值” 不太容易收敛。不过,现在的网络训练,学习率都是采用逐渐衰减的方式,开始很大,后期会慢慢减小。

在常规梯度下降的形式基础上,又开发出了几种不同的梯度下降方式:

指数加权平均:

指数加权平均本质上是对之前的数值求平均值,避免局部波动,关注整体趋势。 θ \theta θ 是需要更新的参数,

v t = β v t − 1 − ( 1 − β ) θ t v_t = \beta v_{t-1} - (1-\beta) \theta_t vt=βvt1(1β)θt

从表达式可以看出,参数是通过累积的方式在更新,每次参数更新的时候,不光要用到当前的参数,也会用到之前的参数。这种方式,有个好处,就是如果当前参数的变化为 0 的时候,参数依然可以更新,不会因此而陷在一个点上,无法动弹。下面介绍的几种梯度下降方式都利用这个理念,结合 Δ w \Delta w Δw 的一阶矩以及二阶矩。

Momentum:

v t + 1 = β v t + ( 1 − β ) Δ w t w t + 1 = w t − η v t v_{t+1} = \beta v_{t} + (1-\beta) \Delta w_t \\ w_{t+1} = w_t - \eta v_{t} vt+1=βvt+(1β)Δwtwt+1=wtηvt

momentum 的梯度下降如上所示,就是利用了指数加权平均的思想,参数 w w w的更新,并不是仅仅依靠当前的梯度值, Δ w t \Delta w_t Δwt,而是当前梯度值与之前的梯度值的一个加权。这种方法的一个优势是梯度下降比较平缓,可以把握整体的趋势,抵抗干扰的能力很强,不过,这种方式的不足之处在于,当目标函数趋近于最小值时,这个时候的梯度本来就应该很小,或者说梯度趋近于 0,由于 momentum 需要把之前的梯度也加权进来,所以容易让目标函数在最小值附近出现 “震荡” 。

RMSProp:

s t + 1 = β s t + ( 1 − β ) ( Δ w t ) 2 w t + 1 = w t − η Δ w t s t + 1 + ε s_{t+1} = \beta s_t + (1 - \beta) (\Delta w_t)^2 \\ w_{t+1} = w_{t} - \eta \frac{\Delta w_t}{ \sqrt {s_{t+1}} + \varepsilon } st+1=βst+(1β)(Δwt)2wt+1=wtηst+1 +εΔwt

RMSProp 是另外一个常用的梯度下降方式,momentum 是利用梯度的一阶矩,而 RMSProp 是利用梯度的二阶矩,RMSProp 弥补了 momentum 在目标函数最小值附近的 “震荡”,因为 RMSProp 将当前梯度的变化作为分子,这样,当目标函数快收敛,梯度值比较小的时候,更新的梯度值也会很小,这样就避免了参数的 “震荡”。不过,RMSProp 需要注意的一点就是,防止模型 “过早终止”,因为如果分母太大的话,梯度基本就很小,这样的话,参数基本没有变化,模型可能就无法迭代下去。

Adam :

Adam 结合了 momentum 与 RMSProp 两者,同时利用了梯度的一阶矩与二阶矩,构造了一个非常复杂的更新方式,如下所示:希望能结合 momentum 与 RMSProp 的优势,同时又避免两者的劣势,不过,带来的问题就是算法的复杂度进一步提升了。为了更新参数,需要记住很多的中间变量,而且也引入了更多的超参数。

v t + 1 = β 1 v t + ( 1 − β 1 ) Δ w t s t + 1 = β 2 s t + ( 1 − β 2 ) ( Δ w t ) 2 v ~ t + 1 = v t 1 − β 1 t s ~ t + 1 = s t 1 − β 2 t w t + 1 = w t − η v ~ t + 1 s ~ t + 1 + ε v_{t+1} = \beta_1 v_{t} + (1-\beta_1) \Delta w_t \\ s_{t+1} = \beta_2 s_t + (1 - \beta_2) (\Delta w_t)^2 \\ \tilde{v}_{t+1} = \frac{v_{t}}{1 - {\beta_1}^{t}} \\ \tilde{s}_{t+1} = \frac{s_{t}}{1 - {\beta_2}^{t}} \\ w_{t+1} = w_{t} - \eta \frac{\tilde{v}_{t+1}}{ \sqrt { \tilde{s}_{t+1}} + \varepsilon} vt+1=β1vt+(1β1)Δwtst+1=β2st+(1β2)(Δwt)2v~t+1=1β1tvts~t+1=1β2tstwt+1=wtηs~t+1 +εv~t+1

你可能感兴趣的:(机器学习,机器学习)