10、PyTorch autograd使用教程

文章目录

  • 1. 相关思考
  • 2. 矩阵求导
  • 3. 两种方法求jacobian

1. 相关思考

在这里插入图片描述

2. 矩阵求导

假设我们有如下向量:
y 1 × 3 = x 1 × 5 [ w T ] 5 × 3 + b 1 × 3 \begin{equation} y_{1\times3}=x_{1\times5}[w^T]_{5\times3}+b_{1\times3} \end{equation} y1×3=x1×5[wT]5×3+b1×3
根据公式,我们知道偏导如下:
∂ y ∂ w = x , ∂ y ∂ b = 1 \begin{equation} \frac{\partial{y}}{\partial w}=x,\frac{\partial{y}}{\partial b}=1 \end{equation} wy=x,by=1
但通过公式我们知道,y为向量,在pytorch中一般都是标量后再进行反向传播,故我们需要引入求和公式
z = y T m , m = [ 1 1 1 ] \begin{equation} z=y^Tm,m=\begin{bmatrix}1\\\\1\\\\1\end{bmatrix} \end{equation} z=yTm,m= 111

  • 那么z就是可以当作标量,可以用z做反向传播
    ∂ z ∂ y = m \begin{equation} \frac{\partial{z}}{\partial y}=m \end{equation} yz=m
  • 由链式法则可得如下:
    ∂ z ∂ w = ∂ z ∂ y ⋅ ∂ y ∂ w = m ⋅ x \begin{equation} \frac{\partial{z}}{\partial w}=\frac{\partial{z}}{\partial y}\cdot\frac{\partial{y}}{\partial w}=m\cdot x \end{equation} wz=yzwy=mx
  • 我们定义x=[0,1,2,3,4],那么梯度可得:
    ∂ z ∂ w = [ 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 ] \begin{equation} \frac{\partial{z}}{\partial w}= \begin{bmatrix} 0&1&2&3&4\\\\ 0&1&2&3&4\\\\ 0&1&2&3&4 \end{bmatrix} \end{equation} wz= 000111222333444
  • 同理:可得关于b的导数如下:
    ∂ z ∂ b = ∂ z ∂ y ⋅ ∂ y ∂ b = m = [ 1 1 1 ] \begin{equation} \frac{\partial{z}}{\partial b}=\frac{\partial{z}}{\partial y}\cdot\frac{\partial{y}}{\partial b}=m=\begin{bmatrix} 1\\\\ 1\\\\ 1 \end{bmatrix} \end{equation} bz=yzby=m= 111
  • 小结:如果要计算向量y对向量w进行求导,但pytorch的反向传播用的是标量,一般做法是引入全1向量求和,这样就将向量y对向量w的求导转换成z对w的求导,最后运用链式法则即可求出。
  • python 代码
import torch
from torch import nnif __name__ == "__main__":run_code = 0in_x = torch.arange(5,dtype=torch.float)in_w = torch.randn((3, 5), requires_grad=True)in_b = torch.arange(3, dtype=torch.float, requires_grad=True)y = in_x @ in_w.T + in_bz = torch.sum(y)print(f"*"*50)print(f"before:")print(f"x={in_x}")print(f"w=\n{in_w}")print(f"w_grad=\n{in_w.grad}")print(f"b=\n{in_b}")print(f"b_grad=\n{in_b.grad}")print(f"y={y}")print(f"before:")print(f"*"*50)z.backward()print(f"*"*50)print(f"after:")print(f"x={in_x}")print(f"w=\n{in_w}")print(f"w_grad=\n{in_w.grad}")print(f"b=\n{in_b}")print(f"b_grad=\n{in_b.grad}")print(f"b_grad=\n{in_b.grad.shape}")print(f"y={y}")print(f"after:")print(f"*"*50)
  • 结果:
