torch.optim 是 PyTorch 中的优化器模块,它提供了一系列用于训练神经网络的优化算法。优化器通过调整模型参数的学习率来最小化损失函数。
常用优化器
以下是 torch.optim 中一些常用的优化器:
SGD (随机梯度下降)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
参数:
params: 待优化的参数。
lr: 学习率。
momentum: 动量因子。
dampening: 动量阻尼。
weight_decay: 权重衰减(L2惩罚)。
nesterov: 使用Nesterov动量。
Adam (自适应矩估计)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
参数:
params: 待优化的参数。
lr: 学习率。
betas: 用于计算梯度和梯度平方的运行平均值的系数(默认值为 (0.9, 0.999))。
eps: 为了数值稳定性添加的小量(默认值为 1e-8)。
weight_decay: 权重衰减(L2惩罚)。
RMSprop
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)
参数:
params: 待优化的参数。
lr: 学习率。
alpha: 平滑常数。
eps: 为了数值稳定性添加的小量。
weight_decay: 权重衰减(L2惩罚)。
momentum: 动量因子。
centered: 是否计算去中心化的二阶矩。
Adagrad
optimizer = torch.optim.Adagrad(model.parameters(), lr=0.01)
参数:
params: 待优化的参数。
lr: 学习率。
lr_decay: 学习率衰减。
weight_decay: 权重衰减(L2惩罚)。
常见方法
每个优化器都提供了一些常见的方法:
zero_grad():
清除所有被优化参数的梯度。
optimizer.zero_grad()
step():
执行单次优化步骤(参数更新)。
optimizer.step()
state_dict():
返回优化器的状态字典,用于保存和加载优化器状态。
optimizer_state = optimizer.state_dict()
load_state_dict(state_dict):
加载优化器的状态字典。
optimizer.load_state_dict(optimizer_state)
使用示例
以下是一个完整的示例,展示如何使用 torch.optim 模块训练一个简单的神经网络:
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的神经网络
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc = nn.Linear(10, 2)
def forward(self, x):
return self.fc(x)
# 初始化网络和优化器
model = SimpleNet()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 损失函数
criterion = nn.CrossEntropyLoss()
# 模拟训练数据
inputs = torch.randn(32, 10)
targets = torch.randint(0, 2, (32,))
# 训练步骤
for epoch in range(10):
optimizer.zero_grad() # 清除梯度
outputs = model(inputs) # 前向传播
loss = criterion(outputs, targets) # 计算损失
loss.backward() # 反向传播
optimizer.step() # 更新参数
print(f"Epoch {epoch+1}, Loss: {loss.item()}")
在这个示例中,我们定义了一个简单的神经网络,使用 Adam 优化器来优化模型参数,并在每个训练周期中执行前向传播、计算损失、反向传播和参数更新。