深度学习:优化器

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fengchi863/article/details/80916427

在神经网络中经常面对非凸函数的优化问题,所以在平时经常会用到一些网络的优化方法,包括局部最优、鞍点、梯度悬崖和梯度消失问题。

  1. 对于大规模的神经网络,大多数的局部最优都有一个比较低的损失值,并且寻找真实的全局最优也不是一个很重要的问题,重要的是在参数空间中找到一个相对较低的局部最优值。(因为全局最优可能过拟合严重,局部最优反而可能更好)
  2. 鞍点:是高维数据中一个很突出的问题。鞍点就像是两座山峰的中间区域,该区域不是局部最优值,但是十分平坦,换言之就是梯度几乎为0,无法确定走哪一条路。维度越高,鞍点的数目越是指数型增长。
  3. 梯度悬崖:由于循环神经网络涉及在多个时间段内相乘,所以梯度悬崖在RNN中十分频繁,特别是处理较长的时间序列时。
  4. 梯度消失与梯度爆炸:比如Sigmoid神经元,取值范围为(0,0.25],在梯度反向传播时,当层数较多时,最终导数值已经很小,所以即使网络产生了很大的误差,但底层的神经元依然没有得到足够的误差修正。反之,如果上层的权重过大,当经过传递后,本层的梯度就会变得异常巨大,造成梯度十分不稳定。相比于梯度消失,梯度爆炸的问题比较容易解决,并且发生的情况也不频繁。
  5. 随机梯度下降(SGD):随机梯度下降算法就是选择一条数据,就训练一条数据,然后修改一次权重。为了防止这种随机性带来的危害,我们就多选择几条数据,计算一下多条数据的平均错误,如果某条数据存在严重错误,也会因为多条数据的中和而降低其错误的成都。
  6. 为了防止在最优解附近震荡的现象,我们可以把学习率改为时间衰减的形式。如下式,为训练第k轮时第i轮学习率的取值。
    αi=(1ik)α0+ikb

    当使用这种线性策略来调整学习率时,通常要进行上百轮的学习调整,因此k要大于100,b的取值可以粗略的设置为百分之一的学习率。设置初始学习率很重要,如果太大,学习曲线就会剧烈震荡;如果太小,学习就会非常慢,还可能会陷入一个比较高的代价函数区域。这也是一个鱼和熊掌的问题。
  7. 动量学习法:梯度的物理意义可以理解为,是一个力,带领我们下山,但是我们不是靠力前行,而是靠速度,力只是改变速度的大小和方向,并且速度是可以累积的,所以我们还具有动量。类似于物理学,速度这个参数表示在参数空间移动的方向和速率,而代价函数的负梯度表示参数在参数空间移动的力。引入超参数β,它的值在[0,1]范围之间,用于调节先前梯度(力)的衰减效果。
    v=βvαΔw

    w=w+v

    对上式进行变换,可以得到
    vmax=α||w||1β

    在动量学习法中,每一步走多远依赖的是过去的速度以及当前的力(梯度)。速度v用于累加各轮训练的参数梯度(类似有个加速度),β越大先前梯度对于本轮训练的影响就越大。最终因为衰减因子β的存在,小球在达到最大值以后就会匀速前行。(理解为一个受力平衡的状态)常用的β可以是0.5,0.9.0.99。
    对于β的调整,并没有α的调整中重要,所以不太需要作为超参数进行选择,正常情况下,取值适当即可。
  8. AdaGrad:(个性化的为每一个参数单独的配置学习率)就是将每一维各自的历史梯度的平方叠加起来,然后在更新的时候除以该历史梯度值即可。使用平方的原因是为了去掉梯度的符号,只对梯度的量进行累加。
    AdaGrad很容易受到过去的影响,因为梯度很容易就会累积到比较大的值,所以AdaGrad容易过分降低学习率。
    cachei=cachei+(Δwi)2

    wi=wiαcachei+δΔwi
  9. RMSProp:因为AdaGrad在理论上有比较好的性质,但是对优化神经网络十分不友好,随着训练周期的增长,学习率降低的很快。RMSProp算法在进行梯度累积的时候,会在“过去”和“现在”之间做一个权衡,通过超参数β来条件衰减量,常用取值0.9或0.5。
    cachei=βcachei+(1β)(Δwi)2

    wi=wiαcachei+δΔwi

    RMSProp更新方式对于深度学习网络十分的高效,是深度学习中最有效的更新方式之一。
  10. **Adam:**Adam是指Adaptive moments,其实是Momentum+RMSProp的微调版本。首先计算当前最小批量梯度:
    g=1mj=1mL(y(i),f(x(j);w))w

    类似于动量学习法,设置衰减梯度v:
    v=β1v+(1β1)g

    类似于RMSProp学习法,设置衰减学习率r:
    r=β2r+(1β2)g2

    最后更新参数:
    w=wαr+δv

    因为在开始的时候梯度会非常的小,rv经常会接近于0,所以做下面的“热身”工作:
    vb=v1β1t,rb=r1β2t

    其中,t表示训练的次数,因此仅仅在训练的前几轮中根据就衰减因子来放大各自的值,很快vbrb就会退化成vr
  11. 参数初始化策略:无论使用何种学习方式,都避免不了同一个问题,那就是下山的起始点问题,也就是参数的初始化问题。初始化不仅印象训练效果,还能影响模型的泛化性能(输在起跑线上)。
  12. 应该尽量避免神经元参数出现对称的情况。如果两个神经元使用相同的激活函数,并且输入相同,那么每个神经元都要有不同的参数。否则因为参数相同,在确定的学习算法下,他们的参数的更新也就会相同,出现神经元冗余的情况。
  13. 一般采用均匀分布或者高斯分布的随机初始化方式,分布函数的取值范围(标准差)对优化过程以及泛化能力有着巨大的影响。
    较大的初始化权重范围可以有效避免参数对称线性,减少神经元冗余现象,还可以帮助减轻训练网络时的梯度消失问题,但是太大的初始化权重也会导致梯度爆炸的问题,在一些Sigmoid神经元中,也容易出现过饱和现象,导致修改神经元梯度几乎为0。
  14. 一般参数均值要为0,这是一条高斯分布先验知识。通常,在m输入n输出的单层神经元中,我们可以使用均匀分布对权重进行随机采样初始化。
    Wi,jU(1m,1m)

    或者使用标准初始化:
    Wi,jU(6m+n,6m+n)
  15. 批量归一化:BN层,不能算是一种最优化算法,但是很有用。与选择最小批量梯度下降一样,BN中的“批量”就是采样一小批数据,然后对该批数据在网络各层的输出进行归一化处理。BN的目的就是为了把神经网络每一层的输入数据都调整到均值为零,方差为1的标准正态分布
    Sigmoid在[-2,2]之间的取值是一段近似线性的区域,BN算法所做的就是把输入值尽可能的归一化在激活函数这一狭窄区域。
    BN算法还有另一个步骤,就是将归一化的数据放大,平移回非线性区域。
展开阅读全文

没有更多推荐了,返回首页