当前位置: 首页 > article >正文

【PyTorch】torch.optim介绍

文章目录

  • PyTorch torch.optim介绍
  • 1. torch.optim主要功能
  • 2. 常见的优化算法
    • 2.1 SGD(随机梯度下降)
    • 2.2 Momentum(带动量的SGD)
    • 2.3 Adam(自适应矩估计)
    • 2.4 RMSprop
    • 2.5 Adagrad
  • 3. 优化器的核心操作
    • 3.1 初始化优化器
    • 3.2 `optimizer.zero_grad()`
    • 3.3 `loss.backward()`
    • 3.4 `optimizer.step()`
    • 3.5 梯度裁剪
  • 4. 学习率调整(`lr_scheduler`)
    • 4.1 StepLR
    • 4.2 ReduceLROnPlateau
    • 4.3 ExponentialLR
  • 5. 完整的训练过程示例
  • 6. 总结

PyTorch torch.optim介绍

torch.optim 是 PyTorch 中用于优化神经网络模型参数的模块,它实现了多种常见的优化算法(如 SGD、Adam、RMSprop 等),通过计算损失函数对参数的梯度并根据梯度更新模型的权重。

1. torch.optim主要功能

  • 优化算法的实现:提供多种优化算法,如常见的 SGDAdamRMSprop 等,适用于不同类型的模型和任务。
  • 动态学习率调整:支持动态调整学习率的策略(如 lr_scheduler),在训练过程中提高效率。
  • 参数更新:通过计算梯度并更新模型的参数,优化器会优化模型的权重,以最小化损失函数。

2. 常见的优化算法

2.1 SGD(随机梯度下降)

SGD 是最经典的优化算法,适用于大多数简单的深度学习问题。它通过更新参数的方式,沿着负梯度方向逐步减小损失。

import torch
import torch.optim as optim
import torch.nn as nn

# 假设定义了一个简单的神经网络模型
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 创建模型实例
model = SimpleNN()

# 定义损失函数和优化器
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 假设训练数据
input_data = torch.randn(64, 784)  # 假设64个样本,每个样本784维
labels = torch.randint(0, 10, (64,))  # 64个标签,10个类别

# 训练过程
for epoch in range(10):
    optimizer.zero_grad()  # 清除梯度
    output = model(input_data)  # 前向传播
    loss = loss_fn(output, labels)  # 计算损失
    loss.backward()  # 反向传播
    optimizer.step()  # 更新参数
    print(f'Epoch [{epoch+1}/10], Loss: {loss.item()}')

2.2 Momentum(带动量的SGD)

Momentum 方法是在每次更新时加入前一步的梯度信息,这样能加速收敛并减少波动。

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

在上面的例子中,momentum=0.9 表示前一步更新的梯度贡献占 90%。

2.3 Adam(自适应矩估计)

Adam 是一种自适应优化算法,它结合了 MomentumRMSprop 的优点。Adam 会根据每个参数的均值和方差动态调整学习率。

optimizer = optim.Adam(model.parameters(), lr=0.001)

Adam 的优点:

  • 自适应学习率:每个参数都有自己的学习率。
  • 收敛速度快:通常在较少的训练步骤内能达到较好的效果。

2.4 RMSprop

RMSprop 是另一种自适应学习率的优化算法,特别适合处理循环神经网络(RNN)等任务。

optimizer = optim.RMSprop(model.parameters(), lr=0.01)

RMSprop 通过调整每个参数的学习率来避免某些参数更新过快或过慢。

2.5 Adagrad

Adagrad 是另一种自适应优化算法,它在每个参数的学习率上进行调整,使得稀疏数据的特征能够快速收敛。

optimizer = optim.Adagrad(model.parameters(), lr=0.01)

Adagrad 的主要特点是它对每个参数有独立的学习率,参数的更新根据梯度大小自适应调整。

3. 优化器的核心操作

3.1 初始化优化器

初始化优化器时,通常需要传入模型的参数和学习率。例如:

optimizer = optim.Adam(model.parameters(), lr=0.001)

model.parameters() 返回模型的所有可学习参数,lr=0.001 是优化器的学习率。

3.2 optimizer.zero_grad()

在每次更新参数前,需要清除之前的梯度,因为 PyTorch 中的梯度是累积的。可以使用 optimizer.zero_grad() 来清空梯度。

optimizer.zero_grad()

3.3 loss.backward()

