这里的参数更新指的是在神经网络的训练过程中,通过计算参数w的梯度,将梯度反向传播,从而更新参数w的过程。

普通更新

普通更新指的是,沿着梯度的负方向,对参数w进行更新,用公式表示:
w += - learning_rate * dw
其中,learning_rate就是前面博客提到的学习率,它是一个超参数。但是该方法存在一个问题,即如果损失函数剖面呈现椭圆形,那么将loss对w求梯度时,水平和竖直方向的大小不同,因此在更新梯度时,等高线密集的方向更新快,会出现来回震荡的现象,而变化平缓的方向更新慢,因此导致了普通更新的收敛速度慢。有人指出,可以降低学习率来缓解这种震荡的问题,但是学习率作用于各个方向,会使本来缓慢的方向上更新更加缓慢。

动量(Momentum)更新

该方法受物理学的启发,将loss比作地形,梯度比作加速度,因此梯度不直接影响loss,而是通过速度v间接的影响位置loss,而运动时还存在摩擦力,因此速度v在不同时刻也要乘以摩擦系数mu,其中mu大于0小于1,用公式表示为:
v = mu * v - learning_rate * dw
w += v
加速度这个概念,我们可以理解为,它会在某种程度上抑制变化快的loss方向上的速度的大小,也会激励变化慢的loss方向上的速度大小。而mu,我们通常在开始的几个epoch中先将其设置为0.5,随着epoch的增加,将mu慢慢增加到类似于0.99这样的值

Nesterov动量

Nesterov动量是对普通动量的改进,将梯度dw改为对超前位置的求导,其公式为:
w_ahead = w + mu * v
v = mu * v - learning_rate * dw_ahead
w += v

二阶方法的优势在于不需要学习率这个超参数,它是利用Hessian矩阵得到损失函数的曲率,从而在曲率大的地方缓慢更新,曲率小的地方快速更新。然而由于需要计算Hessian矩阵,则会消耗大量内存,因此使用L-BFGS方法近似,从而避免计算Hessian矩阵。但是L-BFGS需要在全部的数据集上计算,而不是利用批数据,如何在mini-batch上计算L-BFGS也是研究热点。

总的说来,在参数更新时,更倾向于使用一阶参数更新的方法,主要由于其计算简单,并且可拓展性强。