【Pytorch】优化器(Optimizer)模块‘torch.optim’
torch.optim
是 PyTorch 中提供的优化器(Optimizer)模块,用于优化神经网络模型的参数,更新网络权重,使得模型在训练过程中最小化损失函数。它提供了多种常见的优化算法,如 梯度下降法(SGD)、Adam、Adagrad、RMSprop 等,用户可以根据需要选择合适的优化方法。
目录
- 优化器的工作原理
- `torch.optim` 中的常见优化器
- 常用优化器参数
- 优化器的基本使用方法
- 完整示例
- 总结
优化器的工作原理
优化器通过计算损失函数对模型参数的梯度(通常使用反向传播算法),然后根据优化算法的规则更新模型的参数,以逐步减少损失函数的值。具体更新规则取决于所选的优化算法。
torch.optim
中的常见优化器
-
SGD(Stochastic Gradient Descent)
- SGD 是最基本的优化算法,它通过计算损失函数的梯度,并按某个学习率(
learning rate
)更新模型的参数。 - 可以选择是否使用动量(
momentum
)来加速收敛。
示例:
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
- SGD 是最基本的优化算法,它通过计算损失函数的梯度,并按某个学习率(
-
Adam(Adaptive Moment Estimation)
- Adam 是一种结合了动量法(Momentum)和自适应学习率(AdaGrad)的优化算法。它会分别对每个参数维护一个一阶矩估计(梯度的平均值)和二阶矩估计(梯度的平方的平均值),从而自适应地调整每个参数的学习率。
- Adam 通常比 SGD 更常用于深度学习中的优化,尤其是在处理大规模数据时。
示例:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
-
Adagrad(Adaptive Gradient Algorithm)
- Adagrad 是一种自适应优化算法,它为每个参数分配不同的学习率,并根据每个参数的梯度历史调整学习率。梯度大的参数会减小学习率,而梯度小的参数会增大学习率。
示例:
optimizer = torch.optim.Adagrad(model.parameters(), lr=0.01)
-
RMSprop(Root Mean Square Propagation)
- RMSprop 是 Adagrad 的一种变体,旨在解决 Adagrad 学习率过早衰减的问题。它使用指数衰减的平均来计算梯度的平方,从而避免了梯度下降时过早减小学习率。
示例:
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99)
-
AdamW(Adam with Weight Decay)
- AdamW 是 Adam 优化器的一个变种,加入了权重衰减(weight decay),用来防止模型过拟合。它与标准的 Adam 不同之处在于,它在参数更新过程中将权重衰减项分离出来,避免了标准 Adam 中衰减项的负面影响。
示例:
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
-
LBFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno)
- LBFGS 是一种二阶优化方法,它使用目标函数的二阶导数(Hessian 矩阵的近似)来加速收敛。与其他一阶方法相比,它在计算和内存使用上比较昂贵,但在某些特定问题中(如小批量数据和二次优化问题)能够提供更快的收敛速度。
示例:
optimizer = torch.optim.LBFGS(model.parameters(), lr=0.1)
常用优化器参数
每个优化器通常会接受以下几个参数:
params
:待优化的参数(通常是模型的权重),可以使用model.parameters()
获取。lr
(Learning Rate):学习率,控制每次参数更新的步长。较小的学习率可能导致收敛过慢,较大的学习率可能导致发散。momentum
(可选):用于动量的参数,通常用来加速收敛。weight_decay
(可选):L2 正则化系数,用于防止模型过拟合。betas
(Adam 和一些其他优化器):用于控制一阶矩(梯度的均值)和二阶矩(梯度的方差)衰减率的超参数。
优化器的基本使用方法
-
创建优化器:
通常在定义了模型后,通过torch.optim
创建一个优化器,并将模型的参数传递给优化器。optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
-
梯度清零:
在每次迭代前,需要将模型参数的梯度清零,避免梯度累积。optimizer.zero_grad()
-
计算梯度:
使用反向传播计算梯度。loss.backward()
-
更新参数:
调用step()
方法,根据计算出的梯度更新模型的参数。optimizer.step()
完整示例
下面是一个完整的使用优化器的示例:
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的神经网络
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(10, 20)
self.fc2 = nn.Linear(20, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 创建模型
model = SimpleNet()
# 创建优化器(使用 Adam 优化器)
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 假设有一些输入数据和目标标签
input_data = torch.randn(5, 10) # 输入数据:5个样本,每个样本10维
target = torch.randn(5, 1) # 目标标签:5个样本,每个样本1维
# 定义损失函数
criterion = nn.MSELoss()
# 训练过程
for epoch in range(100): # 训练 100 次
# 前向传播
output = model(input_data)
# 计算损失
loss = criterion(output, target)
# 清零梯度
optimizer.zero_grad()
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
# 打印每个 epoch 的损失
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')
总结
torch.optim
提供了多种优化器(如 SGD、Adam、RMSprop 等)用于训练神经网络,用户可以选择合适的优化器来优化模型的参数。- 常见的优化器包括 Adam(适应性调整学习率)、SGD(随机梯度下降)、RMSprop、Adagrad 等,选择哪个优化器取决于你的任务、模型和实验。
- 优化器的核心工作流程包括:清零梯度、计算梯度、反向传播、更新参数。
选择合适的优化器和调优超参数(如学习率)是深度学习训练的一个关键部分。