全国服务热线:0898-08980898
联系我们 contact us
地址:
海南省海口市
邮箱:
admin@youweb.com
电话:
0898-08980898
传真:
1234-0000-5678
公司动态 当前位置: 首页 > 傲世皇朝新闻 > 公司动态
[深度学基础]优化器算法SGD,AdaGrad,RMSprop,Adam添加时间:2024-04-15

本文首先介绍基础梯度下降法,然后介绍对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)\	heta_t

优点:当想要计算均值的时候,不用保留所有时刻的值。随着时间推移,遥远过去的历史的影响会越来越小

算法思想:参数更新方向不仅由当前的梯度决定,也与此前累积的梯度方向有关。将过去梯度的指数移动平均称为动量。当前参数的更新值由动量和当前梯度两部分确定。在当前梯度方向发生改变时(震荡通常发生在梯度方向改变的时候),动量能够降低参数更新的速度,从而减少震荡;当前梯度方向与之前的梯度方向相同时,动量能够加速参数更新,从而加速收敛。

参数更新:

m_{t+1}=\\gamma m_t + (1-\\gamma)\
abla_{\	heta}J(\	heta)

    \	heta_{t+1}=\	heta_{t}-m_{t+1}

参数 \\gamma 决定了之前的梯度的贡献衰减的速度。当 \\gamma=0 时,动量法就是SGD。

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

算法流程:

来源于西瓜书

算法思想:之前的SGD、动量法对每个参数都使用相同的学习率,AdaGrad对不同的参数动态采取不同的学习率。对于每个参数,其学习率为全局学习率除以该参数历史梯度平方和的平方根。在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。缺点:由于累计梯度平方和,训练中后期,分母越来越大,导致学习率很快会接近0。

参数更新:

s_{t+1}=s_t+\
abla_{\	heta}J(\	heta)\\odot \
abla_{\	heta}J(\	heta)

\	heta_{t+1}=\	heta_{t}-\\frac{\\alpha}{\\sqrt{s_{t+1}+\\varepsilon}}\\odot\
abla_{\	heta}J(\	heta)

\\odot 表示Hadamard乘积(向量对应位置的元素相乘), \\alpha 是全局学习率。

算法流程:

来源于西瓜书

基本思想:RMSprop也是一种自适应学习率的方法,是在AdaGrad上的改进。AdaGrad会累计之前所有的梯度平方,而RMSprop采用的是指数加权移动平均,能够丢弃掉遥远过去的历史梯度平方,从而缓解AdaGrad学习率随迭代次数下降过快的问题。

参数更新:

r_{t+1}=\\gamma r_t+(1-\\gamma)\
abla_{\	heta}J(\	heta)\\odot\
abla_{\	heta}J(\	heta)

\	heta_{t+1}=\	heta_{t}-\\frac{\\alpha}{\\sqrt{r_{t+1}+\\epsilon}}\\odot\
abla_{\	heta}J(\	heta)

算法流程:

来源于西瓜书

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


m_{t+1}=\\beta_1m_t+(1-\\beta_1)\
abla_{\	heta}J(\	heta)

r_{t+1}=\\beta_2r_t+(1-\\beta_2)\
abla_{\	heta}J(\	heta)\\odot\
abla_{\	heta}J(\	heta)

\\hat{m}_{t+1}=\\frac{m_{t+1}}{1-\\beta_1^{t}}, \\hat{r}_{t+1}=\\frac{r_t}{1-\\beta_2^t}

\	heta_{t+1}=\	heta_t-\\frac{\\alpha}{\\sqrt{r_{t+1}+\\epsilon}}m_{t+1}

算法流程:

来源于西瓜书

Adam详细参数说明可以参见blog.csdn.net/sinat_366

zhuanlan.zhihu.com/p/29

深度学习花书

zhuanlan.zhihu.com/p/32

zhuanlan.zhihu.com/p/29

blog.csdn.net/sinat_366

上述内容是本人去年找工作的时候整理的,参考了网络上很多资料,有些资料没有记录来源。如有雷同,那一定是本人搬运了~

平台注册入口