计算反向传播,PyTorch 会根据损失函数的梯度自动计算每个参数的梯度。

loss.backward()

3.4 optimizer.step()

通过梯度信息更新模型的参数。调用 optimizer.step() 后,优化器会使用当前计算的梯度来更新模型的权重。

optimizer.step()

3.5 梯度裁剪

为了防止梯度爆炸问题,通常会进行梯度裁剪操作。可以使用 torch.nn.utils.clip_grad_norm_ 来对梯度进行裁剪。

torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

这会将所有参数的梯度裁剪到最大范数 1.0

4. 学习率调整(lr_scheduler

PyTorch 提供了多个学习率调整策略,可以帮助在训练过程中动态调整学习率,以便模型更好地收敛。

4.1 StepLR

StepLR 会在每隔一定步数后降低学习率,通常用于训练时逐渐减小学习率,防止过拟合。

scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)

step_size 个 epoch 后,学习率会乘以 gamma,例如每 10 个 epoch 后学习率会变为原来的 0.1。

4.2 ReduceLROnPlateau

ReduceLROnPlateau 根据验证集的性能来调整学习率。如果模型在一定的 epoch 内未能改善,学习率就会减小。

scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=5, factor=0.1)
  • patience=5:如果验证损失在 5 个 epoch 内没有下降,学习率就会减少。
  • factor=0.1:每次减少学习率时,将其乘以 0.1

4.3 ExponentialLR

ExponentialLR 通过指数衰减来调整学习率。

scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99)

在每个 epoch 后,学习率会乘以 gamma=0.99,实现指数衰减。

5. 完整的训练过程示例

import torch
import torch.optim as optim
import torch.nn as nn
import torch.nn.functional as F

# 定义一个简单的神经网络模型
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 创建模型实例
model = SimpleNN()

# 定义损失函数
loss_fn = nn.CrossEntropyLoss()

# 定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 定义学习率调度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)

# 模拟训练过程
for epoch in range(20):
    optimizer.zero_grad()  # 清空梯度
    input_data = torch.randn(64, 784)  # 假设的输入数据
    labels = torch.randint(0, 10, (64,))  # 假设的标签
    outputs = model(input_data)
    loss = loss_fn(outputs, labels)
    loss.backward()  # 反向传播
    optimizer.step()  # 更新参数
    
    # 每5个epoch调整一次学习率
    scheduler.step()
    
    print(f'Epoch [{epoch+1}/20], Loss: {loss.item()}, Learning Rate: {optimizer.param_groups[0]["lr"]}')

6. 总结

  • 优化器:PyTorch 提供了多种优化算法,如 SGD、Adam、RMSprop、Adagrad 等。根据任务选择合适的优化器。
  • 学习率调整torch.optim.lr_scheduler 提供了多种动态调整

学习率的策略,帮助模型更好地收敛。

  • 梯度裁剪:防止梯度爆炸,保证训练过程的稳定性。

通过合理的优化器选择和学习率调整,可以大大提高模型的训练效率和性能。


http://www.kler.cn/a/549158.html

相关文章:

  • 撕碎QT面具(1):Tab Widget转到某个Tab页
  • vscode/cursor+godot C#中使用socketIO
  • CentOS搭建PPPOE服务器
  • JUC并发-4.wait和notify以及Atomic原理
  • 4.完成html文件读取|获取title|获取content|构建url|调试(C++)
  • DeepSeek 助力 Vue 开发:打造丝滑的瀑布流布局(Masonry Layout)
  • JAVA EE初阶 - 预备知识(一)
  • 计算机视觉:卷积神经网络(CNN)基本概念(二)
  • 全方位养生指南:打造健康生活蓝图
  • 【论文笔记】On Generative Agents in Recommendation
  • Docker 数据卷的使用与数据持久化(二)
  • 数位dp入门详解
  • GDB QUICK REFERENCE (GDB 快速参考手册)
  • Vue2 中使用 UniApp 时,生命周期钩子函数总结
  • 案例-04.部门管理-删除
  • 负载测试工具有哪些?
  • unity学习44:学习Animator 的一个动作捕捉网站,实测好用
  • 蓝桥杯篇---IAP15F2K61S2串口
  • 【第13章:自监督学习与少样本学习—13.2 少样本学习(FSL)与元学习(Meta-Learning)的基础理论与应用案例】
  • 29、深度学习-自学之路-深入理解-NLP自然语言处理-做一个完形填空,让机器学习更多的内容程序展示