神经网络的训练过程如下:
在第四步中,参数的更新就是pytorch中的optim(优化过程),现在都是随机梯度下降,即每次更新是通过随机抽样来更新参数(总数的一小部分,简称为一个batch)。
公式:
(1)
为此,需要设置一个学习率,保证每个batch学习更新的参数足够小。
公式:
(2)
其中eta就是学习率, 选择适当的学习率才能优化到合适的目标.
学习率过高: 1.目标发散
学习旅过低: 2.更新较慢
公式:
(3)
其中的H是一个Hessian矩阵, 通过迭代次数t,计算出的二阶导数矩阵,这个方法计算量过于庞大,所以在较大的模型中不太现实。
和学习率相关的就是动量 Momentum, 这个变量是前期梯度的积累,当前梯度和前期梯度方向相同时,梯度更新会加速。当前梯度和前期梯度方向不同时,梯度更新会减缓。这样在转弯的时候,震荡就会减轻。
公式:
(4)
其中的rho就是动量值,如果为0.9,就代表其每次都保留上一次梯度的0.9
对过去每个维度所有时间的梯度求l2 norm,作为分母,分子是一个全局学习率. 每个维度有自己的学习率,梯度变化大的学习率小,梯度变化小的学习率就大. 让不同梯度变化的维度有与之适应的学习率,这是一个不错的退火策略(annealing)。
公式:
(5)
这个方法的毛病就是初始训练较为敏感,如果某一维度初始训练时梯度梯度很大,在剩下的训练学习率就会被调整到很低,虽然可以提高全局学习率来抵抗这个衰减,但是整体的学习率依然是在降低的,最终学习率为0并停止训练。
这个方法就是为了解决超参选择时学习率持续衰减的问题。之前的方法通过Hessian矩阵来估计学习率,但是需要计算全局的二阶导数,这个计算量太大了,用一个对角线矩阵来近似Hessian矩阵。这个对角线矩阵可以通过让模型一次前向传播和一次后向传播来计算。
(6)
其中mu是一个较小的常数(用以保证分母不为0)。
另外这个方法还有一个思考,就是SGD,Momentum,以及Adagrad这些优化方法更新参数都是根据Loss-function来进行计算的,并没有根据参数本身来更新参数。换句话说,就是根据梯度来更新参数,没有考虑到参数本书的特征。但是通过Hessian矩阵的估计通过参数的二阶导来更新参数,其更新方法考虑到了参数本身。(针对不同维度的参数)
而这个方法最经典的思考就是用当前某一维度的参数unit x来近似当前总体的梯度 Delta x ,从而减化 Hessian 矩阵的计算。相当于用前一次的更新参数x来参与当前更新的梯度计算。
[1]. AdaDelta:AN ADAPTIVE Learning Rate Method, Matthew D. Zeiler, 2012