14 PyTorch小白从零学教程系列:模型训练之选择优化器
在上一篇文章中,我们讨论了如何定义损失函数。这是模型训练中的重要一步,因为损失函数为我们提供了一个评估模型性能的标准。在进行模型训练时,除了损失函数,选择合适的优化器同样至关重要。优化器是调整模型参数的关键,它直接影响到模型的收敛速度和最终效果。今天,我们将一起探讨如何在PyTorch中选择合适的优化器,并了解一些常见的优化器及其适用场景。
1. 理解优化器
在机器学习中,训练模型的核心任务是通过最小化损失函数来优化模型的参数。这一过程通常涉及到梯度下降方法。优化器的作用便是根据计算出的梯度来更新模型参数,以减小损失。
常见的优化器分为两类:标准的梯度下降优化器和自适应学习率优化器。
1.1 标准的梯度下降优化器
-
SGD(随机梯度下降): SGD 是最基础的优化器,其更新公式为:
其中, 是参数, 是学习率, 是损失函数关于参数的梯度。
-
Momentum(动量法): 为了加速SGD的收敛,Momentum 为梯度更新引入了一个“惯性”:
这里, 是动量, 通常取值在0.9到0.99之间。
1.2 自适应学习率优化器
-
Adam(自适应动量估计): Adam 结合了Momentum和RMSProp的优点,其参数更新公式较为复杂,但在实际中表现良好:
其中, 是梯度的一阶矩估计, 是梯度的二阶矩估计, 是为了防止除零的一个小常数。
2. PyTorch中的优化器选择
在PyTorch中,我们可以通过 torch.optim
模块来快速选择和使用优化器。以下是一个使用SGD和Adam优化器的基本示例:
import torch
import torch.nn as nn
import torch.optim as optim
# 创建一个简单的线性模型
model = nn.Linear(10, 1)
# 选择损失函数
criterion = nn.MSELoss()
# 使用SGD优化器
optimizer_sgd = optim.SGD(model.parameters(), lr=0.01)
# 或者使用Adam优化器
optimizer_adam = optim.Adam(model.parameters(), lr=0.001)
# 假设有一些输入数据和目标标签
inputs = torch.randn(5, 10)
targets = torch.randn(5, 1)
# 进行一次训练迭代
optimizer_sgd.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer_sgd.step()
# 如果使用Adam优化器
optimizer_adam.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer_adam.step()
print("训练完成")
在这里,我们定义了一个线性模型,并选择SGD和Adam作为优化器。通过调用优化器的 zero_grad
方法来清除之前的梯度,计算损失后使用 backward
方法反向传播梯度,最后用 step
方法来更新模型参数。
3. 如何选择优化器
选择合适的优化器通常依赖于以下几个因素:
-
任务复杂性:对于复杂性较高的任务,建议使用自适应学习率的优化器(如Adam),因为它能自适应调整学习率,有助于加快收敛。
-
计算资源限制:如果面临计算资源的限制,SGD伴随动量法通常更为高效。
-
经验法则:有时候,通过实验了解不同优化器在特定任务上的表现会更为直观。
4. 总结
在本篇中,我们详细探讨了PyTorch中优化器的选择,包括了标准的SGD和自适应的Adam两个重要优化器。选择适当的优化器是提高模型训练效率与效果的关键一步。在下一篇中,我们将深入讨论模型训练中的“训练循环的实现”,具体看看如何将计算、更新和评估整合在一起,为我们实现完整的训练过程打下良好的基础。