**************************************************
before:
x=tensor([0., 1., 2., 3., 4.])
w=
tensor([[-1.5762, -0.0040,  1.7958,  0.2164,  0.7108],[ 0.6488, -0.8668,  0.0572, -1.1207,  0.0568],[-0.5594,  0.1091,  0.6546,  0.0851,  1.1287]], requires_grad=True)
w_grad=
None
b=
tensor([0., 1., 2.], requires_grad=True)
b_grad=
None
y=tensor([ 7.0800, -2.8872,  8.1886], grad_fn=<AddBackward0>)
before:
**************************************************
**************************************************
after:
x=tensor([0., 1., 2., 3., 4.])
w=
tensor([[-1.5762, -0.0040,  1.7958,  0.2164,  0.7108],[ 0.6488, -0.8668,  0.0572, -1.1207,  0.0568],[-0.5594,  0.1091,  0.6546,  0.0851,  1.1287]], requires_grad=True)
w_grad=
tensor([[0., 1., 2., 3., 4.],[0., 1., 2., 3., 4.],[0., 1., 2., 3., 4.]])
b=
tensor([0., 1., 2.], requires_grad=True)
b_grad=
tensor([1., 1., 1.])
b_grad=
torch.Size([3])
y=tensor([ 7.0800, -2.8872,  8.1886], grad_fn=<AddBackward0>)
after:
**************************************************

3. 两种方法求jacobian

  • 方法一:直接使用 from torch.autograd.functional import jacobian
  • 方法二:将f(x)的向量按照每个元素是标量的方式,对每个标量进行反向传播,最后将结果叠加起来。
import torch
from torch.autograd.functional import jacobian# 定义函数 f(x)
def funx(x):return torch.stack([x[0] ** 2 + 2 * x[1],3 * x[0] + 4 * x[1] ** 2])if __name__ == "__main__":# 初始化输入张量并启用梯度in_x = torch.tensor([1.0, 2.0], dtype=torch.float, requires_grad=True)# 计算函数输出y = funx(in_x)# 初始化一个零矩阵,用于保存手动计算的雅可比矩阵manual_jacobian = torch.zeros(len(y), len(in_x))# 手动计算雅可比矩阵for i in range(len(y)):# 每次 backward 计算一个分量的梯度in_x.grad = None  # 清除之前的梯度y[i].backward(retain_graph=True)manual_jacobian[i] = in_x.grad# 使用 autograd.functional.jacobian 验证雅可比auto_jacobian = jacobian(funx, in_x)print(f"Manual Jacobian:\n{manual_jacobian}")print(f"Auto Jacobian:\n{auto_jacobian}")
  • 结果:
Manual Jacobian:
tensor([[ 2.,  2.],[ 3., 16.]])
Auto Jacobian:
tensor([[ 2.,  2.],[ 3., 16.]])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/479723.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI】Sklearn

长期更新&#xff0c;建议关注、收藏、点赞。 友情链接&#xff1a; AI中的数学_线代微积分概率论最优化 Python numpy_pandas_matplotlib_spicy 建议路线&#xff1a;机器学习->深度学习->强化学习 目录 预处理模型选择分类实例&#xff1a; 二分类比赛 网格搜索实例&…

软件质量保证——软件测试流程

笔记内容及图片整理自XJTUSE “软件质量保证” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 对于软件测试中产品/服务/成果的质量&#xff0c;需要细化到每个质量特性上&#xff0c;因此出现了较为公认的软件质量模型&#xff0c;包括McCall质量模型、ISO/IEC 9126…

代码美学2:MATLAB制作渐变色

效果&#xff1a; %代码美学&#xff1a;MATLAB制作渐变色 % 创建一个10x10的矩阵来表示热力图的数据 data reshape(1:100, [10, 10]);% 创建热力图 figure; imagesc(data);% 设置颜色映射为“cool” colormap(cool);% 在热力图上添加边框 axis on; grid on;% 设置热力图的颜色…

从0开始学PHP面向对象内容之常用设计模式(组合,外观,代理)

二、结构型设计模式 4、组合模式&#xff08;Composite&#xff09; 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它将对象组合成树形结构以表示”部分–整体“的层次结构。通过组合模式&#xff0c;客户端可以以一致的方式处理单个对…

femor 第三方Emby应用全平台支持v1.0.54更新

femor v1.0.54 版本更新 mpv播放器增加切换后台和恢复时隐藏状态栏的功能修复服务器首页因为连接超时异常的问题 获取路径&#xff1a;【femor 历史版本收录】

如何搭建一个小程序:从零开始的详细指南

在当今数字化时代&#xff0c;小程序以其轻便、无需下载安装即可使用的特点&#xff0c;成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业&#xff0c;小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序&#xff0c;本文将为你提供一个从零开始的详细…

nrm镜像管理工具使用方法

