zoukankan      html  css  js  c++  java
  • 优化算法

    • Optimizer
    1.选择哪种优化算法并没有达成共识
    
    2.具有自适应学习率(以RMSProp 和AdaDelta 为代表)的算法族表现得相当鲁棒,不分伯仲,但没有哪个算法能脱颖而出。
    
    3.对于当前流行的优化算法包括括SGD、具动量的SGD、RMSProp、具动量的RMSProp、AdaDelta 和Adam而言,选择哪一个算法似乎主要取决于使用者对算法的熟悉程度(以便调节超参数)
    
    4.基本不用二阶近似优化算法
    
    

    -SGD

    SGD实际就是min-batch的实现,为最基础的优化算法,当今大部分优化算法都是以SGD为基础实现的。详见 Deep Learning 最优化方法之SGD
    
    1.SGD应用于凸问题时,k次迭代后泛化误差的数量级是O(1/sqrt(k)),强凸下是O(1/k)。
    
    2.理论上GD比SGD有着更好的收敛率,然而[1]指出,泛化误差的下降速度不会快于O(1/k)。鉴
    于SGD只需少量样本就能快速更新,这远超过了缓慢的渐进收敛,因此不值得寻找使用收敛快O(1/k)。
    
    3.可能由于SGD在学习中增加了噪声,有正则化的效果
    
    4.在某些硬件上使用特定大小的数组时,运行时间会更少。尤其是在使用GPU时,通常使用2 的幂
    数作为批量大小可以获得更少的运行时间。一般,2 的幂数的取值范围是32 到256,16 有时在尝试大模型时使用。
    
    5.如果批量处理中的所有样本可以并行地处理(通常确是如此),那么内存消耗和批量大小会
    正比。对于很多硬件设施,这是批量大小的限制因素
    
    

    img

    • Momentum
    Momentum引入了动量v,以指数衰减的形式累计历史梯度,以此来解决Hessian矩阵病态问题 
    
    1.动量方法主要是为了解决Hessian矩阵病态条件问题(直观上讲就是梯度高度敏感于参数空间的某些方向)的。
    
    2.加速学习
    
    3.一般将参数设为0.5,0.9,或者0.99,分别表示最大速度2倍,10倍,100倍于SGD的算法。
    
    4.通过速度v,来积累了之间梯度指数级衰减的平均,并且继续延该方向移动: 
    
    指数衰减平均, 以alpha为衰减力度,alpha越大,之前梯度对现在方向的影响也越大
    
    

    $v gets alpha v - epsilon g$

    $eta gets frac{ epsilon lVert g Vert }{1-alpha}$
    img

    • Nesterov(牛顿动量)
    Nesterov是对Momentum的变种。与Momentum不同的是,Nesterov先更新参数,再计算梯度 
    
    1.Nesterov是Momentum的变种。
    
    2.与Momentum唯一区别就是,计算梯度的不同,Nesterov先用当前的速度v更新一遍参数,在用更新的临时参数计算梯度。
    
    3.相当于添加了矫正因子的Momentum。
    
    4.在GD下,Nesterov将误差收敛从O(1/k),改进到O(1/k^2)
    
    5.然而在SGD下,Nesterov并没有任何改进
    
    

    img

    二.自适应参数的优化算法

    这类算法最大的特点就是,每个参数有不同的学习率,在整个学习过程中自动适应这些学习率。

    • AdaGrad
    学习率逐参数的除以历史梯度平方和的平方根,使得每个参数的学习率不同 
    
    1.简单来讲,设置全局学习率之后,每次通过,全局学习率逐参数的除以历史梯度平方和的平方根,使得每个参数的学习率不同
    
    2.效果是:在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小)
    
    3.缺点是,使得学习率过早,过量的减少
    
    4.在某些模型上效果不错。
    
    
    Karpathy做了一个这几个方法在MNIST上性能的比较,其结论是: 
    adagrad相比于sgd和momentum更加稳定,即不需要怎么调参。而精调的sgd和momentum系列方法无论是收敛速度还是precision都比adagrad要好一些。在精调参数下,一般Nesterov优于momentum优于sgd。而adagrad一方面不用怎么调参,另一方面其性能稳定优于其他方法。
    

    img

    • RMSProp
    AdaGrad算法的改进。 
    历史梯度平方和—>指数衰减的移动平均,以此丢弃遥远的过去历史。 
    
    1.AdaGrad算法的改进。鉴于神经网络都是非凸条件下的,RMSProp在非凸条件下结果更好,改变梯度累积为指数衰减的移动平均以丢弃遥远的过去历史。
    
    2.经验上,RMSProp被证明有效且实用的深度学习网络优化算法。
    
    相比于AdaGrad的历史梯度: 
    

    $r gets r + g odot g$

    RMSProp增加了一个衰减系数来控制历史信息的获取多少: 
    

    $r gets ho r + (1 - ho) g odot g$
    img

    • Adam
    Adam算法可以看做是修正后的Momentum+RMSProp算法 
    
    1.Adam算法可以看做是修正后的Momentum+RMSProp算法
    
    2.动量直接并入梯度一阶矩估计中(指数加权)
    
    3.Adam通常被认为对超参数的选择相当鲁棒
    
    4.学习率建议为0.001
    
    算法8.7 Adam算法
    Require:步长ε (建议默认为: 0.001 )
    Require:矩估计的指数衰减速率,ρ1和ρ2在区间[0,1)内。( 建议默认为:分别:
    为0.9和0.999)
    Require:用于数值稳定的小常数δ ( 建议默认为: 10-8)
    Require:初始参数θ
    初始化- -阶和二阶矩变量s=0, r=0 
    初始化时间步t= 0
    while没有达到停止准则do
    从训练集中采包含m个样本{.).....},的小批量,对应目标为yi。
    计算梯度: g←VoZ; L(f(x();0), y(
    n
    t←t+1
    更新有偏一阶矩估计: s←p18+(1- A
    P1)9
    Momentum项
    更新有偏二阶矩估计: r←pr+(1-ρ2)g@ 9RMSProp项
    修正一阶矩的偏差: 8←
    修正二阶矩的偏差:分←E
    计算更新: 0θ=-∈房。
    (逐元素应用操作)
    应用更新: θ←θ+ Oθ
    end while
    

    img

    二阶近似的优化算法

    • 牛顿法
    牛顿法是基于二阶泰勒级数展开在某点附近来近似损失函数的优化方法。主要需要求得Hessian矩阵的逆。如果参数个数是k,则计算你所需的时间是O(k^3)由于在神经网络中参数个数往往是巨大的,因此牛顿法计算法消耗时间巨大。
    
    
    • 共轭梯度法
    共轭梯度(CG)是通过迭代下降的共轭方向(conjugate directions)以有效避免Hessian 矩阵求逆计算的方法。
    
    • BFGS
    Broyden-Fletcher-Goldfarb-Shanno(BFGS)算法具有牛顿法的一些优点,但没有牛顿法的计算负担。在这方面,BFGS和CG 很像。然而,BFGS使用了一个更直接的方法近似牛顿更新。用矩阵Mt 近似逆,迭代地低秩更新精度以更好地近似Hessian的逆。
    
    • LBFGS
    存储受限的BFGS(L-BFGS)通过避免存储完整的Hessian 逆的近似矩阵M,使得BFGS算法的存储代价显著降低。L-BFGS算法使用和BFGS算法相同的方法计算M的近似,但起始假设是M^(t-1) 是单位矩阵,而不是一步一步都要存储近似。
    
    
  • 相关阅读:
    iOS开发objectc优势与补足
    UITableView详解
    ipad 、iphone开发-通过定时器显示进度条
    [Yii Framework][SHARE] The directory structure of the Yii project site
    [Yii Framework] Yii中事件和行为的区别和应用
    [Ubuntu] 创建桌面启动图标
    [Ubuntu] Access denied for user ‘debiansysmaint’@'localhost’ (using password: YES)
    [Yii Framework] Chive: which is developed base on Yii, and its aims to be an alternative to phpMyAdmin!
    [javascript] 数组扩展操作
    [php] Generate PhpDoc with NetBeans
  • 原文地址:https://www.cnblogs.com/suanec/p/11231638.html
Copyright © 2011-2022 走看看