深度学习训练之optimizer优化器(BGD、SGD、MBGD、SGDM、NAG、AdaGrad、AdaDelta、Adam)的最全系统详解

1、BGD(批量梯度下降)

定义:批量梯度下降法(Batch Gradient Descent,BGD)是最原始的形式,它是指在每一次
迭代时使用所有样本来进行梯度的更新。
优点:一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
缺点:当样本数目 m 很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。

在这里插入图片描述

2、SGD(随机梯度下降)

定义:一次只对一个样本进行梯度下降,进行参数更新;
优点:由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快;
缺点:准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛;可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势;不易于并行实现;

2.1、SGD导致的Zigzag现象

由于是随机梯度下降,下图左上角的同心圆是单样本的loss等值线图,右下角也是和左上角一样都是单样本的等值线图,可以看到如果是SGD的话,梯度下降的方向会出现不稳定,不能线性收敛,即Zigzag现象。

在这里插入图片描述

3、MBGD(小批量梯度下降)

定义:小批量梯度下降(Mini-Batch Gradient Descent, MBGD)是对批量梯度下降以及随
机梯度下降的一个折中办法。其思想是:每次迭代 使用指定个(batch_size)样本来对
参数进行更新。
优点:通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
缺点:batch_size的不当选择可能会带来一些问题。

3.1 BGD、SGD、MBGD的比较

在这里插入图片描述

4、SGDM

全称是: Stochastic Gradient Descent with Momentum,动量随机梯度下降。

为什么提出?

因为使用SGD容易出现Zigzag现象,为了避免出现Zigzag现象,所以有了SGDM方法。

过程:
函数: f ( ω t ) f(\omega_t) f(ωt)
ω t + 1 = ω t − η t \omega_{t+1}=\omega_{t}-\eta_t ωt+1=ωtηt
η t = α ⋅ m t \eta_t=\alpha \cdot m_t ηt=αmt,其中 α \alpha α是学习率
m t = β 1 ⋅ m t − 1 + ( 1 − β 1 ) ⋅ g t m_t=\beta_1\cdot m_{t-1}+(1-\beta_1)\cdot g_t mt=β1mt1+(1β1)gt
其中:
β 1 \beta_1 β1是动量参数, m t m_t mt是累计梯度, g t g_t gt是当前梯度
g t = ∇ f ( ω t ) g_t=\nabla f(\omega_t) gt=f(ωt)

先对 m t m_t mt的前三项进行展开,
在这里插入图片描述
每一项的 m t m_t mt都包含前面的所有的 g i g_i gi,使梯度下降的方向的趋于BGD的方向,从而也趋近于我们优化的方向。
下面是关于SGDM为什么是趋近于BGD优化方向的图解,希望能看得懂,
在这里插入图片描述

5、NAG

全称为:Nesterov Accelerated Gradient (SGD with Nesterov Acceleration)

这个方法用的比较少,我也没有看懂,就贴一下这个方法的过程吧;

在这里插入图片描述

6、AdaGrad(Adaptive Gradient)

定义:自适应梯度下降,每次梯度下降时会除以前面梯度计算总和的平方再开方;每个参数都有自己独有的学习率
优点:避免前期梯度下降的梯度爆炸和弥散;
缺点:后期有可能会停止训练

V t = ∑ τ = 1 t g τ 2 V_t=\sum_{\tau=1}^{t}g_\tau^2 Vt=τ=1tgτ2

η t = α ⋅ g t / V t \eta_t=\alpha\cdot g_t / \sqrt{V_t} ηt=αgt/Vt

ω t + 1 = ω t − η t \omega_{t+1}=\omega_t-\eta_t ωt+1=ωtηt

在这里插入图片描述

7、AdaDelta/RMSProp

全称:Root Mean Square Propogation / Adaptive Delta
目的:解决AdaGrad过早收敛的问题;

在这里插入图片描述

8、Adam(Adaptive Moments Estimation)

结合了SGDM和AdaDelta

在这里插入图片描述


在这里插入图片描述

9、总结

在这里插入图片描述

参考:
1、哔站视频

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Momentum SGD(动量随机梯度下降)是一种优化算法,它在标准随机梯度下降(SGD)的基础上引入了动量的概念。动量可以理解为在梯度下降过程中加入惯性,类似于一个小球从山上滚下来时的动量。动量可以帮助SGD训练过程中更快地收敛,并且可以减少震荡。 在动量SGD中,每次更新参数时,除了使用当前的梯度,还会考虑之前的更新方向和速度。具体来说,动量SGD引入了一阶动量(momentum),用来表示之前的更新方向和速度。一阶动量的计算公式如下: ``` v = β * v - learning_rate * gradient ``` 其中,v表示一阶动量,β是一个介于0和1之间的超参数,learning_rate表示学习率,gradient表示当前的梯度。一阶动量的计算可以看作是当前梯度和之前一阶动量的加权和。 然后,使用一阶动量来更新参数: ``` parameters = parameters + v ``` 通过引入动量,动量SGD可以在梯度下降过程中积累之前的更新方向和速度,从而在更新参数时更加稳定。这样可以帮助SGD跳出局部最优解,并且在参数空间中更快地找到全局最优解。 下面是一个使用动量SGD的示例代码: ```python import numpy as np # 定义损失函数和梯度 def loss_function(x): return x**2 def gradient(x): return 2*x # 初始化参数和一阶动量 parameters = 5 v = 0 # 设置超参数 learning_rate = 0.1 beta = 0.9 # 迭代更新参数 for i in range(10): # 计算梯度 grad = gradient(parameters) # 更新一阶动量 v = beta * v - learning_rate * grad # 更新参数 parameters = parameters + v # 打印参数值 print("Iteration", i+1, ": parameters =", parameters) ``` 这段代码演示了使用动量SGD来优化一个简单的损失函数。在每次迭代中,计算梯度、更新一阶动量和更新参数,后打印参数值。通过观察参数的变化,可以看到动量SGD在更新过程中更加平稳,并且可以更快地收敛到最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值