Pytorch基础(十)——优化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

本文深入介绍了PyTorch中的几种优化器,包括SGD(随机梯度下降)、Adagrad(自适应梯度算法)、RMSprop(均方根)和Adam(自适应矩估计)。这些优化器在神经网络训练中用于调整学习率和更新参数,以最小化损失函数。此外,还提到了LBFGS优化器,一种内存高效的优化算法。每种优化器的参数和工作原理都有详细阐述,例如SGD的动量、Adagrad的学习率自适应、RMSprop的梯度平方平均以及Adam的动量和二阶矩估计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

Pytorch中优化器的目的:将损失函数计算出的差值Loss减小。
优化过程:优化器计算网络参数的梯度,然后使用一定的算法策略来对参数进行计算,用新的参数来重新进行训练,最终降低Loss。
其中官网提供了13种优化算法,其中主要的有5种:SGD(stochastic gradient descent 随机梯度下降),Adagrad(自适应梯度算法),Adam(Adaptive Moment Estimation 自适应矩估计),RMSprop(Root Mean Square Prop 均方根),LBFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno 有限内存中进行BFGS算法),其他均为改进算法,比如Adadelta是Adagrad的改进算法。
其中还有很多算法细节可能后续会慢慢补充。

二、介绍和示例

2.1 SGD算法

SGD算法可实现随机梯度下降(可选动量)。
torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)
params:可迭代参数以优化或定义参数组。
lr:初始学习率,可随着训练过程不断调整学习率。
momentum:动量,通常设置为0.9,0.8。momentum又称为动量梯度下降。
dampening:动量阻尼,默认为0。
weight_decay:权值衰减系数,即L2正则化。
nesterov:启用牛顿动量。Nesterov是Momentum的变种,就是梯度的计算方法有所不同,先用当前的速度v更新一遍权重θ,然后用更新参数p计算梯度g。
动量法:
在这里插入图片描述
nesterov:
在这里插入图片描述

learning_rate = 1e-2
optim = torch.optim.SGD(wzh.parameters(), lr=learning_rate, momentum=0.9, weight_decay=1e-2)

# 优化器调优
optim.zero_grad()
loss.backward()
optim.step()

2.2、Adagrad

Adagrad算法可以自适应的给所有的参数分配学习率,学习率的大小与梯度的大小成反比。
torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)
lr_decay:学习率衰减因子,默认为0。
eps :将其添加到分母以提高数值稳定性,默认值为1e-10,其主要的作用是避免分母为0.
在这里插入图片描述

optim1 = torch.optim.Adagrad(wzh.parameters(), lr=learning_rate, lr_decay=0, weight_decay=0.01,
                             initial_accumulator_value=0, eps=1e-10)

2.3 RMSprop

RMSprop算法是Adagrad的改进形式,特点是使用指数衰减滑动平均来更新梯度平方,以避免Adagrad累计梯度平方导致学习率过小的缺点。
torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
alpha:平滑常数,默认为0.99。
centered:如果为真,计算中心 RMSProp,梯度通过其方差的估计进行归一化。
在这里插入图片描述

由官网给出的公式可以看出,用α的值来更新梯度平方。

optim2 = torch.optim.RMSprop(wzh.parameters(), lr=learning_rate, alpha=0.99, eps=1e-8, weight_decay=0.01,
                             momentum=0, centered=False)

2.4 Adam

Adam算法结合了RMSProp和Momentum的算法思路,由公式可以看出,分别用m和v两个动量来对梯度进行计算,可以说是目前应用相当广泛的优化器算法。
betas:用于计算梯度及其平方的运行平均值的系数,默认值为(0.9, 0.999)。
amsgrad:是否使用论文 On the Convergence of Adam and Beyond 中该算法的 AMSGrad 变体,默认值为false。
在这里插入图片描述

optim3 = torch.optim.Adam(wzh.parameters(), lr=learning_rate, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01,
                          amsgrad=False)

2.5 LBFGS

LBFGS是BFGS四位大佬一起开发的一个算法,可以有效节省系统内存,缩小BFGS算法迭代产生的n维D矩阵,只保留部分步数。
pytorch中也可以使用改算法,但需要注意:
1:此优化器不支持每个参数选项和参数组(只能有一个)。
2:现在所有参数都必须在一个设备上。
3:这是一个非常占用内存的优化器(它需要额外的 param_bytes * (history_size + 1) 字节)。 如果它不适合内存尝试减少历史记录大小,或使用不同的算法。
torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100, line_search_fn=None)
max_iter:每个优化步骤的最大迭代次数,默认值20。
max_eval:每个优化步骤的最大函数评估次数,默认值max_iter * 1.25.
tolerance_grad:一阶最优性的终止容限,默认值1e-5。
tolerance_change:函数值/参数更改的终止容差,默认值1e-9。
history_size:更新历史大小 。
line_search_fn:“strong_wolfe”或“None” 。
详细原理部分可见:
一文读懂L-BFGS算法

optim3 = torch.optim.LBFGS(wzh.parameters(), lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-07, 
                           tolerance_change=1e-09, history_size=100, line_search_fn=None)

三、参考文章

通俗易懂理解(梯度下降)优化算法:Momentum、AdaGrad、RMSProp、Adam

### PyTorch 支持的优化器类型及使用方法 #### Adam 优化器 Adam 是一种广泛使用的自适应学习率优化算法,它结合了 AdaGradRMSProp 的优点。该优化器通常用于处理稀疏梯度以及非平稳目标。 ```python import torch.optim as optim # 定义模型 model = ... # 创建 Adam 优化器实例 optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0, amsgrad=False) ``` #### SGD (随机梯度下降) 优化器 SGD 是最基础也是最常见的优化算法之一,在每次迭代过程中仅采用单一样本更新权重参数。尽管收敛速度较慢,但在某些情况下可以达到更好的泛化效果[^1]。 ```python # 创建 SGD 优化器实例 optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, dampening=0, weight_decay=1e-4, nesterov=False) ``` #### RMSprop 优化器 RMSprop 是另一种自适应学习率的方法,旨在解决 Adagrad 学习速率过早衰减的问题。此方法通过对平方梯度计算移动平均来动态调整每个参数的学习步长[^5]。 ```python # 创建 RMSprop 优化器实例 optimizer = optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99, eps=1e-8, weight_decay=0, momentum=0, centered=False) ``` #### Adadelta 优化器 Adadelta 基于累积梯度平方和累积更新量之间的比率来进行权值更新操作。这种方法不需要设置全局学习率,从而简化了超参调节过程。 ```python # 创建 Adadelta 优化器实例 optimizer = optim.Adadelta(model.parameters(), lr=1.0, rho=0.9, eps=1e-6, weight_decay=0) ``` #### AdamW 优化器 AdamW 对原始 Adam 进行改进,解决了权重衰减不正确应用的问题。这有助于提高正则化的有效性并改善最终性能表现。 ```python # 创建 AdamW 优化器实例 optimizer = optim.AdamW(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01, amsgrad=False) ``` 除上述几种外,PyTorch 还提供了诸如 ASGDLBFGS 等更多类型的优化器供开发者选用。值得注意的是,并不是所有的优化器都能被编译加速;例如 L-BFGS 和 SparseAdam 就不在支持列表之内[^2]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值