optimizer 优化器
pytorch
本文字数:1.9k 字 | 阅读时长 ≈ 7 min

optimizer 优化器

pytorch
本文字数:1.9k 字 | 阅读时长 ≈ 7 min

本文主要讲解 各种优化器 ,对应的 PyTorch 实现放在下篇 torch.optim

1. GD

GD(gradient descent)梯度下降,在机器学习中对模型进行更新,更新如下所示
\[ \begin{aligned} \frac{df(x)}{dx} &= \lim_{x\rightarrow 0} \frac{f(x+h)-f(x)}{h} \\ ~~ \\ \theta_{t+1} &= \theta_{t}-\eta_{t}\bigtriangledown f(\theta_{t}) \end{aligned} \]
这是最原始的剃度下降方法,每次计算梯度\(\bigtriangledown f(\theta_{t})\)时都需要对整个训练集进行遍历,即需要训练集的全部数据。当我们的数据集非常大时对整个数据集进行计算是很麻烦的,而且每次更新参数\(\theta\)的数值时都很慢,也就是说我们需要迭代无数多次而每次都需要对整个数据集进行计算梯度,耗时很长,而且当参数移动到局部最优点(鞍点,梯度为0)时,就会陷入其中,参数停止更新

由于本文主要讲解SGD及其改进,所以对GD不做详细介绍

2. SGD及其改进

与GD不同,SGD每次从数据集中取出部分mini-batch,求部分数据集的loss,即用部分数据的梯度来近似整体的梯度,首先和GD一样,我们需要了解梯度更新的过程

\[ \begin{aligned} \theta_{t+1} &= \theta_{t}-\eta_{t}\bigtriangledown f(\theta_{t}) \end{aligned} \]

其中

计算与更新过程如图所示

2.1 SGD

SGD与GD不同的地方就在于SGD使用的是mini batch,如下图所示,SGD一共分为如下几步

2.2 SGDM

SGDM是上述SGD的改进加入了动量,假设在SGD的优化过程中梯度\(\bigtriangledown L(\theta^{t}) = 0\),此时参数\(\theta\)的值不会继续改变,如下图所示,但是当我们加入momentum以后,即使梯度为0,动量也会告诉参数要继续变化

那究竟什么是动量呢,这个动量和物理上的动量相似,想象一个场景我们在滑滑梯,当我们在滑梯上准备下滑时,滑梯是有一个斜度,我们在上面就有一个沿着滑梯下滑的力(也就是梯度),我们开始下滑,当我们到滑梯中间的某一处时,由于有梯度+在上一秒我们的初速度,我们不会停下,即使我们到了滑梯底部滑梯变平了我们失去了向前的力(梯度),我们依然具有之前积累的速度,所以我们会继续向前运动,SGDM就是应用了这个道理

接下来看一下SGDM的具体执行过程

第一次更新------------------>

第二次更新------------------>

重复上述过程---------------->

通过上述计算可以发现,每次移动的距离不仅取决于所在点的梯度,还取决于上一步的移动,而上一步的移动与之前所有计算过的梯度都有关

2.3 Adagrad

与SGD不同的地方是,Adagrad在学习率上作了文章,如下公式所示

\[ \theta_{t+1} = \theta_{t} - \frac{\eta}{\sqrt{\sum_{i=0}^{t}(\bigtriangledown L(\theta_{i}))^2}} \bigtriangledown L(\theta_{t}) \]

这样做的意义是什么呢?有两点

2.4 RMSProp

上述Adagrad有一个缺点,当一开始梯度较大时学习率会变得很小,我们希望在最优解的地方梯度下降变慢,但现在我们适得其反,在一开始的时候参数更新的就非常慢,而且学习率的分母是累加的梯度,导致学习率会越来越低,为了改变这个缺点,出现了RMSProp

\[ \begin{aligned} \theta_{t+1} &= \theta_{t} - \frac{\eta}{\sqrt{v_{t+1}}} \bigtriangledown L(\theta_{t}) \\ v_{1} & = \bigtriangledown L(\theta_{0})^2 \\ v_{t+1} & = \alpha v_{t} + (1-\alpha)(\bigtriangledown L(\theta_{t}))^{2} \\ \end{aligned} \]

虽然\(v_{t}\)与之前的梯度也有关,但是\(\alpha\)的存在使得分母不会像Adagrad那样累加,让我们看一下\(v\)的变化情况

2.5 Adam

到这里我们梳理一下,我们现在讲了GD,SGD,SGDM,Adagrad以及RMSProp

\[ \begin{aligned} \theta_{t+1} &= \theta_{t} - \eta m_{t+1} \\ SGDM:~~~~~ m_{t+1} & = \beta_{1}m_{t} + (1-\beta_{1}) \bigtriangledown L(\theta_{t})^2 \end{aligned} \]

\[ \begin{aligned} \theta_{t+1} &= \theta_{t} - \frac{\eta}{\sqrt{v_{t+1}}} \bigtriangledown L(\theta_{t}) \\ RMSProp:~~~~~ v_{1} & = \bigtriangledown L(\theta_{0})^2 \\ v_{t+1} & = \alpha v_{t} + (1-\alpha)(\bigtriangledown L(\theta_{t}))^{2} \\ \end{aligned} \]

SGDM是对加入了动量,是对梯度进行了变化;RMSProp是对学习率进行了改进,而Adam结合了两者的优点,可以理解为:Adam = SGDM+RMSProp

\[ \begin{aligned} \theta_{t+1} &= \theta_{t} - \frac{\eta}{\sqrt{\hat{v_{t}}}+\epsilon} \hat{m_{t}} \\ \hat{m_{t}} &= \frac{m_{t}}{1-\beta_{1}^{t}} \\ \hat{v_{t}} &= \frac{v_{t}}{1-\beta_{2}^{t}} \\ \beta_{1} = 0.9 ~~ &\beta_{2} = 0.999 ~~ \epsilon = 10^{-8} \end{aligned} \]

Sep 06, 2026
Aug 01, 2026