从代码学习深度学习 - 优化算法 PyTorch 版
文章目录
- 前言
- 一、小批量梯度下降(Mini-batch Gradient Descent)
- 1.1 公式
- 1.2 PyTorch 实现
- 二、动量法(Momentum)
- 2.1 公式
- 2.2 PyTorch 实现
- 三、AdaGrad 算法
- 3.1 公式
- 3.2 PyTorch 实现
- 四、RMSProp 算法
- 4.1 公式
- 4.2 PyTorch 实现
- 五、Adadelta 算法
- 5.1 公式
- 5.2 PyTorch 实现
- 六、Adam 算法
- 6.1 公式
- 6.2 PyTorch 实现
- 七、Yogi 算法
- 7.1 公式
- 7.2 PyTorch 实现
- 总结
前言
优化算法是深度学习的核心,它们决定了模型训练的效率和结果的质量。在这篇博客中,我们将通过 PyTorch 代码实例,深入理解各种优化算法的原理和实现。我们将使用一个简单的线性回归任务,在 airfoil_self_noise.dat
数据集上比较不同优化算法的表现。这个数据集包含了与翼型自噪声相关的特征和目标变量。
该博客中仅仅介绍了不同的优化算法,利用这写算法实现特定任务的流程这里不再介绍,请参考从代码学习深度学习 - 小批量随机梯度下降 PyTorch 版。
通过代码学习,我们能够建立更直观的理解,看到优化算法在实际训练中的差异。让我们开始这段深度学习优化算法的探索之旅!
完整代码:下载链接
一、小批量梯度下降(Mini-batch Gradient Descent)
小批量梯度下降是最基础的优化算法,它在原始梯度下降的基础上,每次只使用一小批样本来计算梯度,从而提高训练效率。
1.1 公式
g t , t − 1 = 1 ∣ B ∗ t ∣ ∑ ∗ i ∈ B ∗ t h ∗ i , t − 1 \mathbf{g}_{t,t-1}=\frac{1}{|\mathcal{B}*t|}\sum*{i\in\mathcal{B}*t}\mathbf{h}*{i,t-1} gt,t−1=∣B∗t∣1∑∗i∈B∗th∗i,t−1
- B t \mathcal{B}_t Bt:第 t t t 次迭代中选取的小批量样本集合
- h i , t − 1 = ∇ w f ( x i , w t − 1 ) \mathbf{h}_{i,t-1} = \nabla_\mathbf{w} f(\mathbf{x}_i, \mathbf{w}_{t-1}) hi,t−1=∇wf(xi,wt−1):表示样本 i i i 在参数 w t − 1 \mathbf{w}_{t-1} wt−1 下的随机梯度
- g t , t − 1 \mathbf{g}_{t,t-1} gt,t−1:小批量平均梯度估计,用于更新参数
1.2 PyTorch 实现
# 定义优化器-小批量梯度下降
trainer = torch.optim.SGD
# 设置超参数并训练模型
# 'lr': 0.01 表示学习率为0.01
train(trainer, {'lr': 0.01}, data_iter)
二、动量法(Momentum)
动量法通过累积历史梯度来加速训练过程,特别是在梯度方向一致的维度上。它可以减少训练过程中的震荡,帮助模型更快地收敛。
2.1 公式
v ∗ t = β v ∗ t − 1 + g t \mathbf{v}*t=\beta\mathbf{v}*{t-1}+\mathbf{g}_t v∗t=βv∗t−1+gt w ∗ t = w ∗ t − 1 − η v t \mathbf{w}*t=\mathbf{w}*{t-1}-\eta\mathbf{v}_t w∗t=w∗t−1−ηvt
其中:
- v t \mathbf{v}_t vt:动量项,表示累积的梯度
- β ∈ ( 0 , 1 ) \beta \in (0,1) β∈(0,1):动量衰减系数,控制历史梯度的影响程度
- g t \mathbf{g}_t gt:当前梯度
- η \eta η:学习率
2.2 PyTorch 实现
# 定义优化器-带动量的小批量梯度下降
trainer = torch.optim.SGD
# 'lr': 0.005 表示学习率为0.005
# 'momentum': 0.9 表示动量系数为0.9
train(trainer, {'lr': 0.005, 'momentum': 0.9}, data_iter)
三、AdaGrad 算法
AdaGrad 算法根据参数的历史梯度调整学习率,使得频繁更新的参数有较小的学习率,不常更新的参数有较大的学习率。
3.1 公式
- 累积梯度平方和: r ∗ t = r ∗ t − 1 + g t 2 \mathbf{r}*t = \mathbf{r}*{t-1} + \mathbf{g}_t^2 r∗t=r∗t−1+gt2
- 参数更新: w ∗ t = w ∗ t − 1 − η