梯度相关运算

梯度

grad

梯度可以通过访问参数对象的 .grad 属性来获取

import torch

# 定义模型
model = torch.nn.Linear(10, 1)

# 定义输入数据
inputs = torch.randn(100, 10)

# 定义目标值
targets = torch.randn(100, 1)

# 前向传播
outputs = model(inputs)

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

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

# 执行反向传播
loss.backward()

# 获取参数的梯度
gradients = model.weight.grad

在机器学习和深度学习中,梯度通常用于表示损失函数相对于模型参数的导数,以指导参数更新。

动手学深度学习之如何理解param.grad / batch_size(详细讲解)

计算梯度

1.定义模型:首先,您需要定义一个模型,并确定它的参数需要计算梯度。这通常包括使用深度学习库(如PyTorch)提供的模型类构建模型对象。
2.定义损失函数:接下来,您需要定义一个用于衡量模型预测与目标之间差异的损失函数。这可以根据您的问题类型选择适当的损失函数,例如均方误差损失函数 (torch.nn.MSELoss)、交叉熵损失函数 (torch.nn.CrossEntropyLoss) 等。
3.定义输入和目标:准备输入数据和相应的目标值(标签),这将用于计算损失和梯度。确保将输入数据和目标值转换为深度学习库(如PyTorch)所支持的张量类型。
4.前向传播:使用模型和输入数据执行前向传播,以获取模型的预测输出。
5.计算损失:将模型的预测输出与目标值进行比较,并使用定义的损失函数计算损失。
6.反向传播:调用 loss.backward() 方法来计算损失相对于模型参数的梯度。这将在计算图中触发反向传播,并通过链式法则计算参数的梯度。
7.获取梯度:通过访问参数对象的 .grad 属性来获取参数的梯度值。这些梯度值将存储在参数张量的 .grad 属性中。

requires_grad

w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)

当将requires_grad设置为True时,PyTorch会跟踪相关张量的操作以进行梯度计算。

backward()

只有在调用 backward() 方法后,参数的梯度才会被计算并存储在 .grad 属性中。如果没有调用 backward().grad 中将返回 None

param.grad.zero_()

如果多次调用了反向传播 (backward()) 函数,梯度会被累积而不是被清零。这意味着每次调用 backward(),梯度都被累加到之前的梯度上。

梯度累积通常用于某些训练策略,例如分批训练或梯度累积优化。在这些情况下,模型在处理完一个批次的数据后,不会立即更新模型的参数,而是将梯度累积起来。在处理完指定数量的批次后,梯度累积的总和被用于更新模型的参数。

要避免梯度累积,您可以在每个批次之前使用 optimizer.zero_grad() 函数来手动清零梯度。这会将优化器对象中所有参数的梯度设置为零,以防止梯度相互累积。

optimizer.step()

optimizer.step() 是 PyTorch 中用于更新模型参数的函数。在执行了反向传播计算梯度之后,通过调用 optimizer.step() 来更新模型的参数。

这个函数的作用是根据优化器的规则来更新参数,例如使用随机梯度下降 (SGD)、Adam、Adagrad 等优化算法。它会根据计算得到的梯度和设定的优化规则对模型的参数进行更新,以最小化损失函数。

损失函数

损失函数(Loss Function)是机器学习和深度学习模型中的一个重要组成部分。它衡量了模型预测值与真实标签之间的差异或误差。通过最小化损失函数,可以使模型的预测结果接近真实值,从而实现模型的优化和训练。

常见的损失函数包括以下几种:

  1. 均方误差(Mean Squared Error,MSE):均方误差是回归问题中最常用的损失函数之一。它计算预测值与真实值之间的平方差的平均值。

  2. 交叉熵损失(Cross-Entropy Loss):交叉熵损失常用于分类问题中,特别是多类别分类。它基于预测类别的概率分布与真实标签的概率分布之间的差异来衡量模型的误差。

  3. 二分类交叉熵损失(Binary Cross-Entropy Loss):二分类交叉熵损失是交叉熵损失的一种特例,用于二分类问题,其中只有两个类别。

  4. 负对数似然损失(Negative Log-Likelihood Loss,NLLLoss):负对数似然损失在分类问题中常用于衡量模型的误差。它根据预测值的对数概率和真实标签计算损失。

  5. KL 散度损失(Kullback-Leibler Divergence Loss):KL 散度损失属于信息论中的概念,用于衡量两个概率分布之间的差异。

with torch.no_grad():

  1. torch.no_grad():这是一个上下文管理器,用于暂时关闭梯度计算。在该上下文中,所有的操作都不会被记录梯度,这对于参数更新步骤很有用,因为我们不希望计算梯度并更新参数时再次累积梯度。

  2. 当禁用梯度计算时,可以使用torch.no_grad()上下文管理器或将张量的requires_grad属性设置为False。这两种方法都可以避免计算和存储梯度信息。

    requires_grad设置为True时,即使不计算梯度,禁用梯度计算仍然可以提高计算和内存效率,特别是在不需要梯度信息的情况下。

    当将requires_grad设置为True时,PyTorch会跟踪相关张量的操作以进行梯度计算。即使不显式地调用backward()函数计算梯度,PyTorch仍会记录和存储梯度信息,以备后续使用。

    如果您只关注模型的前向传播并不需要梯度信息,这种情况下禁用梯度计算可以提高计算效率和内存效率,即使requires_grad设置为True

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值