zoukankan      html  css  js  c++  java
  • 梯度下降算法及优化方法

    序言

          对于y=f(wx+b),如何使用神经网络来进行求解,也就是给定x和y的值,如何让系统自动生成正确的权重值w和b呢?

          一般情况下,有两种尝试方法:

          1) 随机试:纯概率问题,几乎不可能实现。

          2) 梯度下降法:先初始化w和b(可以随机设置,也可以人为默认),然后使用下降算法来对w和b进行更新。都有哪些方法?到底哪种方法更好?

    目录

    一、基础知识

    二、SGD

    三、Momentum

    四、Adagrad

    五、Adadelta

    六、RMSProp

    七、Adam

    正文

    一、基础知识

    斜率:在一维空间上,斜率就是函数的导数;

    梯度:在多维空间里,函数的导数叫梯度,梯度是偏导数组成的向量;

    梯度指向函数增加最快的方向,相应地,负梯度就指向函数下降最快的方向;推导方法可以参考该链接:https://blog.csdn.net/itplus/article/details/9337515

    二、SGD

    一般情况下,SGD指Mini-batch GD,(GD可分为三种:Batch GD,Stochastic GD,mini-batch GD)

    SGD就是每次迭代计算mini-batch的梯度,然后对参数进行更新:

    1)gt=θt1f(θt1)
    2)Δθt=ηgt
    其中,η是学习率,gt是梯度
    SGD完全依赖于当前batch的梯度,η可理解为允许当前batch的梯度多大程度影响参数更新。
    劣势:
           1、学习率LR选择比较困难
           2、对所有参数都使用相同的LR:在数据不均衡的情况下,如稀疏特征希望更新快些,常出现特征出现慢些时,SGD不太满足要求。
           3、容易收敛到局部最优,有可能被困于鞍点
     

     三、Momentum

    积累之前的动量来替代梯度

    1)mt=μmt1+gt
    2)Δθt=ηmt

    其中,μ是动量因子

    梯度下降前期:使用上一次参数来更新,下降方向一致,乘上较大的μ能够进行很好的加速

    梯度下降后期,在局部最小值来回震荡的时候,gradient→0,μ使得更新幅度增大,跳出陷阱

    梯度方向改变时,μ能够减少更新

    结论:momentum项能够加速SGD,抑制振荡,从而加快收敛

    四、Adagrad

    对学习率进行了约束:

    nt=nt−1+gt2

    Δθt=−η/(√nt+ϵ)∗gt

    此处,对gt从11到tt进行一个递推形成一个约束项regularizer:−1/√(∑r=1t(gr)2+ϵ) ,ϵ用来保证分母非0
    特点:

    前期gt较小的时候, regularizer较大,能够放大梯度
    后期gt较大的时候,regularizer较小,能够约束梯度
    适合处理稀疏梯度
    缺点:

    由公式可以看出,仍依赖于人工设置一个全局学习率
    η设置过大的话,会使regularizer过于敏感,对梯度的调节太大
    中后期,分母上梯度平方的累加将会越来越大,使gradient→0,使得训练提前结束

    五、Adadelta

       对Adagrad的扩展,也是对学习率进行自适应约束,但对计算进行了简化。

    Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即: 

    1) nt=νnt1+(1ν)gt^2
    2) Δθt=η/(√(nt+ϵ))gt

    Adadelta依是依赖于全局学习率,但是经过近似牛顿迭代法:

    3) E|g^2|t=ρE|g^2|t1+(1ρ)gt^2
    4) Δxt=r=1,t-1(Δxr)/√(E|g^2|t+ϵ)     其中E代表期望,Adadelta已经不用依赖于全局学习率
    特点:

    训练初中期,加速效果不错,很快

    训练后期,反复在局部最小值附近抖动

    六、RMSprop

    RMSprop算Adadelta一个特例

    当ρ=0.5时,E|g^2|t=ρ∗E|g^2|t−1+(1−ρ)∗gt^2就变为了求梯度平方和的平均数。
    如果再求根的话,就变成了RMS(均方根):
    RMS|g|t=√(E|g^2|t+ϵ)

    此时,这个RMS就可以作为学习率ηη的一个约束:
    Δxt=−η/(RMS|g|t)∗gt
    特点:

    其实RMSprop依然依赖于全局学习率
    RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间
    适合处理非平稳目标
    对于RNN效果很好

    七、Adam
    Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
    mt=μ∗mt−1+(1−μ)∗gt

    nt=ν∗nt−1+(1−ν)∗gt^2

    mt^=mt/(1−μt)

    nt^=nt/(1−νt)

    Δθt=−mt^/√(nt^+ϵ)∗η

    其中,mtmt,ntnt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望E|gt|,E|gt^2|的估计,mt^,nt^是对mt,nt的校正,这样可以近似为对期望的无偏估计。
    可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整,而−mt^/(nt^+ϵ)对学习率形成一个动态约束,而且有明确的范围。
    特点:

    结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
    对内存需求较小
    为不同的参数计算不同的自适应学习率
    也适用于大多非凸优化
    适用于大数据集和高维空间

  • 相关阅读:
    给下拉框加上可输入查询特性-升级版本
    手把手教你在CentOS7中安装JavaJDK和配置环境变量
    CentOS7.0下MySql的安装和配置
    CentOS常规辅助工具安装
    MongoDB教程之常用操作
    商城商品超卖处理
    微信JS-SDK分享的坑
    当数据库做了Aways on后,收缩数据库日志文件
    SQL Server 2016 非域Aways On环境搭建
    win8以上系统查看iis网站进程内存占用情况
  • 原文地址:https://www.cnblogs.com/jimchen1218/p/11848643.html
Copyright © 2011-2022 走看看