神经网络各优化方法

来源:互联网 发布:淘宝店铺后花园 编辑:程序博客网 时间:2024/06/07 16:18

什么是优化方法

  优化方法,是通过某种训练模式最小化误差(损失)函数的算法。
  损失函数度量基于模型参数的模型预测值与真实值之间的偏差程度,在神经网络中是基于w(权重)和b(偏置)的函数。我们通过优化方法更新模型参数,从而让模型预测值更符合预期;
  权重更新的快慢由学习率 lr 决定,当 lr 过大时,会导致 loss 提高; 当 lr 较大时, loss 无法收敛; 当 lr 较小时,loss 收敛慢;故一般使用较大的 lr 开始训练,随着迭代次数的增加,减小学习率 lr。下面使用 α 表示学习率 lr 。
  优化的目的当然最好是可以使 loss 达到全局最小点,但由于模型可能是非凸的,所以达到较好的局部最小点也是我们的选择。

优化方法可以分为两类:

  1. 一阶优化方法
      这种优化方法通过计算导数dE/dw(误差函数对权重的导数)得到该权重最佳减小方向,从而优化模型;在多变量的情况下,该方法被扩展为梯度,所以优化方法也是基于梯度下降的方法,最基础的方法也是梯度下降。
  2. 二阶优化方法
      二阶优化方法使用二阶导数(Hessian方法)来最小化误差函数。由于二阶导数的计算代价太高,所以一般不会使用二阶优化方法。

固定学习率的优化方法

梯度下降

  最原始的梯度下降是一次训练所有数据集样本,得到其平均损失函数,然后计算其梯度。其权重的更新方式为:

wi=wiαE(W,B,X,Y)wi

  一次训练所有训练集样本带来的问题是训练速度很慢,且可能导致内存溢出。

SGD

  SGD(Stochastic gradient descent),随机梯度下降。最简单的随机梯度下降是每次对一个训练样本进行训练,其效果和梯度下降差不多,但训练的速度更快。随机梯度下降的参数更新的很频繁,所以其参数之间会具有高方差,损失函数会波动,可能不会收敛到最小值(但也在最小值附近)。其权重更新方式为:

wi=wiαE(W,B,x,y)wi

Mini Batch

  现在一般称批梯度下降(Mini Batch Gradient Descent)为SGD,其使用一小批数据集(m个独立同分布的数据样本)作为一次训练的对象,该处理初步解决了频繁的参数更新问题。Mini Batch 是后面几个改进方法的基础。
  在我们选择批量 m 的大小时,我们一般使用 2 的某个幂作为m的选择(一般为16~256),这样会运行得更快。其权重更新方式为

g=1mimE(W,B,x,y)wi
wi=wiαg

  SGD算法在遇到鞍点(大概就是每个参数想走的地方不一样)时,存在难以逃脱的问题。这种问题称为 Hessian 矩阵病态条件问题。

Momentum(动量)

  动量方法可以用来解决 Hessian 矩阵病态条件问题,其方法是在梯度更新时参考上一次梯度的方向,表现形式为:

g=1mimE(W,B,x,y)wi
vt=βvt1αg
wi=wi+vt

  直观来说,就是当目前的方向与原先的方向相反,借鉴之前的梯度,就会减小其权重更新振荡的幅度,从而加快收敛;当目前的方向与原先方向相同,则加快其收敛速度。若梯度方向都大致相似,其收敛速度的加快与参数 β 的关系为:
vtβvt1=αg
v=α|g|1β

  就是如果 β 为 0.99, 则其收敛速度是SGD的 100倍。
  通过累计历史梯度,可能可以逃出连续的驻点。
  但动量的问题在于,如果动量过高,可能会完全越过最小值。

Nesterov

  Nesterov, 牛顿动量是Momentum的变种,该方法有机会解决动量方法越过最小值的问题。其改进点在于在计算梯度前,先用当前速度 v(t-1) 更新一次参数,再用更新后的临时参数计算梯度。其表现形式为:

wi=wi+αvt1
g=1mimE(W,B,x,y)wi
vt=βvt1αg
wi=wi+vt

  该方法对于参数的更新更敏感,也能减少SGD方法的频繁振荡问题,也不会最小值,相当于加了矫正因子的Momentum。

自适应参数的优化方法

  相同学习率并不适用于所有的参数更新。如果训练数据很稀疏,且特征频率差异大,则更新的幅度不应该一样。对于很少出现的特征,应该使用更大的学习率。

AdaGrad

  AdaGrad方法通过参数来调整适合的学习率,对小频率参数进行大幅度更新,对大频率参数进行小幅度更新。其具体做法为:先设置一个全局学习率,在迭代开始之后,该参数的学习率会除以历史梯度平方和的平方根,从而使每个参数的学习率不同。该方法的表现形式为:

g=1mimE(W,B,x,y)wi
r=r+g2
wi=wiαγ+rg

  AdaGrad方法的好处为不用手动调整学习率。但由于r一直在变大,所以学习率会越来越小,所以模型的学习能力和收敛能力会越来越低,需要很长的时间来训练。所以AdaGrad较为适用于稀疏数据集的训练。

AdaDelta

  AdaDelta 方法是 AdaGrad 方法的改进,相对于 AdaGrad 方法完全累计先前所有的梯度平方和, AdaDelta 方法使用一个衰减系数 ω 来“忘记”太过久远的梯度平方和,从而避免学习率无限减小的问题。该方法的表现形式为:

g=1mimE(W,B,x,y)wi
r=ωr+(1ω)g2
wi=wiαγ+rg

 &emspAdaDelta 方法结合 Nesterov 方法的使用如下:
wi=wi+αvt1
g=1mimE(W,B,x,y)wi
r=ωr+(1ω)g2
vt=βvt1αγ+rg
wi=wi+vt

  AdaDelta和Momentum结合之后,就可以不用设置全局学习率了。

Adam

  Adam(Adaptive Moment Estimation,自适应矩估计)算法,该方法实际上是修正后的 Momentum 方法 和 AdaDelta 方法的结合。该方法的表现形式为:

g=1mimE(W,B,x,y)wi
Momentum 项
st=ρ1st1+(1ρ1)g
AdaDelta 项
rt=ρ2rt1+(1ρ2)g2
s=s1ρt
r=r1ρt
wi=wiαγ+rs

  其中 ρ1 建议默认为0.9,ρ2建议默认为0.999,γ 默认设置为10^{-16}。
  值得一提的是,Adam 方法通常被认为对超参数的选择相当鲁棒,且其在实际应用中的效果良好,超过了其他的自适应技术。使用 Adam 方法较为方便,但如果选择了较好的学习率 ,Momentum能得到更好的效果。

原创粉丝点击