SGD、Adam

简介: 【9月更文挑战第23天】

在深度学习中,optimizer.zero_grad() 是一个非常重要的步骤,它用于在每次迭代开始前清除(重置)模型参数的梯度。这是因为大多数优化算法(如SGD、Adam等)都是基于梯度的,它们需要在每次参数更新后清零梯度,以避免梯度累积。

为什么需要 optimizer.zero_grad()

在训练神经网络时,我们使用反向传播算法来计算每个参数的梯度。这些梯度表示损失函数相对于每个参数的敏感度,告诉我们应该如何调整参数以最小化损失。在每次迭代中,我们根据这些梯度来更新参数。

如果不在每次迭代前清零梯度,梯度将会累积,即新的梯度会加到旧的梯度上。这会导致错误的更新,因为每次更新应该只基于当前迭代计算的梯度。

如何使用 optimizer.zero_grad()

在使用PyTorch等深度学习框架时,optimizer.zero_grad() 通常在每次训练迭代的开始被调用。以下是一个简单的训练循环示例,展示了如何在PyTorch中使用它:

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

# 定义一个简单的模型
model = nn.Sequential(
    nn.Linear(10, 5),
    nn.ReLU(),
    nn.Linear(5, 1)
)

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

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

# 假设有一些训练数据
inputs = torch.randn(5, 10)
targets = torch.randn(5, 1)

# 训练循环
for epoch in range(5):
    # 清除梯度
    optimizer.zero_grad()

    # 前向传播
    outputs = model(inputs)

    # 计算损失
    loss = loss_fn(outputs, targets)

    # 反向传播
    loss.backward()

    # 参数更新
    optimizer.step()

    # 打印损失
    print(f'Epoch {epoch+1}, Loss: {loss.item()}')
AI 代码解读

在这个例子中,我们首先定义了一个简单的线性模型、损失函数和优化器。在训练循环中,我们使用 optimizer.zero_grad() 来清除梯度,然后进行前向传播、计算损失、反向传播和参数更新。

代码解释:

  • optimizer.zero_grad(): 清除模型参数的梯度。
  • loss.backward(): 计算梯度,这是通过反向传播自动完成的。
  • optimizer.step(): 根据计算得到的梯度更新模型参数。
目录
打赏
0
6
6
1
1187
分享
相关文章
深度学习优化入门:Momentum、RMSProp 和 Adam
虽然局部极小值和鞍点会阻碍我们的训练,但病态曲率会减慢训练的速度,以至于从事机器学习的人可能会认为搜索已经收敛到一个次优的极小值。让我们深入了解什么是病态曲率。
5005 0
Pytorch-Adam算法解析
肆十二在B站分享深度学习实战教程,本期讲解Adam优化算法。Adam结合了AdaGrad和RMSProp的优点,通过一阶和二阶矩估计,实现自适应学习率,适用于大规模数据和非稳态目标。PyTorch中使用`torch.optim.Adam`轻松配置优化器。
107 0
GBDT_LR
CTR中的GBDT+LR融合方案<br />数据源:<br />数据大小:770 KB<br />字段数量:20<br />使用组件:拆分,读数据表,特征编码<br />
958 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等