优化算法小结

1.设计原理

  采用的原理是梯度下降法,即最小化目标函数 J,最优化的求解过程,首先求解目标函数的梯度 ,然后将参数向负梯度方向更新,学习率表明梯度更新的步伐的大小,最优化的过程依赖的算法称为优化器,可以看出深度学习优化器的两个核心是梯度与学习率,前者决定参数更新的方向,后者决定参数的更新程度。

  优化算法分为两大类,一类为非自适应优化器,即学习率全程不变,或者随着时间推移规律性的变化。另一类则为自适应优化器,即在优化过程中,学习率随着梯度自适应的变化,并尽可能去消除给定的全局学习率的影响。首先介绍非自适应优化器有哪些,再介绍自适应优化器有哪些

2.非自适应优化器

  2.1 BGD(Batch gradient descent)

    BGD 在每次更新梯度的时候,采用整个训练集的数据来计算 loss 对参数的梯度,计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。

  2.2 SGD 随机梯度下降法(Stochastic gradient descent)

   与 BGD 类似。但与BGD不一样的是, 它每次更新时对一个 batch 内每个样本进行梯度更新,这样使得网络更新参数速度很快。但是其缺点也很明显,因为 SGD 更新梯度非常频繁,会造成损失有严重的震荡,有可能在全局最小值处来回震荡跳出全局最优值。

  2.3 MBGD(Mini-batch gradient descent)

    更多时候把 MBGD 称之为 SGD,其梯度更新公式也和 BGD 类似。选取样本时和 2 中 SGD类似,但区别是每一次循环梯度更新的时候不是使用每个样本,而是一个 batch 内的 n 个样本。也就是SGD用的是每个样本,而MSGD用的是一个Batch里的样本

    优点:计算速度快

    缺点:1、不能保证很好的收敛性;因为一个batch里计算得出的方向并没有整体样本得出的方向精确,故会发生震荡,但总体还是向正确的方向下降

       2、学习率如果太小,收敛速度会很慢,如果太大,loss 就会在极小值处不停地震荡甚至偏离。

       3、避免陷入局部最小处或者鞍点处。

  2.4 SGDM(带有 Momentum 动量的 SGD)

    **注意这里的SGD都指的是MSGD

    为解决提到的的优化算法中易出现的问题,就在原有的 SGD 上加入了一阶动量,从直观理解就是加入了一个惯性,在坡度比较陡的地方,会有较大的惯性,下降的就会比较快;坡度平缓的地方,惯性较小,下降的会比较慢。

    公式为:

    

    其中加入伽马这个变量,定义为动量,通常设置为0.9,使用动量可使在梯度越大的地方下降越快,越小即平缓的地方下降越慢,也就是假如一直在同一个方向的话动量会累计,也就是会越来越快,而而新方向出现变化时,动量会抵消,会往反方向拉扯,会使得更新变慢。

   

  2.5 NAG(Nesterov accelerated gradient)

    当SGDM刚好下降到拐点附近时,如果这个时候继续以这样的方式更新参数,我们会有一个较大的幅度越过拐点,即:模型遇到拐点不会自动减弱更新的幅度。NAG 针对上述问题对动量方法进行了改进,其表达式如下:

    

 

    NAG 利用当前位置处先前的梯度值先做一个参数更新,然后在更新后的位置再求梯度,将此部分梯度跟之前累积下来的梯度值矢量相加,简单的说就是先根据之前累积的梯度方向模拟下一步参数更新后的值,然后将模拟后的位置处梯度替换动量方法中的当前位置梯度。

 

 

3.自适应优化器

  3.1 Adagrad

    它其实是对学习率进行了一个约束,对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。而该方法中开始使用二阶动量,意味着“自适应学习率”优化算法时代的到来。

    二阶动量的定义:它是用来度量参数历史更新频率的,二阶动量是迄今为止所有梯度值的平方和。Adagrad 的表达式为:

    

 

    其中gt 为 t 时刻参数梯度,可是为什么 adagrad 可以实现不同频率特征对其参数学习率改变。首先,可以看到二阶动量 Vt,它是梯度平方累加和,对于训练数据少的特征,自然对应的参数更新就缓慢,也就是说他们的梯度变化平方累加和就会比较小,所以对应于上面参数更新方程中的学习速率就会变大,因而对于某个特征数据集少,相应参数更新速度就快。为了防止上述分母为 0,所以往往添加一个平滑项参数 ,参数更新方程也就变成:

    

 

    但是 adagrad 同样也有问题,从公式可以看到其分母随着训练数增加,也会跟着增加,这样会导致学习速率越来越小,最终无限接近于 0,从而无法有效更新参数。

 

   

  3.2 Adadelta

    针对Adagrad的问题,Adadelta 对二阶动量 Vt 进行了改进,和 Adagrad 相比,就是分母换成了过去的梯度平方的衰减平均值,这个分母相当于梯度的均方根值。其表达式如下:

     

 

  4.3 RMSprop

    RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题而被提出来的。RMSprop 与 Adadelta的计算公式非常相似,只不过在相同的时间内被独立的提出,其表达式为:

    

 

  4.4 Adam(Adaptive Moment Estimation

    Adam$ 算法是另一种计算每个参数的自适应学习率的方法。它是一种将动量 Momentum 和 RMSprop 结合起来的办法方法,同时引入了两个参数 β1 和 β2,其表达式为:

    

 

    其中 β1 默认值为 0.9,β2 默认值为 0.999,平滑参数设置为为 10^(-8),Adam 集合了动量和 RMSprop 两者的优点,从经验中表明 Adam 在实际中表现很好,同时与其他自适应A学习算法相比,更有优势。

 

 

     

参考:https://github.com/zonechen1994/CV_Interview

           https://www.cnblogs.com/guoyaohua/p/8542554.html

           https://blog.csdn.net/u013385018/article/details/92377371

           https://blog.csdn.net/qq_42109740/article/details/105401197

posted @   Dr_Zhou  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示