Jupyter AI

14 PyTorch小白从零学教程系列:模型训练之选择优化器

📅 发表日期: 2024年8月10日

分类: 🔥PyTorch 入门

👁️阅读: --

在上一篇文章中,我们讨论了如何定义损失函数。这是模型训练中的重要一步,因为损失函数为我们提供了一个评估模型性能的标准。在进行模型训练时,除了损失函数,选择合适的优化器同样至关重要。优化器是调整模型参数的关键,它直接影响到模型的收敛速度和最终效果。今天,我们将一起探讨如何在PyTorch中选择合适的优化器,并了解一些常见的优化器及其适用场景。

1. 理解优化器

在机器学习中,训练模型的核心任务是通过最小化损失函数来优化模型的参数。这一过程通常涉及到梯度下降方法。优化器的作用便是根据计算出的梯度来更新模型参数,以减小损失。

常见的优化器分为两类:标准的梯度下降优化器自适应学习率优化器

1.1 标准的梯度下降优化器

  • SGD(随机梯度下降): SGD 是最基础的优化器,其更新公式为:

    θnew=θoldηJ(θ)\theta_{new} = \theta_{old} - \eta \nabla J(\theta)

    其中,θ\theta 是参数,η\eta 是学习率,J(θ)\nabla J(\theta) 是损失函数关于参数的梯度。

  • Momentum(动量法): 为了加速SGD的收敛,Momentum 为梯度更新引入了一个“惯性”:

    vt=βvt1+(1β)J(θ)v_t = \beta v_{t-1} + (1 - \beta) \nabla J(\theta) θnew=θoldηvt\theta_{new} = \theta_{old} - \eta v_t

    这里,vv 是动量,β\beta 通常取值在0.9到0.99之间。

1.2 自适应学习率优化器

  • Adam(自适应动量估计): Adam 结合了Momentum和RMSProp的优点,其参数更新公式较为复杂,但在实际中表现良好:

    mt=β1mt1+(1β1)J(θ)m_t = \beta_1 m_{t-1} + (1 - \beta_1) \nabla J(\theta) vt=β2vt1+(1β2)(J(θ))2v_t = \beta_2 v_{t-1} + (1 - \beta_2)(\nabla J(\theta))^2 θnew=θoldηvt+ϵmt\theta_{new} = \theta_{old} - \frac{\eta}{\sqrt{v_t} + \epsilon} m_t

    其中,mtm_t 是梯度的一阶矩估计,vtv_t 是梯度的二阶矩估计,ϵ\epsilon 是为了防止除零的一个小常数。

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. 如何选择优化器

选择合适的优化器通常依赖于以下几个因素:

  1. 任务复杂性:对于复杂性较高的任务,建议使用自适应学习率的优化器(如Adam),因为它能自适应调整学习率,有助于加快收敛。

  2. 计算资源限制:如果面临计算资源的限制,SGD伴随动量法通常更为高效。

  3. 经验法则:有时候,通过实验了解不同优化器在特定任务上的表现会更为直观。

4. 总结

在本篇中,我们详细探讨了PyTorch中优化器的选择,包括了标准的SGD和自适应的Adam两个重要优化器。选择适当的优化器是提高模型训练效率与效果的关键一步。在下一篇中,我们将深入讨论模型训练中的“训练循环的实现”,具体看看如何将计算、更新和评估整合在一起,为我们实现完整的训练过程打下良好的基础。