当前位置: 代码迷 >> 综合 >> 【调参炼丹】深度学习中优化方法对比(BGD,SGD,Mini-batch gradient descent,Momentum, RMSProp, Adam)
  详细解决方案

【调参炼丹】深度学习中优化方法对比(BGD,SGD,Mini-batch gradient descent,Momentum, RMSProp, Adam)

热度:53   发布时间:2023-12-16 18:10:59.0

对输入样本大小(batch)的改变:

为了提升训练的速度,可以改变每次输入模型中的样本数量大小。

1.批量梯度下降(BGD):一个epoch训练所有的样本后更新一遍梯度。

特点:速度慢。

2.随机梯度下降(SGD):每训练一个样本,更新一遍梯度。

特点:速度快,但不易收敛。

3.小批量梯度下降(Mini-batch gradient descent):把总的数据分为若干批次,每个批次更新一遍梯度。每个批次的大小即为batch_size。

特点:平衡以上两种特点。

对学习率的改变:

首先,基于小批量梯度下降法,需要选择合适的学习率,学习率太大,模型最后会在最优点附近徘徊,无法达到最优,而学习率过小,则会导致训练时速度过慢。

1. Momentum(动量):

首先介绍移动指数加权平均,移动指数加权平均法加权就是根据同一个移动段内不同时间的数据对预测值的影响程度,分别给予不同的权数,然后再进行平均移动以预测未来值。公式:

                                                                

Momentum优化器基于梯度的移动指数加权平均,公式如下:

                                                           

在上面的公式中vdw和vdb分别是损失函数在前t?1轮迭代过程中累积的梯度梯度动量,β是梯度累积的一个指数,这里我们一般设置值为0.9。所以Momentum优化器的主要思想就是利用了类似与移动指数加权平均的方法来对网络的参数进行平滑处理的,让梯度的摆动幅度变得更小。
dW和db分别是损失函数反向传播时候所求得的梯度,下面两个公式是网络权重向量和偏置向量的更新公式,α是网络的学习率。当我们使用Momentum优化算法的时候,可以解决mini-batch SGD优化算法更新幅度摆动大的问题同时可以使得网络的收敛速度更快。

变体:Nesterov动量Nesterov动量计算梯度的时候首先临时更新了权重参数,使用的是之前的动量进行临时更新,再根据临时的参数进行计算梯度。


2. RMSProp:

首先介绍它的基础版:

AdaGrad:

adaGrad对梯度乘以累积平方梯度的反比。在参数空间相对平缓的情况下,偏导数会比较小(偏导数<1),乘以累积平方梯度的反比以后会加快步长。相反,当参数空间相对陡峭的情况下,步长会变小。

RMSProp是基于 AdaGrad与Momentum的变体:(相比AdaGrad多了移动平均参数β)

为了进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度,RMSProp算法对权重 W 和偏置 b 的梯度使用了微分平方加权平均数。 
其中,假设在第 t 轮迭代过程中,各个公式如下所示: 

                                                            

算法的主要思想就用上面的公式表达完毕了。在上面的公式中sdw和sdb分别是损失函数在前t?1轮迭代过程中累积的梯度梯度动量,β 是梯度累积的一个指数。所不同的是,RMSProp算法对梯度计算了微分平方加权平均数。这种做法有利于消除了摆动幅度大的方向,用来修正摆动幅度,使得各个维度的摆动幅度都较小。另一方面也使得网络函数收敛更快。(比如当 dW 或者 db 中有一个值比较大的时候,那么我们在更新权重或者偏置的时候除以它之前累积的梯度的平方根,这样就可以使得更新幅度变小)。为了防止分母为零,使用了一个很小的数值 ? 来进行平滑,一般取值为10^{-8}

3. Adam

Adam(Adaptive Moment Estimation)算法是将Momentum算法和RMSProp算法结合起来使用的一种算法,参数基本和上面讲的一致。

初始化:

                                                       

假设在训练的第 t 轮训练中,我们首先可以计算得到Momentum和RMSProp的参数更新

                                                              

由于移动指数平均在迭代开始的初期会导致和开始的值有较大的差异,所以我们需要对上面求得的几个值做偏差修正。 

                                                                             

通过上面的公式,我们就可以求得在第 tt 轮迭代过程中,参数梯度累积量的修正值,从而接下来就可以根据Momentum和RMSProp算法的结合来对权重和偏置进行更新。 

                                                                    

上面的所有步骤就是Momentum算法和RMSProp算法结合起来从而形成Adam算法。在Adam算法中,参数 β1 所对应的就是Momentum算法中的 β 值,一般取0.9,参数 β2 所对应的就是RMSProp算法中的 β 值,一般我们取0.999,而 ? 是一个平滑项,我们一般取值为 10^{-8},而学习率 α 则需要我们在训练的时候进行微调。
adam变体:adamax:

在 Adam 中,单个权重的更新规则是将其梯度与当前和过去梯度的 L^2 范数(标量)成反比例缩放。而我们可以将基于 L^2 范数的更新规则泛化到基于 L^p 范数的更新规则中。虽然这样的变体会因为 p 的值较大而在数值上变得不稳定,但是在特例中,我们令 p → ∞会得出一个极其稳定和简单的算法.

                                                          

参考:https://blog.csdn.net/willduan1/article/details/78070086

          https://blog.csdn.net/nickkissbaby_/article/details/81066643

https://blog.csdn.net/xiaocong1990/article/details/81605534

 

 

  相关解决方案