各类深度学习optimizer浅谈

    科技2025-10-04  10

    深度学习各类优化器


    由于最近在做相关实验时发现自己对优化器的理解还不够透彻于是重新整理一遍 参考文章

    机器学习笔记一——常用优化算法—GD、BGD、SCD、MBGD

    on-line gradient descent 常见的优化方法总结(GD,SGD,SAG,SVRG,BFGS)


    GD(Gradient Descent) 梯度下降

    顾名思义,梯度下降就是根据损失函数通过计算图计算最终结果相对于各个参数的梯度,然后沿着梯度的反方向对参数进行更新。该想法简单明了,就是从微积分中的梯度概念延伸而得。它并非一个具体应用的算法,而是一个思想。以下几个算法就是以GD为理论支撑的。

    BGD(Batch Gradient Descent)批量梯度下降法

    相比上述的GD法,BGD是将整个训练集的数据扔进网络里,然后计算loss,统一进行反向传播,更新时的思路和GD一致,还是取梯度的反方向进行参数的更新。

    缺点:通过一次更新就对整个数据集计算梯度,计算极慢,也不能实时扔进新数据

    OGD(Online Gradient Descent)在线梯度下降

    在时刻t做两边操作,首先利用当前已有的数据对 h t h_t ht进行一次更新,若得到的结果不在 H H H中那么就将其投影进来: (一下一段话来自其他博客)

    SGD(Stochastic Gradient Descent)随机梯度下降法

    和上述的BGD相比,这里又回到对单个样本进行梯度更新的思路,但是计算公式略有不同: 其实和BGD比起来,它只是将全部样本换成了一个样本,其他的思想一致。但是这样可以更灵活地增减数据。缺点:偶尔的噪声会影响局部的更新方向的正确性。优点:BGD可以很快到局部最小值,但是SGD可以适度跳出这种尴尬的情况。稍微减小lr可以使BGD和SGD效果接近。

    MBGD 小批量梯度下降(Mini-bath Gradient Descent)

    他的核心思想还是GD,只是和BGD与SGD相比起来他取到了折中,每次取一小批数据,一批一批地计算loss并反求梯度。采取K个样本求解的过程如下: 缺点:batch_size的选择不当会影响训练的结果;过大会爆内存;太大之后和BGD区别就不大了优点:矩阵运算提高内存利用率;处理速度变快。 三类梯度下降的一种示例:

    牛顿法

    这里的牛顿法和本人最近学的《计算方法》中的牛顿迭代或者牛顿下山比较类似。求函数极大极小问题那么一定是导数为0的点(如果有导数),于是考虑f(x)的泰勒展开: 而 Δ \Delta Δx就是x1-x0, 考虑多元函数的极值,这里就令后两项为0: n维下的情况: 优点:不只利用了一阶导数,还考虑了二阶导数,对信息利用更多

    BFGS

    改进了海森矩阵

    SAG——加速的SGD

    相对于SGD每次用当下的点的梯度更新,SAG考虑加入上一次的梯度影响空间换时间法。

    SVRG

    V和R分别是方差和缩减(reduction),G还是梯度在SGD或者SAG中,我们都只用了一个样本值去估梯度。在SVRG里,我们是用一个“批”,也就是n个样本去估计梯度,当然,我们并不是每次计算都要用新的n个样本去估计梯度,而是采取下面这种思路:在一段时间内(例如m次迭代)使用这n个样本来估计梯度,然后过完这段时间(经过m次迭代后)重新选择n个样本来估计梯度。当然这里还有一个类似SAG中的 “前一次迭代的梯度”这个信息。

    SGDM(SGD with Momentum)

    SGD固定的学习率有很多时候会让他陷入局部最优点,于是SGDM提出加入动量的思想,之所以这么说是将求解最优解的过程当做是一个下山的过程,除了知道当下坡度最大的方向,最好还有一个速度,这个速度会让自己冲出局部最优点,如果冲出了全局最优点也可以再根据梯度变化再走回来。 就将 v t v_t vt当做是动量即可,既加速又减少了震荡有时因为速度动量较大会走向loss上升的方向,还需要再迭代回来

    Nesterov Accelerated Gradient

    这是在SGDM上的优化,用 θ−γv_t−1 来近似当做参数下一步会变成的值,则在计算梯度时,不是在当前位置,而是未来的位置上 效果比较: 蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。 而 NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。

    以下为一些对学习率具有更为一般调整的算法


    AdaGrad

    可以对低频的参数做较大的更新,对高频的做较小的更新,提高SGD的鲁棒性。 而SGD公式如下: 其实就是lr在随t和i变化。优点:减少学习率的手动调节缺点:分母会不断积累,最后lr会很小

    Adadelta

    是对AdaGrad的改进,将分母的G进一步改进,换成了过去的梯度平方的衰减平均值: 分母其实就是梯度的均方根 E的计算如下: 另外还将学习率进行更换: 于是都不用自己设计学习率了,要设计的是 γ \gamma γ

    RMSprop

    同样是为了解决AdaGrad学习率下降过快的问题。 一般KaTeX parse error: Undefined control sequence: \gammr at position 1: \̲g̲a̲m̲m̲r̲为0.9,初始学习率为0.001

    Adam

    综合了过去的梯度和动量:

    Nadam

    在Adam上加上了Nesterov的思想,考虑下一次的梯度加到这一次上面来

    Processed: 0.010, SQL: 8