神经网络各优化方法
2017-12-14 10:44
134 查看
什么是优化方法
优化方法,是通过某种训练模式最小化误差(损失)函数的算法。损失函数度量基于模型参数的模型预测值与真实值之间的偏差程度,在神经网络中是基于w(权重)和b(偏置)的函数。我们通过优化方法更新模型参数,从而让模型预测值更符合预期;
权重更新的快慢由学习率 lr 决定,当 lr 过大时,会导致 loss 提高; 当 lr 较大时, loss 无法收敛; 当 lr 较小时,loss 收敛慢;故一般使用较大的 lr 开始训练,随着迭代次数的增加,减小学习率 lr。下面使用 α 表示学习率 lr 。
优化的目的当然最好是可以使 loss 达到全局最小点,但由于模型可能是非凸的,所以达到较好的局部最小点也是我们的选择。
优化方法可以分为两类:
一阶优化方法
这种优化方法通过计算导数dE/dw(误差函数对权重的导数)得到该权重最佳减小方向,从而优化模型;在多变量的情况下,该方法被扩展为梯度,所以优化方法也是基于梯度下降的方法,最基础的方法也是梯度下降。
二阶优化方法
二阶优化方法使用二阶导数(Hessian方法)来最小化误差函数。由于二阶导数的计算代价太高,所以一般不会使用二阶优化方法。
固定学习率的优化方法
梯度下降
最原始的梯度下降是一次训练所有数据集样本,得到其平均损失函数,然后计算其梯度。其权重的更新方式为: wi=wi−α∂E(W,B,X,Y)∂wi一次训练所有训练集样本带来的问题是训练速度很慢,且可能导致内存溢出。
SGD
SGD(Stochastic gradient descent),随机梯度下降。最简单的随机梯度下降是每次对一个训练样本进行训练,其效果和梯度下降差不多,但训练的速度更快。随机梯度下降的参数更新的很频繁,所以其参数之间会具有高方差,损失函数会波动,可能不会收敛到最小值(但也在最小值附近)。其权重更新方式为:wi=wi−α∂E(W,B,x,y)∂wiMini Batch
现在一般称批梯度下降(Mini Batch Gradient Descent)为SGD,其使用一小批数据集(m个独立同分布的数据样本)作为一次训练的对象,该处理初步解决了频繁的参数更新问题。Mini Batch 是后面几个改进方法的基础。在我们选择批量 m 的大小时,我们一般使用 2 的某个幂作为m的选择(一般为16~256),这样会运行得更快。其权重更新方式为g=1m∑im∂E(W,B,x,y)∂wiwi=wi−αg
SGD算法在遇到鞍点(大概就是每个参数想走的地方不一样)时,存在难以逃脱的问题。这种问题称为 Hessian 矩阵病态条件问题。
Momentum(动量)
动量方法可以用来解决 Hessian 矩阵病态条件问题,其方法是在梯度更新时参考上一次梯度的方向,表现形式为:g=1m∑im∂E(W,B,x,y)∂wi vt=βvt−1−αg wi=wi+vt直观来说,就是当目前的方向与原先的方向相反,借鉴之前的梯度,就会减小其权重更新振荡的幅度,从而加快收敛;当目前的方向与原先方向相同,则加快其收敛速度。若梯度方向都大致相似,其收敛速度的加快与参数 β 的关系为:vt−βvt−1=−αg v=α|g|1−β
就是如果 β 为 0.99, 则其收敛速度是SGD的 100倍。
通过累计历史梯度,可能可以逃出连续的驻点。
但动量的问题在于,如果动量过高,可能会完全越过最小值。
Nesterov
Nesterov, 牛顿动量是Momentum的变种,该方法有机会解决动量方法越过最小值的问题。其改进点在于在计算梯度前,先用当前速度 v(t-1) 更新一次参数,再用更新后的临时参数计算梯度。其表现形式为:wi=wi+αvt−1 g=1m∑im∂E(W,B,x,y)∂wi vt=βvt−1−αg wi=wi+vt该方法对于参数的更新更敏感,也能减少SGD方法的频繁振荡问题,也不会最小值,相当于加了矫正因子的Momentum。
自适应参数的优化方法
相同学习率并不适用于所有的参数更新。如果训练数据很稀疏,且特征频率差异大,则更新的幅度不应该一样。对于很少出现的特征,应该使用更大的学习率。AdaGrad
AdaGrad方法通过参数来调整适合的学习率,对小频率参数进行大幅度更新,对大频率参数进行小幅度更新。其具体做法为:先设置一个全局学习率,在迭代开始之后,该参数的学习率会除以历史梯度平方和的平方根,从而使每个参数的学习率不同。该方法的表现形式为:g=1m∑im∂E(W,B,x,y)∂wi r=r+g2 wi=wi−αγ+r−−−−√gAdaGrad方法的好处为不用手动调整学习率。但由于r一直在变大,所以学习率会越来越小,所以模型的学习能力和收敛能力会越来越低,需要很长的时间来训练。所以AdaGrad较为适用于稀疏数据集的训练。
AdaDelta
AdaDelta 方法是 AdaGrad 方法的改进,相对于 AdaGrad 方法完全累计先前所有的梯度平方和, AdaDelta 方法使用一个衰减系数 ω 来“忘记”太过久远的梯度平方和,从而避免学习率无限减小的问题。该方法的表现形式为:g=1m∑im∂E(W,B,x,y)∂wi r=ωr+(1−ω)g2 wi=wi−αγ+r−−−−√g&emspAdaDelta 方法结合 Nesterov 方法的使用如下:wi=wi+αvt−1 g=1m∑im∂E(W,B,x,y)∂wi r=ωr+(1−ω)g2 vt=βvt−1−αγ+r−−−−√g wi=wi+vt
AdaDelta和Momentum结合之后,就可以不用设置全局学习率了。
Adam
Adam(Adaptive Moment Estimation,自适应矩估计)算法,该方法实际上是修正后的 Momentum 方法 和 AdaDelta 方法的结合。该方法的表现形式为:g=1m∑im∂E(W,B,x,y)∂wi Momentum 项 st=ρ1st−1+(1−ρ1)g AdaDelta 项 rt=ρ2rt−1+(1−ρ2)g2 s=s1−ρt r=r1−ρt wi=wi−αγ+r−−−−√s其中 ρ1 建议默认为0.9,ρ2建议默认为0.999,γ 默认设置为10^{-16}。
值得一提的是,Adam 方法通常被认为对超参数的选择相当鲁棒,且其在实际应用中的效果良好,超过了其他的自适应技术。使用 Adam 方法较为方便,但如果选择了较好的学习率 ,Momentum能得到更好的效果。
相关文章推荐
- 一文看懂各种神经网络优化算法:从梯度下降到Adam方法
- 神经网络学习(五)优化方法:激活函数
- 常见的神经网络的优化方法
- 常见的神经网络的优化方法
- DeepLearing学习笔记-改善深层神经网络(第二周作业-优化方法)
- 神经网络梯度下降优化算法及初始化方法小结
- 各种神经网络优化算法:从梯度下降到Adam方法
- DeepLearing学习笔记-改善深层神经网络(第二周作业-优化方法)[转载]
- 神经网络学习(八)优化方法:交叉熵代价函数
- 神经网络优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam
- 多层神经网络优化难题与解决方法
- 用Python进行神经网络初始化、正则、优化
- 挑战深度学习 《深度森林:探索深度神经网络以外的方法》
- TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络
- 神经网络优化算法之不一样的梯度下降
- NNPR-Chap10 贝叶斯技术(1)利用贝叶斯方法学习神经网络权重
- SQL性能优化之定位网络性能问题的方法(DEMO)
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络
- 机器学习(六):黑箱方法——神经网络和支持向量机
- 神经网络参数优化--基于CNN的验证