1.SGD
SGD指stochastic gradient decent,即随机梯度下降,是梯度下降的batch版本。每次更新都利用
一个batch的数据,而非整个训练集。
$x_{t+1}=x_t+\Delta x_t$
$\Delta x_t=-\eta g_t$
$\mbox{其中,}\eta\mbox{为学习率,}g_t\mbox{为}x\mbox{在}t\mbox{时刻的梯度。}$
2.Momentum
SGD方法的一个缺点是,其更新方向完全依赖于当前的batch,因而其更新十分不稳定。解决这一问题
的一个简单的方法便是引入momentum。momentum即动量,它模拟的是物体运动时的惯性,即更新的时候
在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在
一定程度上增加稳定性,从而学习得更快,并且还有一定摆脱局部最优的能力:
$k=x_{t-1}$
$\Delta x_t=\rho\Delta k-\eta g_t$
$\mbox{其中,}\rho\mbox{即momentum,表示要多大程度上保留原来的更新方向,这个值在0-1之间,}$
在训练开始时,由于梯度可能会很大,所以初始值一般选0.5;当梯度不那么大时,改为0.9。
$\eta\mbox{是学习率,即当前batch的梯度多大程度上影响最终更新方向,与普通SGD含义相同。}$
3.Nesterov Momentum
进行了一下修正,达到准确的梯度值
$k=x_{t-1}$
$t(x)=f(x_{t-1}+\rho\Delta k)$
$\Delta x_t=\rho\Delta k-\eta\Delta t(x)$
4.Adagrad
上面提到的方法对于所有参数都使用了同一更新速率,但是同一个更新速率不一定适合所有参数。
比如有的参数可能已经到了仅需要微调的阶段,但又有些参数由于对应样本少等原因,还需要较大
幅度的调动。Adagrad就是针对这一问题提出的,自适应地为各个参数分配不同学习率的算法。
$k=\sqrt{\sum_{r=1}^t g_r+\xi}$
$\Delta x_t=-\frac{\eta}{k}g_t$
$\mbox{其中}g_t\mbox{同样是当前的梯度,连加和开根号都是元素级别的运算。}$
$\eta\mbox{是初始学习率,由于之后会自动调整学习率,所以初始值就不像之前的算法那样重要了,}$
$\mbox{而}\xi\mbox{是一个比较小的数,用来保证分母非0。}$
$\mbox{其含义是,对于每个参数,随着其更新的总距离增多,其学习速率也随之变慢。}$
5.Adadelta
Adagrad算法存在三个问题
(1)其学习率是单调递减的,训练后期学习率非常小。
(2)其需要手工设置一个全局的初始学习率。
(3)更新$x_t$时,左右两边的单位不统一
Adadelta针对上述三个问题提出了比较漂亮的解决方案。
首先,针对第一个问题,我们可以只使用adagrad的分母中的累计项离当前时间点比较近的项,如下式:
$k=E[g^2]_{k-1}$
$E[g^2]_t=\rho k+(1-\rho)g_t^2$
$\Delta x_t=-\frac{\eta}{\sqrt{E[g^2]_t+\xi}} g_t$
这里$\rho$是衰减系数,通过这个衰减系数,我们令每一个时刻的$g_t$随着时间按照$\rho$指数衰减,
这样就相当于我们仅使用离当前时刻比较近的$g_t$信息,从而使得很长时间以后,参数仍然可以得到
更新。
6.Adam (Adaptive Moment Estimation)
Adam的思路和Adagrad相似,都使用梯度平方根归一化学习率。
维护一个一阶momentum,等价于梯度:
$a=m_{t-1}$
$m_t=\alpha \cdot a+(1-\alpha)\cdot \Delta Q(w)$
另一个二阶moentum,等价于梯度平方:
$b=v_{t-1}$
$v_t=\beta\cdot b+(1-\beta)\cdot\Delta Q(w)^2$
由于m,v都初始化为0,使用t次幂让其在头几次迭代中更大一些:
$\widehat{m_t}=\frac{m_t}{1-\alpha^t}$
$\widehat{v_t}=\frac{v_t}{1-\beta^t}$
使用梯度平方v归一化学习率,更新幅度为梯度m:
$w_{t+1}=w_t-\eta\frac{1}{\sqrt{\widehat{v_t}}}\widehat{m_t}$