PyTorch翻译官网教程6-AUTOMATIC DIFFERENTIATION WITH TORCH.AUTOGRAD

深度学习之QLoRA原理详解及Pytorch实现 【代码】深度学习之QLoRA原理详解及Pytorch实现。 阅读详情

官网链接

Automatic Differentiation with torch.autograd — PyTorch Tutorials 2.0.1+cu117 documentation

使用TORCH.AUTOGRAD 自动微分

当训练神经网络时,最常用的算法是方向传播算法。在该算法中,根据损失函数与给定参数的梯度来调整模型参数(权重)。

为了计算这些梯度,PyTorch有一个内置的微分引擎,名为torch.autograd。它支持任何计算图的梯度自动计算。

考虑最简单的单层神经网络,输入x,参数w和b,以及一些损失函数。它可以在PyTorch中以以下方式定义:

import torch

x = torch.ones(5)  # input tensor
y = torch.zeros(3)  # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)

张量、函数与计算图

这段代码定义了以下计算图:

在这个网络中,w和b是我们需要优化的参数。因此,我们需要能够计算损失函数相对于这些变量的梯度。为了做到这一点,我们设置了这些张量的requires_grad属性。

注意:

您可以在创建张量时设置requires_grad的值,或者稍后使用x.requires_grad_(True)方法设置。

我们使用张量来构造计算图的函数实际上是Function类的对象,该对象知道如何在正向方向上计算函数,以及如何在反向传播步骤中计算其导数。反向传播函数的引用存储在张量的grad_fn 属性中,你可以在文档中找到Function 的更多信息。Automatic differentiation package - torch.autograd — PyTorch 2.0 documentation

print(f"Gradient function for z = {z.grad_fn}")
print(f"Gradient function for loss = {loss.grad_fn}")

输出

Gradient function for z = <AddBackward0 object at 0x114113f70>
Gradient function for loss = <BinaryCrossEntropyWithLogitsBackward0 object at 0x114113f70>


计算梯度

为了优化神经网络中参数的权重,我们需要计算损失函数对于参数的导数,即我们需要\frac{∂loss}{∂w} 和 \frac{∂loss}{∂b} 在x和y的固定值下。为了计算这些导数,我们调用loss.backward(),然后从w.grad和b.grad中检索值:

loss.backward()
print(w.grad)
print(b.grad)

输出

tensor([[0.3313, 0.0626, 0.2530],
        [0.3313, 0.0626, 0.2530],
        [0.3313, 0.0626, 0.2530],
        [0.3313, 0.0626, 0.2530],
        [0.3313, 0.0626, 0.2530]])
tensor([0.3313, 0.0626, 0.2530])

注意

  • 我们只能获得计算图的叶子节点的grad属性,当它的requires_grad属性设置为True时。对于图中的所有其他节点,梯度将不可用。
  • 出于性能原因,我们只能在给定的图上使用一次backward梯度计算。如果需要对同一个图进行多次backward调用,则需要将retain_graph=True 传递给backward调用。

禁用梯度跟踪

默认情况下,所有的requires_grad=True 的张量会自动跟踪它们的计算历史并支持梯度计算。然而,在一些情况下我们不需要这样做,例如,当我们完成了模型的训练,只想将其应用于一些测试数据时,即我们只想通过网络进行前向计算。我们可以通过使用torch.no_grad() 块包围我们的计算代码来停止跟踪计算:

z = torch.matmul(x, w)+b
print(z.requires_grad)

with torch.no_grad():
    z = torch.matmul(x, w)+b
print(z.requires_grad)

输出

True
False

实现相同结果的另一种方法是在张量上使用detach() 方法:

z = torch.matmul(x, w)+b
z_det = z.detach()
print(z_det.requires_grad)

输出

False

你可能想要禁用梯度跟踪的原因如下:

  • 将神经网络中的一些参数标记为冻结参数。
  • 当你只做正向传递时,为了加快计算速度,在不跟踪梯度的张量上的计算会更有效率。

