关于loss.backward()optimizer.step()optimizer.zero_grad()的顺序

本文解析了使用PyTorch进行模型训练的核心步骤:梯度归零(optimizer.zero_grad())、反向传播(loss.backward())及参数更新(optimizer.step())。强调了这三步操作的正确顺序及其在训练过程中的作用。
部署运行你感兴趣的模型镜像
    loss.backward()  #反向传播
    optimizer.step()  #更新参数
    optimizer.zero_grad() # 梯度归零

这三个函数的作用是
梯度归零(optimizer.zero_grad())
,然后反向传播计算得到每个参数的梯度值(loss.backward()),
最后通过梯度下降执行一步参数更新(optimizer.step())

关于这三个的顺序上

optimizer.zero_grad() # 梯度归零只能写在最开始或者最后面
loss.backward()要写在optimizer.step()之前。

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### `optimizer.zero_grad()` - **作用**:将优化器中所有参数的梯度清零。在 PyTorch 中,梯度是累加的,如果不手动清零,每次调用 `backward()` 时,新计算的梯度会累加到之前的梯度上,这会导致梯度计算错误。 - **原理**:优化器维护了一个参数列表及其对应的梯度,`optimizer.zero_grad()` 会遍历这些参数,将它们的梯度张量(`grad` 属性)置为零。 - **使用场景**:在每次进行反向传播之前调用,确保每次迭代计算的梯度是独立的,适用于所有基于梯度的优化算法,如随机梯度下降(SGD)、Adam 等。 示例代码: ```python import torch import torch.optim as optim from torch.nn import Parameter model = [Parameter(torch.randn(2, 2, requires_grad=True))] optimizer = optim.SGD(model, 0.1) # 在每次迭代开始前清零梯度 optimizer.zero_grad() ``` ### `cur_loss.backward()` - **作用**:执行反向传播算法,计算损失函数关于模型参数的梯度。通过链式法则,从损失函数开始,逐步计算每个参数的梯度。 - **原理**:基于自动求导机制,PyTorch 会构建一个计算图,记录所有的计算操作。当调用 `backward()` 时,它会沿着计算图反向传播,根据链式法则计算每个参数的梯度,并将梯度存储在参数的 `grad` 属性中。 - **使用场景**:在计算出损失函数之后调用,用于计算梯度,为后续的参数更新做准备。 示例代码: ```python import torch import torch.nn as nn # 定义一个简单的模型和输入 x = torch.randn(10, 5) y = torch.randn(10, 1) model = nn.Linear(5, 1) criterion = nn.MSELoss() # 前向传播 output = model(x) cur_loss = criterion(output, y) # 反向传播 cur_loss.backward() ``` ### `optimizer.step()` - **作用**:根据计算得到的梯度,使用优化算法更新模型的参数。不同的优化器有不同的更新策略,如 SGD 会根据梯度和学习率直接更新参数,Adam 会结合梯度的一阶矩和二阶矩进行更新。 - **原理**:优化器根据其内部的更新规则,利用存储在参数 `grad` 属性中的梯度,对参数进行更新。例如,SGD 的更新公式为:$ \theta_{t+1} = \theta_{t} - \alpha \cdot \nabla L(\theta_{t}) $,其中 $\theta$ 是参数,$\alpha$ 是学习率,$\nabla L(\theta_{t})$ 是梯度。 - **使用场景**:在调用 `backward()` 计算出梯度之后调用,用于更新模型参数,推动模型的训练过程。 示例代码: ```python import torch import torch.optim as optim from torch.nn import Parameter model = [Parameter(torch.randn(2, 2, requires_grad=True))] optimizer = optim.SGD(model, 0.1) # 假设已经计算出损失并进行了反向传播 # 这里省略了前向传播和反向传播的代码 # 更新参数 optimizer.step() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值