真锋
永远保持一颗学习和专注的心
嵌入式视觉
优化器的理解与选择

讲优化器的,网上有很多资料,但是大多都是套下公式泛泛而谈,我虽然想做到把优化器的理论、算法、代码和优劣特性等,但碍于实力有限,只能当作快速学习的学习笔记参考,本文大部分内容参考魏秀参的《CNN卷积神经网络》这本书,想要深入学习我建议直接去细致看论文。

网络模型优化算法选择

下面的计算公式中,假设待学习参数为 \(w\),学习率(或步长)为 \(η\),一阶梯度值为 \(g\),\(t\) 表示第 \(t\) 轮训练。

随机梯度下降算法SGD

随机梯度下降算法(Stochastic Gradient Descent, 简称 SGD)是神经网络训练的基本算法,其每次批处理训练时都会计算网络误差并作误差的反向传播,根据一阶梯度信息对参数进行更新,其计算公式如下:

$$w_{t} = w_{t-1} – \eta \cdot g$$

其中,一阶梯度信息 g 完全依赖于当前批数据在网络目标函数上的误差,所以可将学习率 η 理解为当前批的梯度对网络整体参数更新的影响程度。SGD优化算法是最经典的神经网络优化方法,虽然收敛速度慢,但是收敛效果比较稳定。

基于动量的随机梯度下降算法

基于动量(momentum)的随机梯度下降算法用于改善 SGD 更新时可能产生的振荡现象,其计算公式如下:

$$\upsilon_{t} = \mu \cdot \upsilon_{t-1} – \eta \cdot g$$$$w_{t} = w_{t-1} + \upsilon_{t}$$

其中,\( \upsilon_{t} \)为动量因子,控制动量信息对整体梯度更新的影响程度,一般设为 0.9。基于动量的随机梯度下降算法除了可以抑制振荡,还可以在网络训练中后期趋于收敛、网络参数在局部最小值附近来回震荡时帮助其跳出局部限制,找到更优的网络参数。

注意:这里动量因子除了设定为 0.9 的静态因子,还可以设置为动态因子,常用的动态因子设定方式是将动量因子初始化值设为 0.5,之后随着训练轮数的增长逐渐变为 0.9 或 0.99。

mxnet框架中使用 SGD 优化器函数及参数配置如下:  

sgd_opt = mx.optimizer.SGD(
    momentum=0.9, 
    learning_rate=args.base_lr, 
    wd=0.00001, 
    rescale_grad=1.0/args.batch_size,                
    lr_scheduler=lr_scheduler.CosineScheduler(decay_steps=args.decay_steps, stop_factor_lr=0.00001)
    )

Nesterov型动量随机梯度下降法

此算法是对 Momentum 的改进算法,不是在当前位置求梯度,而是每次都向前看一步,使用未来的梯度值,在动量梯度下降法更新梯度时加入对当前梯度的校正。相比一般动量法,Nesterov 型动量法对于凸函数在收敛性证明上有更强的理论证明,计算公式如下:

$$w_{ahead} = w_{t-1} + \mu \cdot \upsilon_{t-1}$$$$\upsilon_{t} =  \mu \cdot \upsilon_{t-1} – \eta \cdot \bigtriangledown_{w_{ahead}}$$$$w_{t} = w_{t-1} + \upsilon_{t}$$

其中\(\bigtriangledown_{w_{ahead}}\)表示\({w_{ahead}}\)的导数信息。

总结:无论是随机梯度下降法、基于动量的随机梯度下降算法,还是Nesterov型动量随机梯度下降法,本质上都是为了使梯度更新更加灵活,这对优化神经网络这种拥有非凸且异常复杂的函数空间的学习模型很重要。但是这三种方法都有相同的局限性,我们知道较小的学习率更加适合网络后期的优化,但是这三种方法的学习率 η 固定不变,并未将学习率的自适应性考虑进去。

Adagrad方法

Adam与SGD比较

  • Adam等自适应学习率算法对于稀疏数据具有优势,且收敛速度很快;但精调参数的SGD(+Momentum)往往能够取得更好的最终结果。
  • 用相同数量的超参数来调参,SGD和SGD +momentum 方法性能在测试集上的额误差好于所有的自适应优化算法,尽管有时自适应优化算法在训练集上的loss更小,但是他们在测试集上的loss却依然比SGD方法高,
  • 自适应优化算法 在训练前期阶段在训练集上收敛的更快,但是在测试集上这种有点遇到了瓶颈。
  • 所有方法需要的迭代次数相同,这就和约定俗成的默认自适应优化算法 需要更少的迭代次数的结论相悖!

优化算法常用tricks

  • 首先,各大算法孰优孰劣并无定论。如果是刚入门,优先考虑 SGD+Nesterov Momentum或者Adam.(Standford 231n : The two recommended updates to use are either SGD+Nesterov Momentum or Adam)
  • 选择你熟悉的算法——这样你可以更加熟练地利用你的经验进行调参。
  • 充分了解你的数据——如果模型是非常稀疏的,那么优先考虑自适应学习率的算法。
  • 根据你的需求来选择——在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam进行快速实验优化;在模型上线或者结果发布前,可以用精调的SGD进行模型的极致优化。
  • 先用小数据集进行实验。有论文研究指出,随机梯度下降算法的收敛速度和数据集的大小的关系不大。(The mathematics of stochastic gradient descent are amazingly independent of the training set size. In particular, the asymptotic SGD convergence rates are independent from the sample size. [2])因此可以先用一个具有代表性的小数据集进行实验,测试一下最好的优化算法,并通过参数搜索来寻找最优的训练参数。
  • 考虑不同算法的组合。先用Adam进行快速下降,而后再换到SGD进行充分的调优。切换策略可以参考网络其他资料。
  • 数据集一定要充分的打散(shuffle)。这样在使用自适应学习率算法的时候,可以避免某些特征集中出现,而导致的有时学习过度、有时学习不足,使得下降方向出现偏差的问题。
  • 训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练——下降方向正确,且学习率足够高;对验证数据的监控是为了避免出现过拟合。
  • 制定一个合适的学习率衰减策略。可以使用定期衰减策略,比如每过多少个epoch就衰减一次;或者利用精度或者AUC等性能指标来监控,当测试集上的指标不变或者下跌时,就降低学习率。

参考资料

魏秀参-CNN解析神经网络

赞赏

发表评论

textsms
account_circle
email

嵌入式视觉

优化器的理解与选择
讲优化器的,网上有很多资料,但是大多都是套下公式泛泛而谈,我虽然想做到把优化器的理论、算法、代码和优劣特性等,但碍于实力有限,只能当作快速学习的学习笔记参考,本文大部分内容参…
扫描二维码继续阅读
2019-08-19
标签
2019年十一月
« 9月    
 123
45678910
11121314151617
18192021222324
252627282930