更多关于计算图的知识

从概念上讲,autograd在由Function 的大小应该等于原始张量的大小,为了计算其乘积。

inp = torch.eye(4, 5, requires_grad=True)
out = (inp+1).pow(2).t()
out.backward(torch.ones_like(out), retain_graph=True)
print(f"First call\n{inp.grad}")
out.backward(torch.ones_like(out), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")
inp.grad.zero_()
out.backward(torch.ones_like(out), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")
 

输出

First call
tensor([[4., 2., 2., 2., 2.],
        [2., 4., 2., 2., 2.],
        [2., 2., 4., 2., 2.],
        [2., 2., 2., 4., 2.]])

Second call
tensor([[8., 4., 4., 4., 4.],
        [4., 8., 4., 4., 4.],
        [4., 4., 8., 4., 4.],
        [4., 4., 4., 8., 4.]])

Call after zeroing gradients
tensor([[4., 2., 2., 2., 2.],
        [2., 4., 2., 2., 2.],
        [2., 2., 4., 2., 2.],
        [2., 2., 2., 4., 2.]])

注意,当我们使用相同的参数第二次调用backward时,梯度的值是不同的。这是因为在进行backward传播时,PyTorch会累积梯度的,即计算梯度的值被添加到计算图的所有叶节点的grad属性中。如果你想计算合适的梯度,你需要在此之前将grad属性归零。在现实训练中,优化器可以帮助我们做到这一点。

注意

以前我们调用没有参数的backward()函数。这基本上相当于调用backward(torch.tensor(1.0)),这是在标量值函数的情况下计算梯度的有用方法,例如神经网络训练期间的损失。

 

PyTorch、CPU、GPU 与 CUDA 深度解析:一次张量加法背后的四层世界 本文厘清PyTorch、CPU、GPU与CUDA的层级关系:PyTorch是编程接口,CPU负责控制与调度,CUDA是让CPU指挥GPU的并行编程平台,GPU则是实际执行计算的加速器。四者非并列,而是分层协作。以x + y为例,从Python前端到算子分发、CUDA运行时,最终在GPU硬件上执行。关键认知包括:GPU并非万能加速器,小任务因开销大反而更慢;.to('cuda')仅搬运数据,不改变代码逻辑;算子性能受算术强度与内存带宽制约。理解此链路是优化深度学习性能的前提。 阅读详情

相关推荐

28377D Bootloader

架构

a6100309120的博客 6015

Pytorch之AUTOMATIC DIFFERENTIATION WITH TORCH.AUTOGRAD

TORCH.AUTOGRAD:自动微分 当训练神经网络时,最常用的算法就是反向传播。根据损失函数来调整给定的参数。 为了计算这些梯度,PyTorch有一个内嵌的微分引擎称为 torch.autograd。它支自动地为任意的计算图计算梯度。 考虑到最简单的单层神经网络,input x,参数w和b,和损失函数。如下定义 import torch x = torch.ones(5) # input tensor y = torch.zeros(3) # expected output w = torch.r

weixin_44636142的博客 589

LQR控制算法调参指南:如何通过Bryson‘s Rule和Trial-and-Error优化自动驾驶性能?

本文深入探讨了LQR控制算法在自动驾驶系统中的调参策略,从Bryson's Rule的基础应用到工程落地的优化方法。通过动态权重适应、非对角项引入和多目标权衡等技巧,提升车辆轨迹跟踪精度与操控舒适性。文章还介绍了数据驱动的调参流程和典型问题的解决方案,为自动驾驶工程师提供实用指南。

kkk56的博客 1026

Automatic differentiation package - torch.autograd

torch.autograd提供实现任意标量值函数的自动微分的类和函数。它只需要对现有代码进行最小的更改—您只需要声明张量s,对于该张量,应该使用requires_grad=True关键字计算梯度。 torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph=False, grad_va......

weixin_36670529的博客 767

优刻得首个「国产千卡智算集群」落地,支持智源千亿大模型训练

在人工智能引领的时代浪潮中,算力已成为技术进步与创新的核心驱动力。面对当下AI算力需求的飙升、高端AI芯片供应受限的挑战,加之OpenAI带来的技术封锁,唯有坚定不移的发展自主可控的国产技术方案,持续壮大国产智算集群规模,才能一路突破围追堵截,进一步促进国产大模型产业生态繁荣。集群还提供了完善高效的软件栈工具,集成多种主流的深度学习编程框架,通过测试验证,确保了对行业领先人工智能模型的高效支持,做到开箱即用,用户可快速投入模型的开发和部署,加速了其在人工智能领域的布局和发展。方面取得了显著成效。

Ucloud_TShare的博客 1474

SAP FICO应付票据平台开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP FICO应付票据平台开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

我好像病了的博客 379

【Pytorch】Pytorch文档学习5:AUTOMATIC DIFFERENTIATION WITH TORCH.AUTOGRAD

当训练神经网络的时候,最常用的算法就是反向传播。在该算法中,参数(模型的权重)是根据loss function对于给定的参数的梯度进行调整的。为了计算这些梯度,Pytorch内置了微分引擎,被叫做torch.autograd。其支持对于任意计算图的自动计算。

落花水面 271

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 226

PyTorch - Autograd: Automatic Differentiation(自动微分)

PyTorch - Autograd: Automatic Differentiation(自动微分) flyfish 参考网址 import torch import numpy as np from torch.autograd import Variable a = torch.randn(2, 2) print(a) a = ((a * 3) / (a - 1)) print(a) pri...

二分掌柜的 1079

数据行小于列索引,内部模式表示可能存在问题

通过检查数据源的完整性和一致性,检查Debezium配置,检查列映射以及启用调试模式和日志记录,您应该能够解决这个错误。请注意,具体的解决方法可能因您的具体情况而异,因此您可能需要根据问题的根本原因进行适当的调整和修复。如果问题仍然存在,您可能需要进一步检查您的数据和配置,并根据具体情况进行调整和修复。在Debezium中,您可以使用列重命名和列映射来定义源和目标之间的列映射关系。通过检查日志,您可以查看详细的错误信息和堆栈跟踪,从而更好地理解问题的根本原因。首先,我们应该检查数据源的完整性和一致性。

XbtoMemory的博客 731

智慧加油站小程序数据库设计文档

【代码】智慧加油站小程序数据库设计文档。

低代码布道师的博客 1405

[pytorch学习笔记] 6. TORCH.AUTOGRAD 进行自动微分

目录 张量、函数和计算图 计算梯度 禁用梯度跟踪 参考 在训练神经网络时,最常用的算法是反向传播。 在该算法中,参数(模型权重)根据损失函数相对于给定参数的梯度进行调整。 为了计算这些梯度,PyTorch 有一个名为 torch.autograd 的内置微分引擎。 它支持任何计算图的梯度自动计算。 考虑最简单的一层神经网络,输入 x、参数 w 和 b,以及一些损失函数。 它可以通过以下方式在 PyTorch 中定义: import torch x = torch.ones(5) # i

是安澜啊 435

Apollo Planning决策规划算法代码详细解析 (1):Scenario选择

本文重点讲解Apollo代码中怎样配置Scenario以及选择当前Scenario,Scenario决策是Apollo规划算法的第一步,本文会对代码进行详细解析,也会梳理整个决策流程,码字不易,喜欢的朋友们麻烦点个关注与赞。 在本文你将学到下面这些内容: 规划器planer的种类; 规划器planer的主要函数及逻辑; 场景管理类ScenarioManager的运行机制; 场景注册方法; 场景决策流程,如何选择当前场景 详细的apollo决策规划代码分析 代码具体过程如下: 1、Scenar

自动驾驶Player的博客 1万+

PINN入门:PyTorch还是TensorFlow?物理信息神经网络框架选型指南

自动微分是深度学习框架的核心能力之一,它让神经网络可以高效计算梯度,从而支持复杂的科学计算任务。在物理信息神经网络(PINN)中,自动微分不仅要计算网络参数梯度,还需对输入坐标求高阶导数,以嵌入偏微分方程残差。这种特殊需求使得框架选择成为PINN入门的关键问题。PyTorch通过create_graph参数实现高阶自动微分,而TensorFlow则依赖嵌套GradientTape,两者在API设计、调试体验和社区生态上差异显著。理解这些底层原理,有助于开发者在科研复现、工程部署或教学实验中做出更合理的决策。

weixin_33901641的博客 502

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Scikit-Learn 1.8引入Array,支持 PyTorch 与 CuPy 张量的原生 GPU 加速

Scikit-Learn 1.8.0 更新引入了实验性的 Array API 支持。这意味着 CuPy 数组或 PyTorch 张量现在可以直接在 Scikit-

2601_96798737的博客 207

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Google 与 Meta 联合推出 TorchTPU,PyTorch 原生支持 TPU 硬件

Google 和 Meta 合作开源 TorchTPU 项目,让 PyTorch 工作负载可以原生运行在 TPU 上。

wfly blog 74

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

姿态估计(Pose Estimation)深度解析:从人体关键点检测到主流算法与 PyTorch 实战

姿态估计(Pose Estimation)是计算机视觉领域的一项重要技术,主要任务是从图像或视频中识别人体、动物或物体的关键点,并根据关键点之间的空间关系推断目标的姿态结构。简单来说,姿态估计就是让计算机理解一个人的身体姿势。例如,当我们输入一张包含人体的图片时,姿态估计算法可以自动识别:头部、鼻子、眼睛等面部关键点。左右肩膀、肘部和手腕。左右髋部、膝盖和脚踝。身体各个关节之间的连接关系。最终,模型会将这些关键点连接起来,形成一张人体骨架图。

2503_90237586的博客 344

机器学习教程,从入门到精通,深度学习入门语法知识点完全指南(PyTorch 版)(12)

本文为零基础读者量身定制的PyTorch深度学习入门指南,系统讲解深度学习核心原理与实战语法。从神经元、激活函数、损失函数等基础概念入手,结合Sigmoid、ReLU、MSE、CrossEntropy等关键知识点,辅以可运行的PyTorch代码示例,逐行注释详解。涵盖线性回归、CNN、GAN、ResNet等八大典型应用,揭示其在推荐系统、自动驾驶、医疗影像等企业场景中的实际价值,帮助读者快速掌握“原理—框架—应用”全链路技能。

qq_45746668的博客 381

【深度学习项目实战·33】自定义数据集:把自己的图片接入PyTorch

本文聚焦自定义数据集的构建与验证,解决“图片如何对应标签”的核心问题。通过构建包含路径、标签、ID与分组信息的标注表,实现样本可追溯;设计ManifestDataset类,统一图像读取、变换与张量输出格式;强调数据检查、固定类别映射与数据契约的重要性,确保训练前数据闭环可靠。后续将进入数据增强与划分环节。

银尘博客 195

第22章 实现一个完整的 RAG 系统(PyTorch) (终章)

本章构建了一个完整的本地RAG系统,集成BGE嵌入、Chroma向量库、BM25与RRF混合检索、BGE重排序器及Qwen2.5-7B-Instruct生成模型。通过结构化分块、增量索引、带引用的Prompt设计与拒答机制,实现精准问答。基于Recall@K与MRR量化评估各组件贡献,实测在RTX 4090上完成端到端推理,兼顾性能与可解释性,具备生产可用性。

AI服务生活 379

【AI 开发从入门到进阶 · 04】PyTorch 第一课:Tensor、自动求导与那套万能的「五步训练循环」

本文系统介绍PyTorch入门核心内容:为何选择PyTorch(动态图、生态优势)、Tensor的自动求导机制、构建神经网络的四大组件(nn.Module、Loss、Optimizer、DataLoader),并通过MNIST手写数字识别实战演示“五步训练循环”——前向传播、计算损失、反向传播、清零梯度、参数更新。强调zero_grad()、no_grad()、CrossEntropyLoss不加Softmax等关键细节,附可视化分析与排错清单。下篇将深入CNN卷积网络,提升图像分类性能。

信息安全领域优质创作者|操作系统领域专家 160

PyTorch强化学习实战(35)——多智能体强化学习

在本节中,我们将介绍多智能体强化学习 (MARL),这是强化学习 (Reinforcement Learning, RL) 和深度强化学习的一个相对较新的方向,涉及多个智能体在环境中进行交互的情况。在现实生活中,这类问题出现在宽带通信网络、物联网等场景中。在本节中,我们将简要介绍 MARL,并在简单环境中进行一些实验。在实验中,我们将采用一种简单的方法,让智能体共享我们正在优化的策略,但观察将从每个智能体的视角出发,并包含其他智能体位置的信息。

盼小辉丶的博客 222

基于深度学习的塑料类型图像分类研究(Python+PyTorch+Django完整实现)

本课题围绕塑料回收分拣场景,完成基于深度学习的塑料类型图像分类研究。项目使用公开塑料识别数据集,覆盖六类常见塑料,先以ResNet18预训练特征做错标检测,自动隔离可疑样本并复测清洗效果,再按类别分层划分数据集;模型选用ResNet50进行迁移学习,训练中引入标签平滑与EMA应对标签噪声,以宏平均F1,各类别召回和混淆矩阵作为主要评估指标;训练完成的模型导出为ONNX格式,由Django后端加载推理,Vue前端实现图片上传与结果展示,形成从数据,训练到应用的完整闭环,可作为深度学习方向毕业设计的实现参考。

WEIXIN_JSJBSZDS的博客 118

深入理解 PyTorch FlexAttention:从 Score Mod 到 Mask Mod 的稀疏加速之道

score_mod:对分数做数值变换# 这里演示一个简单的"按 query 位置缩放"的变换# score: 当前 (b, h, q_idx, kv_idx) 位置的分数标量# 返回变换后的分数return score * 1.0 # 恒等变换,实际可替换为任意数值操作# mask_mod:返回布尔值,True 表示该位置参与计算score_mod和mask_mod的签名都是,区别在于score_mod额外接收当前分数score并返回新分数,而mask_mod只返回布尔值。

Maxwell_Newton的博客 506

PyTorch中Tensor是什么? 与NumPy数组有什么区别?

简单来说,Tensor 是 PyTorch 中最核心的数据结构,是一个支持 GPU 加速和自动微分的多维数组。在 PyTorch 中,Tensor 可以理解为任意维度的数组容器 —— 0 维是标量,1 维是向量,2 维是矩阵,3 维及以上就是高维张量。这是训练神经网络的关键。特别地,CPU 上的 Tensor 与 NumPy 数组共享内存,一个变化会影响另一个,非常高效。掌握 Tensor 是 PyTorch 入门的第一步,理解它和 NumPy 的关系与区别,能帮你更快地上手深度学习。

teach2004的博客 176

Pytorch【8】模型保存与加载(断点续训、GPU/CPU兼容踩坑)

前面我们已经掌握:张量、自动求导、网络搭建、损失优化、Dataset+DataLoader数据流水线。模型训练好之后,我们需要把成果存下来;训练中途中断,也需要从上次位置继续训练。只保存权重✅【工业界推荐,体积小、灵活】直接保存整个模型❌【简单但不推荐,兼容性差】state_dict是一个字典,key是参数名,value是权重张量,只存参数,不存代码结构。

Beforthing的博客 212
上一篇: PyTorch翻译官网教程5-BUILD THE NEURAL NETWORK
下一篇: PyTorch翻译官网教程7-OPTIMIZING MODEL PARAMETERS
poorCoder_
博客等级 码龄10年 129粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值