深度学习:优化器

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

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

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

    w=w+v w = w + v

    对上式进行变换,可以得到
    vmax=α||w||1β v m a x = α | | w | | 1 − β

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

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

    wi=wiαcachei+δΔwi w i = w i − α c a c h e i + δ Δ w i

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值