nrm&#xff08;NPM Registry Manager&#xff09;是一款专门用于管理 npm 包镜像源的命令行工具。在使用 npm 安装各种包时&#xff0c;默认会从官方的 npm 仓库&#xff08;registry&#xff09;获取资源&#xff0c;但有时候由于网络环境等因素&#xff0c;访问官方源可能速…

OpenCV截取指定图片区域

import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…

易速鲜花聊天客服机器人的开发(下)

目录 “聊天机器人”项目说明 方案 1 &#xff1a;通过 Streamlit 部署聊天机器人 方案2 &#xff1a;通过 Gradio 部署聊天机器人 总结 上一节&#xff0c;咱们的聊天机器人已经基本完成&#xff0c;这节课&#xff0c;我们要看一看如何把它部署到网络上。 “聊天机器人”…

STM32笔记(串口IAP升级)

一、IAP简介 IAP&#xff08;In Application Programming&#xff09;即在应用编程&#xff0c; IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写&#xff0c;目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。 通常实…

斐波那契堆与二叉堆在Prim算法中的性能比较:稀疏图与稠密图的分析

斐波那契堆与二叉堆在Prim算法中的性能比较:稀疏图与稠密图的分析 引言基本概念回顾Prim算法的时间复杂度分析稀疏图中的性能比较稠密图中的性能比较|E| 和 |V| 的关系伪代码与C代码示例结论引言 在图论中,Prim算法是一种用于求解最小生成树(MST)的贪心算法。其性能高度依…

使用argo workflow 实现springboot 项目的CI、CD

文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubern…

BUUCTF—Reverse—不一样的flag(7)

是不是做习惯了常规的逆向题目&#xff1f;试试这道题&#xff0c;看你在能不能在程序中找到真正的flag&#xff01;注意&#xff1a;flag并非是flag{XXX}形式&#xff0c;就是一个’字符串‘&#xff0c;考验眼力的时候到了&#xff01; 注意&#xff1a;得到的 flag 请包上 f…

insmod一个ko提供基础函数供后insmod的ko使用的方法

一、背景 在内核模块开发时&#xff0c;多个不同的内核模块&#xff0c;有时候可能需要都共用一些公共的函数&#xff0c;比如申请一些平台性的公共资源。但是&#xff0c;这些公共的函数又不方便去加入到内核镜像里&#xff0c;这时候就需要把这些各个内核模块需要用到的一些…

LangGraph中的State管理

本教程将介绍如何使用LangGraph库构建和测试状态图。我们将通过一系列示例代码&#xff0c;逐步解释程序的运行逻辑。 1. 基本状态图构建 首先&#xff0c;我们定义一个状态图的基本结构和节点。 定义状态类 from langgraph.graph import StateGraph, START, END from typi…

MATLAB中Simulink的基础知识

Simulink是MATLAB中的一种可视化仿真工具&#xff0c; 是一种基于MATLAB的框图设计环境&#xff0c;是实现动态系统建模、仿真和分析的一个软件包&#xff0c;被广泛应用于线性系统、非线性系统、数字控制及数字信号处理的建模和仿真中。 Simulink提供一个动态系统建模、仿真和…

最小生成树-Prim与Kruskal算法

文章目录 什么是最小生成树&#xff1f;Prim算法求最小生成树Python实现&#xff1a; Kruskal算法求最小生成树并查集 Python实现&#xff1a; Reference 什么是最小生成树&#xff1f; 在图论中&#xff0c;树是图的一种&#xff0c;无法构成闭合回路的节点-边连接组合称之为…

关闭AWS账号后,服务是否仍会继续运行?

在使用亚马逊网络服务&#xff08;AWS&#xff09;时&#xff0c;用户有时可能会考虑关闭自己的AWS账户。这可能是因为项目结束、费用过高&#xff0c;或是转向使用其他云服务平台。然而&#xff0c;许多人对关闭账户后的服务状态感到困惑&#xff0c;我们九河云和大家一起探讨…

Could not locate device support files.

报错信息&#xff1a;Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题&#xff1a;xcode15升级到xcode16之后&#xff0c;13.…

Linux文件基础

目录 一、文件类型 二、文件权限 三、权限修改 Linux中一切皆文件&#xff0c;文件目录分布呈树状数据结构&#xff0c;/是根目录&#xff0c;目录的源头 一、文件类型 类型字符说明普通-Linux中最多的一种文件类型&#xff0c;包括 纯文本文件(ASCII)、二进制文件(binary…