PyTorch 的优化器
在深度学习中,优化器是训练模型的重要组件,用于更新模型参数以最小化损失函数。
优化是一个尝试为深度学习模型找到最佳参数集的过程。优化器生成新的参数值,并使用某些标准来评估它们以确定最佳选项。作为神经网络架构的重要组成部分,优化器有助于确定能够产生预期输出的最佳权重、偏差或其他超参数。
PyTorch 提供了许多种类的优化器,每种都有其自身的优缺点。这些包括 Adagrad、Adam、RMSProp 等。
Adam优化器
torch.optim.Adam 是 PyTorch 中常用的优化器之一,它结合了动量法和自适应学习率的优点,被广泛应用于各种神经网络的训练。Adam 根据梯度的一阶和二阶矩估计,为不同参数计算自适应学习率,这有助于加速收敛并处理稀疏梯度。
Adam(自适应矩估计)优化算法结合了 AdaGrad 和 RMSProp 算法的优点,使其在处理稀疏梯度和优化非平稳目标时非常有效 。Adam 为每个参数使用自适应学习率,并引入动量来加速收敛。
优点:
- 自适应学习率:它动态调整每个参数的学习率,通常比固定学习率的随机梯度下降(SGD)等传统方法收敛更快。
- 动量积分:它结合了动量(使用过去的梯度来平滑更新)和 RMSprop(使用平方梯度来缩放学习率)的思想。
- 鲁棒性:与其他优化器相比,它通常需要较少的超参数调整,并且是适用于广泛任务的稳健选择。
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False , * , foreach=None , maximize=False , capturable=False , differentiable=False , fused=None , decoupled_weight_decay=False)
Parameters 参数:
- params (iterable) -- 参数或 named_parameters 的可迭代对象以进行优化,或定义参数组的可迭代字典。使用 named_parameters 时,所有组中的所有参数都应命名
- lr (float, Tensor, 可选) -- 学习率(默认:1e-3)。不支持所有实现中的张量 LR。如果您没有同时指定 fused=True 或 capturable=True,请使用浮点数 LR。
- betas (tuple[Union[float, Tensor], Union[float, Tensor]], 可选) -- 用于计算梯度及其平方的运行平均系数。如果提供张量,必须是 1 元素。(默认:(0.9, 0.999))
- eps (float, 可选) -- 添加到分母以提高数值稳定性的项(默认:1e-8)
- weight_decay (float, optional) -- 权重衰减(L2 惩罚)(默认值: 0)
- decoupled_weight_decay (bool, optional) -- 如果为 True,此优化器等同于 AdamW,并且算法不会在动量或方差中累积权重衰减。(默认值: False)
- amsgrad (bool, optional) -- 是否使用 Adam 算法的 AMSGrad 变体,该变体来自论文"On the Convergence of Adam and Beyond"。(默认值: False)
1.Adam 的核心参数
Adam 代表自适应矩估计,结合了 AdaGrad 和 RMSprop 两者的优点:AdaGrad 的每参数学习率和 RMSprop 的动量。
Adam 的核心参数包括学习率(alpha)、第一矩估计(beta1)和第二矩估计(beta2)的衰减率,以及用于防止除零操作的微小常数 epsilon。这些参数是我们用来优化神经网络学习过程的旋钮。
2.学习率:调优的起点
学习率可以说是最重要的超参数。它决定了优化器在沿着误差梯度下降时的步长大小。过高的学习率可能导致错过最小值,而过低的学习率则可能导致收敛速度极其缓慢或陷入局部最小值。在 PyTorch 中,设置学习率非常简单:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
然而,找到最佳点需要实验,并且通常需要一个学习率调度器来随着训练的进行调整速率。
3.动量参数:速度与稳定性的双重保障
Beta1 和 Beta2 分别控制梯度及其平方的移动平均的衰减率。Beta1 通常设置为接近 1,默认值为 0.9,使优化器能够积累动量并加速学习。Beta2 通常设置为 0.999,通过考虑更广泛的过去梯度窗口来稳定学习。调整这些值可以导致更快收敛或帮助跳出平台期:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))
4.Epsilon:一个微小但影响巨大的数字
Epsilon 看似微不足道,但对于数值稳定性至关重要,尤其是在处理小梯度时。默认值通常足够,但在极端精度或半精度计算的情况下,调整 epsilon 可以防止 NaN 错误:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, eps=1e-08)
5.权重衰减:正则化守护者
权重衰减是一种 L2 正则化形式,通过惩罚较大的权重来帮助防止过拟合。在 Adam 中,权重衰减的应用方式不同,确保正则化与学习率一同调整。这可以成为提高泛化能力的有力工具:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-4)
L1正则化 VS L2正则化:
https://mp.csdn.net/mp_blog/creation/editor/149297350
权值衰减 ≠ L2正则化:
6.Amsgrad:主题的变体
Amsgrad 是 Adam 的一种变体,旨在通过使用过去的平方梯度的最大值而不是指数平均值来解决收敛问题。这可以带来更稳定和一致的收敛,尤其是在复杂的景观中:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, amsgrad=True)
整合所有内容:一种调优策略
调整 Adam 的参数是一个涉及训练、评估和调整的迭代过程。
从默认值开始,然后调整学习率,接着是 beta1 和 beta2。
如果你使用半精度,请留意 epsilon,并考虑使用权重衰减进行正则化。
以验证性能为依据;不要害怕尝试。
精通 PyTorch 中的 Adam 优化器,既需要科学知识也需要艺术技巧。理解和仔细调整其超参数可以显著提高模型的效率和性能。请记住没有一劳永逸的解决方案;每个模型和数据集可能都需要一套独特的超参数。拥抱实验的过程,让改进的结果成为你深入探索 Adam 优化能力的旅程的回报。
深入学习Adam优化器的数学计算过程:(计算过程没看懂,使用过程看懂了)
https://blog.csdn.net/shizheng_Li/article/details/144447269
使用随机梯度下降训练模型代码实战:
https://machinelearningmastery.com/using-optimizers-from-pytorch/
优化算法三剑客:SGD、Adam、AdamW的深度对比
请参考文档:https://zhuanlan.zhihu.com/p/1969127329512031963
Adam 与 SGD 深入探讨
请参考文档:https://medium.com/@Biboswan98/optim-adam-vs-optim-sgd-lets-dive-in-8dbf1890fbdc
Adam 与 AdamW 深入探讨
请参考文档:https://www.datacamp.com/tutorial/adamw-optimizer-in-pytorch
训练误差与泛化误差
训练误差(Training Error)是模型在训练集上的平均损失,反映模型对已知数据的拟合程度;泛化误差(Generalization Error)是模型在未见新数据上的期望误差,衡量模型的推广能力。
降低训练误差不一定能降低泛化误差,过拟合(训练低、泛化高)和欠拟合(训练高、泛化高)是关键问题,目标是使两者均低。

核心概念详解:
- 训练误差 (Training Error/Empirical Error)
- 定义:模型在训练集上做出的预测与实际标签之间的差异。
- 现象:模型通过不断迭代使得训练误差最小化。
- 泛化误差 (Generalization Error/True Error)
- 定义:模型在所有真实数据(总体)上的误差期望。
- 获取 :通常无法计算,实际中用一个未参与训练的测试集(Test Set)的误差来近似表示。
拟合关系:
训练误差 < 泛化误差:正常情况,模型在已知数据上通常表现更好。
训练误差 << 泛化误差 :过拟合。模型过分学习了训练数据的噪音,无法推广到新数据。
训练误差 ≈ 泛化误差 >> 0 :欠拟合。模型太简单,未能学习到数据的结构。
如何降低泛化误差:
- 增加数据量:数据越多,模型越难以死记硬背,从而减轻过拟合。
- 正则化:在损失函数中添加罚项(如正则化)限制模型复杂度。
- 模型选择:选择复杂度合适的模型,避免过于复杂的模型结构。
- 交叉验证:使用交叉验证调整超参数,找到使泛化误差最小的模型。