找回密码
 立即注册
查看: 248|回复: 0

[深度学基础]优化器算法SGD,AdaGrad,RMSprop,Adam

[复制链接]
发表于 2023-4-6 10:46 | 显示全部楼层 |阅读模式
本文首先介绍基础梯度下降法,然后介绍对SGD的改进方法:动量法、AdaGrad、RMSprop以及Adam。本专栏的文章都是本人找工作时根据面试经历和网络资料整理,因此更偏向于要点罗列的形式。由于是为了应付面试,内容略显肤浅,且本人水平有限,若想在学术科研的层面有更深入的理解,还请参考相关论文以及大佬的文章。
梯度下降法

梯度是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快。梯度下降的主要思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降[这个意思是使得待优化函数例如Loss减小最快的参数更新方向]方向,所以也被称为”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。当目标函数是凸函数时,梯度下降的解时全局最优。但一般情况下,其解不保证全局最优。梯度下降原理推导(这个链接里的马东什么:梯度下降法和一阶泰勒展开的关系,很清晰),主要是理解为什么负梯度时下降最快的方向,为什么会有学习率这个东西,本质是对损失函数进行泰勒展开得到的。
在机器学习种,基于基本的梯度下降法,发展出了3种具体的梯度下降方法,分别为 BGD(Batch Gradient Descent批量梯度下降法),SGD, mini-batch GD
批量梯度下降法(Batch Gradient Desceent, BGD):具体做法也就是在更新参数时使用所有的样本来进行更新。 这样一来每迭代一步,都要用到训练集所有的数据,如果数据量很大,那么可想而知这种方法的迭代速度会很慢。
随机梯度下降(Stochastic Gradient Descent, SGD):每次迭代只用到了一个样本,在样本量很大的情况下,常见的情况是只用到了其中一部分样本数据即可迭代到最优解。因此随机梯度下降比批量梯度下降在计算量上会大大减少。SGD有一个缺点是,其噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。而且SGD因为每次都是使用一个样本进行迭代,因此最终求得的最优解往往不是全局最优解,而只是局部最优解。但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。
小批量梯度下降(Mini-batch Gradient Descent):小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用 x个样子来迭代,1<x<m 。
指数移动平均

为了方便后续对SGD的改进方法的介绍,先介绍指数移动平均的概念。指数移动平均是以指数式递减加权的移动平均。 各数值的加权影响力随时间而指数式递减,越近期的数据加权影响力越重,但较旧的数据也给予一定的加权值。
计算公式为: v_t=\beta v_{t-1}+(1-\beta)\theta_t  
优点:当想要计算均值的时候,不用保留所有时刻的值。随着时间推移,遥远过去的历史的影响会越来越小
动量法(Momentum)

算法思想:参数更新方向不仅由当前的梯度决定,也与此前累积的梯度方向有关。将过去梯度的指数移动平均称为动量。当前参数的更新值由动量和当前梯度两部分确定。在当前梯度方向发生改变时(震荡通常发生在梯度方向改变的时候),动量能够降低参数更新的速度,从而减少震荡;当前梯度方向与之前的梯度方向相同时,动量能够加速参数更新,从而加速收敛。
参数更新:
m_{t+1}=\gamma m_t + (1-\gamma)\nabla_{\theta}J(\theta)
    \theta_{t+1}=\theta_{t}-m_{t+1}
参数 \gamma 决定了之前的梯度的贡献衰减的速度。当 \gamma=0 时,动量法就是SGD。



引入动量的随机梯度下降示意图

算法流程:



来源于西瓜书

AdaGrad

算法思想:之前的SGD、动量法对每个参数都使用相同的学习率,AdaGrad对不同的参数动态采取不同的学习率。对于每个参数,其学习率为全局学习率除以该参数历史梯度平方和的平方根。在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。缺点:由于累计梯度平方和,训练中后期,分母越来越大,导致学习率很快会接近0。
参数更新:
s_{t+1}=s_t+\nabla_{\theta}J(\theta)\odot \nabla_{\theta}J(\theta)
\theta_{t+1}=\theta_{t}-\frac{\alpha}{\sqrt{s_{t+1}+\varepsilon}}\odot\nabla_{\theta}J(\theta)
\odot 表示Hadamard乘积(向量对应位置的元素相乘), \alpha 是全局学习率。
算法流程:



来源于西瓜书

RMSprop

基本思想:RMSprop也是一种自适应学习率的方法,是在AdaGrad上的改进。AdaGrad会累计之前所有的梯度平方,而RMSprop采用的是指数加权移动平均,能够丢弃掉遥远过去的历史梯度平方,从而缓解AdaGrad学习率随迭代次数下降过快的问题。
参数更新:
r_{t+1}=\gamma r_t+(1-\gamma)\nabla_{\theta}J(\theta)\odot\nabla_{\theta}J(\theta)
\theta_{t+1}=\theta_{t}-\frac{\alpha}{\sqrt{r_{t+1}+\epsilon}}\odot\nabla_{\theta}J(\theta)
算法流程:



来源于西瓜书

Adam

基本思想:也是一种自适应学习率的方法,可以看作是结合了RMSProp和动量法。Adam同时具备Momentum和RMSprop的优点。一是记录了过去的梯度,使用过去的累积梯度(动量)和当前梯度共同确定当前参数的更新量,可以减小震荡,加速收敛。而是使用梯度平和的累积值来动态调整学习率。

m_{t+1}=\beta_1m_t+(1-\beta_1)\nabla_{\theta}J(\theta)
r_{t+1}=\beta_2r_t+(1-\beta_2)\nabla_{\theta}J(\theta)\odot\nabla_{\theta}J(\theta)
\hat{m}_{t+1}=\frac{m_{t+1}}{1-\beta_1^{t}}, \hat{r}_{t+1}=\frac{r_t}{1-\beta_2^t}
\theta_{t+1}=\theta_t-\frac{\alpha}{\sqrt{r_{t+1}+\epsilon}}m_{t+1}
算法流程:



来源于西瓜书

Adam详细参数说明可以参见https://blog.csdn.net/sinat_36618660/article/details/100026261
参考资料

https://zhuanlan.zhihu.com/p/29920135
深度学习花书
https://zhuanlan.zhihu.com/p/32626442
https://zhuanlan.zhihu.com/p/29895933
https://blog.csdn.net/sinat_36618660/article/details/100026261
上述内容是本人去年找工作的时候整理的,参考了网络上很多资料,有些资料没有记录来源。如有雷同,那一定是本人搬运了~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-9 22:55 , Processed in 0.170947 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表