SGD,全称Stochastic Gradient Descent,随机梯度下降。核心思想是每次迭代时仅使用一个样本的梯度信息来更新模型参数。特别是在高维优化问题中,这减少了非常高的计算负担,实现更快的迭代以换取更低的收敛速度。随机梯度下降已成为机器学习中重要的优化方法。
梯度下降(Gradient Descent)
梯度下降是一种优化算法,用于最小化一个函数,通常在机器学习和人工智能中用于找到函数的局部最小值。这个函数通常是损失函数,它衡量了模型预测值与实际值之间的差异。梯度下降的核心思想是迭代地调整参数,以减少损失函数的值。用于求解无约束优化问题的迭代算法,特别常用于机器学习中的参数估计问题。其基本思想是,通过迭代地调整参数,沿着函数的负梯度方向寻找函数的局部最小值。
但是对于多维高次函数,梯度下降算法只能在局部找到最优解,但是不一定能找到全局最优解;并且传统的梯度下降很容易出现过拟合的情况。
随机梯度下降(SGD)
标准的梯度下降主要有两大缺点,一是训练过程及其缓慢,二是容易陷入局部最优解。
于是需要随机梯度下降算法。
在梯度下降的基础上,随机梯度下降从样本中随机抽出一组样本,训练后按梯度更新一次,然后再抽取一组样本更新一次。在样本量极其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型。
标准的随机梯度下降算法在每次参数更新时,仅仅选取一个样本计算梯度,用一个样本的梯度代替全部样本的梯度,能够大大加快训练速度。此外,由于每次迭代并不是都向着整体最优化方向,导致梯度下降的波动非常大,更容易从一个局部最优跳到另一个局部最优,但无法根本上解决局部最优问题。
我们通常所采用的SGD优化器,其实都采用Mini-batch Gradient Descent(小批量梯度下降法),我们熟悉的参数batch便应用于此。本质上是用一批样本的梯度代替全部样本的梯度。通常批大小选择2的倍数,方便计算机处理。
这种做好的好处是可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
SGD算法的几个问题
1.受抽取训练样本的影响较大。
2.没有解决梯度消失和梯度爆炸的情况。
3.无法处理过拟合的情况。
4.不能保证很好的收敛性。
基于MindSpore框架源码的SGD优化方法
MindSpore官方文档,SGD优化器的API
https://www.mindspore.cn/docs/zh-CN/r2.4.1/api_python/nn/mindspore.nn.SGD.html
MindSpore对SGD优化器已经使用了不少优化方法,有momentum,dampening,nesterov,weight-decay,gradients_centralization等。
动量法(Momentum)
原理
动量法在SGD的基础上引入了动量项,使得参数更新具有惯性。
优点
- 加速收敛:动量项使得参数更新具有惯性,能够更快地收敛到最优解。
- 减小震荡:动量项能够平滑梯度方向的变化,减小参数更新过程中的震荡。
缺点
- 需要调整额外的超参数:除了学习率之外,动量法还需要调整动量因子。
dampening
算法优点:当某个参数的梯度出现极端情况时,dampening算法能够削弱当前参数的梯度的值。从而减缓梯度对真实参数的影响,主要是作用于梯度爆炸时的情况。
nesterov
属于momentum算法的变种,与momentum唯一区别就是:计算梯度的不同。nesterov动量中,先用当前的速度vi临时更新一遍参数,再用更新的临时参数计算梯度。因此,nesterov动量可以解释为在momentum动量方法中添加了一个校正因子。
<