深度学习(一般指深度神经网络DNN)有几个关键的要素:训练集,网络结构,损失函数(目标函数),优化方法。这里记录一下优化方法相关知识点吧。
1. why using optimizer?
训练DNN时,我们的目标是更新网络参数以使得损失函数最小化,optimizer就是更新参数的方法。不同的optimizer都遵循一个基本原则:
是学习率,也就是每次参数更新的程度。根据是否改变学习率,可以将optimizer分为两大派别。
2. 学习率固定的optimizer
1) BGD:Batch gradient descent,即在整个训练集上forward和backward一次,然后更新一次参数。缺点:收敛速度慢,大量重复计算。
2) SGD:Stochastic gradient descent,即在每一个训练样本上forward和backward一次,然后更新一次参数。优点:收敛速度快;缺点:波动大。
3) mini-batch SGD:将训练集分为小的批次(batch),在每一个批次上forward和backward一次,然后更新一次参数。中和了前两个。一般所说的SGD即为mini-batch SGD。
4) momentum SGD 动量:
更新当前参数时既考虑当前梯度,又考虑之前的梯度(称之为动量)。
5) Nesterov SGD 牛顿动量:
添加了校正因子的momentum, 即先用旧的动量更新一遍参数,然后再依据momentum的流程走。
上述两种动量方法都加速了学习速率,牛顿法添加了校正因子,进一步优化了原始动量方法。
3. 改变学习率的optimizer
上述方法学习率均固定,然而选择学习率又是很困难的,太小会使得收敛速度太慢,训练花费时间太长,太大又会产生波动(可能会跨过最优点)。可以参考下面两张图:
1) AdaGrad SGD:
每次迭代都会改变学习率,其目的是在平缓的地方使用大学习率,在陡峭的地方使用小学习率,使得收敛速度快的同时防止波动。r 是更新学习率时用的,由公式可知,越平缓,梯度g越小,r越小,则学习率增大(实现平缓处用大梯度)。为一个小常数,为了防止分母为0。
其中学习率的改变取决于梯度平方的累积(梯度累积为指数累积)(第二个公式)。
2) RMSProp SGD:
与AdaGrad类似,改进梯度累积为指数衰减的移动平均,对非凸函数友好。为衰减指数,指的是对于遥远的过去信息使用量较小。
3) RMSProp + Nesterov
RMSProp也可以结合动量,既使用了动量又改变了学习率,从两个方面改进优化算法。公式如下,红色部分是RMSProp梯度衰减累积部分,黑色是牛顿动量部分。
4) Adam SGD (Momentum + RMSProp):
结合了momentum和RMSProp,同时也引入了修正项(即衰减的指数梯度累积,和衰减的动量累积)
一般来说,使用动量且改变学习率,会使得收敛加速且减少波动,因此,adam SGD较为流行。