RedZero9 发表于 2022-4-21 21:52

深度学习-优化方法

优化算法

1 Gradient Descent(GD)

Gradient Descent即梯度下降法,通过计算参数的梯度更新参数,其参数更新公式如下:

https://www.zhihu.com/equation?tex=%5Ctheta+%5Cleftarrow+%5Ctheta-%5Ceta+%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%29+%5C%5C
如果样本巨大或参数量较大时,计算非常耗时,容易陷入局部最优点或者鞍点
2 Stochastic Gradient Descent(SGD)

Stochastic Gradient Descent即随机梯度下降,算法在每读入一个数据都会立刻计算loss function的梯度来update参数,这样速度会非常快,但是梯度更新的方向随机性大,可能不会很快收敛,甚至无法收敛到局部最优解
3 Mini-Batch SGD

Mini-Batch SGD即小批量随机梯度下降法,对GD和SGD做了一个折中,它每次随机选择一部分样本进行梯度计算来更新参数,这样既保证了计算速度,又保证了可以较快地收敛,也是实际采用较多的办法


4 Momentum Optimizer

Momentum Optimizer即动量优化法。GD一般具有恒定的learning rate,而且每次只利用当前梯度的信息,这样可能会存在收敛速度非常慢,甚至无法收敛的情况。Momentum引入了一个momentum vector,每次参数的更新不仅与本次计算的梯度相关,还与之前的梯度相关,这样参数更新的方向会朝向更加有利于收敛的方向,收敛速度更快


Momentum的参数更新公式如下:

https://www.zhihu.com/equation?tex=m+%5Cleftarrow+%5Cbeta+m%2B%5Ceta+%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%29+%5C%5C
式中的为一个超参数,可以理解为之前的动量对于当前参数更新影响的大小,https://www.zhihu.com/equation?tex=%5Ceta是学习率。在实际过程中,如果没有使用Batch Normalization,输入数据在各个维度上的差异比较大,这样更不利于收敛。如果使用Momentum会更有利于收敛(减小震荡),而且有助于跳出局部最优解。超参数一般设为0.9


5 Nesterov Accelarated Gradient(NAG)

Nesterov Accelarated Gradient简称NAG,是在Momentum的基础上改进得到的一个算法,不同之处在于m每次更新时加上梯度的不同,Momentum是加上当前位置https://www.zhihu.com/equation?tex=%5Ctheta的梯度,而NAG是加上当前位置之后一点点https://www.zhihu.com/equation?tex=%5Ctheta%2B%5Cbeta+m处的梯度。这样做会使动量m指向更加正确的(局部)最优点的方向,加快收敛到极值点。NAG的参数更新公式如下:

https://www.zhihu.com/equation?tex=m+%5Cleftarrow+%5Cbeta+m%2B%5Ceta+%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%2B%5Cbeta+m%29+%5C%5C
下图为Momentum和NAG的对比图:


Momentum根据和https://www.zhihu.com/equation?tex=%5Ceta+%5Cnabla_%7B1%7D计算m,而NAG根据和https://www.zhihu.com/equation?tex=%5Ceta+%5Cnabla_%7B2%7D计算m,NAG在接近极值的时候,如果超出了极值点,会把更新的方向往回拉,而不是继续往前,有利于减小震荡,加速收敛


6 AdaGrad Optimizer

AdaGrad Optimizer即自适应梯度下降法,其参数更新公式如下:

https://www.zhihu.com/equation?tex=s+%5Cleftarrow+s%2B%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%29+%5Cotimes+%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%29+%5C%5C
式中,https://www.zhihu.com/equation?tex=%5Cotimes表示按元素相乘,https://www.zhihu.com/equation?tex=%5Coslash表示按元素相除。所以,AdaGrad本质上就是对每次更新的各维梯度做了一个自适应缩放操作,这个缩放操作是通过除以https://www.zhihu.com/equation?tex=%5Csqrt%7Bs%2B%5Cvarepsilon%7D来完成的。一直在累加各维梯度之和(会越来越大),是平滑因子,作用是防止分母为0,一般会取非常小的值(如https://www.zhihu.com/equation?tex=10%5E%7B-9%7D)。这样一来,随着迭代的增加,参数的的更新速度会越来越慢,这样可以减小震荡,避免因步长太大而无法收敛到极值点。它的缺点是在进行复杂函数(Deep Learning)优化的时候,容易过早收敛,这样就无法收敛到全局极小值,而是收敛到局部极小值点


7 RMSProp Optimizer

AdaGrad的主要问题在于它的梯度减小速度太快了,以至于很快陷入局部极值点。RMSProp通过只累加最近一次的梯度来解决这个问题。其参数更新公式如下:

https://www.zhihu.com/equation?tex=s+%5Cleftarrow+%5Cbeta+s%2B%281-%5Cbeta%29+%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%29+%5Cotimes+%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%29+%5C%5C
式中,超参数为衰减因子(decay rate),表示之前的梯度累和对于当前的影响大小,这个大小是按照指数速率衰减的,离当前越远的梯度对当前的影响越小(因为指数衰减)


使用Nesterov动量的RMSProp算法:


8 Adam Optimizer

Adam的全称为adaptive momentum estimation,它结合了Momentum和RMSProp的思想。和Momentum一样,记录之前梯度的指数平均;和RMSProp一样,记录之前梯度平方和的指数平均。其参数更新公式如下:

https://www.zhihu.com/equation?tex=m+%5Cleftarrow+%5Cbeta_%7B1%7D+m%2B%5Cleft%281-%5Cbeta_%7B1%7D%5Cright%29+%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%29+%5C%5Chttps://www.zhihu.com/equation?tex=s+%5Cleftarrow+%5Cbeta_%7B2%7D+s%2B%5Cleft%281-%5Cbeta_%7B2%7D%5Cright%29+%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%29+%5Cotimes+%5Cnabla_%7B%5Ctheta%7D+J%28%5Ctheta%29+%5C%5Chttps://www.zhihu.com/equation?tex=m+%5Cleftarrow+%5Cfrac%7Bm%7D%7B1-%5Cbeta_%7B1%7D%7D+%5C%5Chttps://www.zhihu.com/equation?tex=s+%5Cleftarrow+%5Cfrac%7Bs%7D%7B1-%5Cbeta_%7B2%7D%7D+%5C%5Chttps://www.zhihu.com/equation?tex=%5Ctheta+%5Cleftarrow+%5Ctheta-%5Ceta+m+%5Coslash+%5Csqrt%7Bs%2B%5Cvarepsilon%7D+%5C%5C
第一个式子和Momentum的形式类似;第二个式子和RMSProp的形式类似;第五个式子相比于RMSProp将当前的梯度换成了当前的动量,这就相当于Momentum和RMSProp的结合;考虑到和初始时为0,第三个式子和第四个式子的作用是在初始时给和加速。和为超参数,一般将设为0.9,将设为0.999,平滑系数设为https://www.zhihu.com/equation?tex=10%5E%28-8%29,Adam是一个自适应的优化算法,所以也不需要手动对学习率进行调整。综合来看,Adam集成了其他算法的优点,是这几种优化算法里面最优的一个

FeastSC 发表于 2022-4-21 21:53

好文
页: [1]
查看完整版本: 深度学习-优化方法