PyTorch torch.optim
一、torch.optim 是什么?
torch.optim
是 PyTorch 中实现各种优化算法的软件包。它支持最常用的方法,并且接口足够通用,方便将来集成更复杂的方法。
二、如何使用优化器?
(一)构造优化器
要构造一个优化器,您必须为其提供一个包含参数的可迭代项(所有参数应为 Variable
)以进行优化。然后,您可以指定优化器特定的选项,例如学习率、权重衰减等。
注意:如果需要将模型移到 GPU,请在构建优化器之前执行此操作。因为 .cuda()
之后的模型参数将与调用之前的参数不同。
示例代码:
## 构造一个 SGD 优化器,设置学习率为 0.01,动量为 0.9
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
## 构造一个 Adam 优化器,设置学习率为 0.0001
optimizer = torch.optim.Adam([var1, var2], lr=0.0001)
(二)每个参数选项
Optimizer
支持为每个参数指定不同的选项。为此,您需要传递一个 dict
的迭代器,每个 dict
定义一个参数组,并包含一个 params
键,其中包含属于该组的参数列表。其他键应与优化器接受的关键字参数匹配,并将用作该组的优化选项。
示例代码:
## 为不同的模型部分设置不同的学习率
optimizer = torch.optim.SGD([
{'params': model.base.parameters()}, # 使用默认学习率
{'params': model.classifier.parameters(), 'lr': 1e-3} # 设置学习率为 1e-3
], lr=1e-2, momentum=0.9)
(三)采取优化步骤
所有优化器都实现了 step()
方法,用于更新参数。
1. optimizer.step()
这是最常用的简化版本。在计算梯度后,调用该函数即可。
示例代码:
for input, target in dataset:
optimizer.zero_grad() # 清除梯度
output = model(input)
loss = loss_fn(output, target)
loss.backward() # 计算梯度
optimizer.step() # 更新参数
2. optimizer.step(closure)
某些优化算法(如共轭梯度和 LBFGS)需要多次重新评估函数。此时,您需要传递一个闭包以允许它们重新计算模型。
示例代码:
for input, target in dataset:
def closure():
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
return loss
optimizer.step(closure)
三、常用优化算法介绍
(一)torch.optim.SGD
torch.optim.SGD
实现了随机梯度下降算法,可选带动量。
示例代码:
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
(二)torch.optim.Adam
torch.optim.Adam
实现了 Adam 算法,这是一种广泛使用的自适应学习率优化算法。
示例代码:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
(三)torch.optim.Adagrad
torch.optim.Adagrad
实现了 Adagrad 算法,适用于处理稀疏数据。
示例代码:
optimizer = torch.optim.Adagrad(model.parameters(), lr=0.01)
(四)torch.optim.RMSprop
torch.optim.RMSprop
实现了 RMSprop 算法,该算法通过除以梯度的滑动平均值来自动调整学习率。
示例代码:
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)
四、如何调整学习率?
torch.optim.lr_scheduler
提供了多种根据训练进度调整学习率的方法。
(一)torch.optim.lr_scheduler.StepLR
torch.optim.lr_scheduler.StepLR
在每个指定的周期后将学习率乘以一个因子。
示例代码:
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
train(...)
validate(...)
scheduler.step()
(二)torch.optim.lr_scheduler.ReduceLROnPlateau
torch.optim.lr_scheduler.ReduceLROnPlateau
当指标停止改善时,降低学习率。
示例代码:
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min')
for epoch in range(10):
train(...)
val_loss = validate(...)
scheduler.step(val_loss)
五、总结
通过本教程,我们详细介绍了 PyTorch 中的 torch.optim
包,包括如何构造和使用优化器、常用优化算法以及如何调整学习率。选择合适的优化器和学习率调整策略对于模型的训练效果和收敛速度至关重要。
在实际应用中,您可以根据模型的特点和训练需求,选择不同的优化算法和学习率调整方法。同时,合理设置优化器的参数(如学习率、动量等)可以进一步提升模型的性能。
更多建议: