趋近智
AdaGrad、RMSprop 和 Adam 是具有重要理论优势的自适应学习率算法。观察这些优化器在具体机器学习任务中的表现,能为其应用提供有益的直观认识。在此,将比较这三种常见自适应学习率算法的收敛表现和性能。
我们的目标是观察每种优化器最小化损失函数的速度,以及训练过程中验证性能的变化。我们将采用标准设置,以确保公平比较。
我们需要一个模型、一个数据集和一个损失函数。为了简化和便于重现,我们使用:
无论使用哪种优化器,核心训练循环都保持类似,但实例化步骤有所不同。下面是使用 PyTorch 类似语法的一个概览:
DataLoader 实例。
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleMLP(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 64)
self.fc3 = nn.Linear(64, 10)
def forward(self, x):
x = x.view(-1, 784) # 展平图像
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.log_softmax(self.fc3(x), dim=1) # 输出对数概率
return x
model = SimpleMLP()
# 如果可用,将模型移动到 GPU
# device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# model.to(device)
```
3. 定义损失:
python criterion = nn.NLLLoss()
4. 实例化优化器: 为你要比较的每个优化器创建独立的实例。我们最初将使用标准默认超参数,但请记住这些是可以调整的。
```python
import torch.optim as optim
# 常见初始学习率(示例)
lr = 0.001
# 实例化优化器
optimizer_adagrad = optim.Adagrad(model.parameters(), lr=lr)
optimizer_rmsprop = optim.RMSprop(model.parameters(), lr=lr)
optimizer_adam = optim.Adam(model.parameters(), lr=lr)
# 存储它们以便迭代(或运行单独的训练脚本)
optimizers = {
"AdaGrad": optimizer_adagrad,
"RMSprop": optimizer_rmsprop,
"Adam": optimizer_adam
}
```
*注意:* 在使用*每个*优化器进行训练之前,你需要重新初始化模型权重,以确保从相同的起点开始公平比较。
5. 训练循环: 对于每个优化器,运行固定数量的训练周期。 ```python
# num_epochs = 10
# train_losses = []
# val_accuracies = []
# # 在开始对当前优化器进行训练之前,在此处重新初始化模型权重
# for epoch in range(num_epochs):
# model.train()
# running_loss = 0.0
# for images, labels in train_loader:
# # images, labels = images.to(device), labels.to(device) # 将数据移动到设备
# optimizer.zero_grad() # 清零此批次的梯度
# outputs = model(images)
# loss = criterion(outputs, labels)
# loss.backward() # 计算梯度
# optimizer.step() # 更新权重
# running_loss += loss.item()
# epoch_loss = running_loss / len(train_loader)
# train_losses.append(epoch_loss)
# # 验证阶段
# model.eval()
# correct = 0
# total = 0
# with torch.no_grad():
# for images, labels in val_loader:
# # images, labels = images.to(device), labels.to(device)
# outputs = model(images)
# _, predicted = torch.max(outputs.data, 1)
# total += labels.size(0)
# correct += (predicted == labels).sum().item()
# epoch_acc = 100 * correct / total
# val_accuracies.append(epoch_acc)
# print(f'Epoch {epoch+1}, Loss: {epoch_loss:.4f}, Val Acc: {epoch_acc:.2f}%')
# # 在训练下一个优化器之前,存储当前优化器的结果
```
6. 记录结果: 存储每个优化器在每个训练周期内的训练损失和验证准确率(或损失)。
绘制记录的指标是比较性能的最佳方式。
AdaGrad、RMSprop 和 Adam 的训练损失(对数尺度)与训练周期的关系图。越低越好。请注意,RMSprop 和 Adam 通常比 AdaGrad 更快地下降。
验证准确率与训练周期的关系图。越高越好。在此类设置中,Adam 和 RMSprop 通常比 AdaGrad 更快地达到更高的准确率。
常见观察:
这次实践比较突出了自适应学习率方法的优点。通过根据梯度历史动态调整每个参数的步长,AdaGrad、RMSprop 和 Adam 通常比固定学习率方法更快地收敛,尤其是在神经网络常见的复杂损失曲面上。
尽管 Adam 因其稳定性和技术组合常成为一个强有力的默认选择,但了解 AdaGrad 和 RMSprop 的行为能提供有益的背景信息。请记住,最佳优化器可能取决于具体问题。遵循本章讨论的原则进行实验,对于在机器学习任务中取得最佳结果非常重要。这次实践经验使你在选择和使用这些强大的优化工具时能做出明智的决策。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造