[Pytorch]导数与求导

文章目录

  • 导数与求导
    • 一. 标量 向量 矩阵 的导数
    • 二.Pytorch中的反向求导.backward()
    • 三.非标量求导

导数与求导

一. 标量 向量 矩阵 的导数

标量,向量,矩阵间求导后的形状:

y\x标量x(1)向量 x(n,1)矩阵 X(n,k)
标量y(1)(1)(1,n)(k,n)
向量 y(m,1)(m,1)(m,n)(m,k,n)
矩阵Y(m,l)(m,l)(m,l,n)(m,l,k,n)

x 和 w 是向量的情况下: ∂ < x , w > ∂ w = x T x和w是向量的情况下:\frac{∂<\bm x ,\bm w>}{∂\bm w} = \bm x^{T} xw是向量的情况下:w<x,w>=xT
x 是矩阵 w 是向量的情况下: ∂ X w ∂ w = X x是矩阵w是向量的情况下:\frac{∂\bm {X w}}{∂\bm w} = \bm X x是矩阵w是向量的情况下:wXw=X

特殊的, s u m 表示求向量元素和时: 特殊的,sum表示求向量元素和时: 特殊的,sum表示求向量元素和时:

x 是向量的情况下: ∂ x . s u m ∂ x = 1 其中 1 是和 x 同形状的全 1 向量 x是向量的情况下:\frac{∂\bm x.sum}{∂x} = \bm1\space\space其中\bm1是和x同形状的全1向量 x是向量的情况下:xx.sum=1  其中1是和x同形状的全1向量

二.Pytorch中的反向求导.backward()

Pytorch中的反向求导用.backward()方法进行实现

y.backward()
x = torch.arange(4.0)
x.requires_grad_(True)
y = torch.tensor([3.0, 1.0, 2.0, 5.0], requires_grad=True)
z = 2 * torch.dot(x, y)
print(x, '\n', y, '\n', z)
print("反向传播:")
z.backward()
print(f"z对x的偏导数:{x.grad}")
print(f"z对y的偏导数:{y.grad}")
y.grad.zero_()
z = y.sum()
z.backward()
print(f"y.sum对y的导数:{y.grad}")

在这里插入图片描述

三.非标量求导

对于向量求导的情况:
在这里插入图片描述
向量y对于向量x的导数是一个雅各比矩阵,在深度学习中通常得到的是一个方阵

假设X = [x1, x2, x3, x4] ; Y = [y1, y2, y3, y4],其中 y i = x i 2 {y_i}={x_i}^2 yi=xi2,则Y对于X的导数可表达为雅各比行列式:

在这里插入图片描述
然而pytorch中backward()方法的输出需要是一个与原张量同维度的张量,所以当遇到向量求导时,必须在backward中额外传入一个参数gradient,gradient是一个与Y同shape的张量,用于左乘雅各比行列式来获得最终与Y同shape形式的导数:

在这里插入图片描述

除了使用传参形式的backward()方法外,还可以使用.sum()方法:

y.sum().backward() #效果等同于y.backward(torch.ones_like(y)
x = torch.tensor([1, 2, 3, 4], requires_grad=True, dtype=float)
y = torch.tensor([3, 4, 5, 6], requires_grad=True, dtype=float)
z = x * y
z.sum().backward()
print(x.grad)

在这里插入图片描述

关于使用.sum()方法求导的数学解释:
在这里插入图片描述

几种向量求导的代码示例如下:

import torch# 定义向量x和y,同时运算结果z也是向量
x = torch.tensor([1, 2, 3, 4], requires_grad=True, dtype=float)
y = torch.tensor([3, 4, 5, 6], requires_grad=True, dtype=float)
z = x * y
print('z:', z)# 1.对向量z进行反向求导,传入参数为和z同shape的ones向量
z.backward(torch.ones_like(z), retain_graph=True)
print(x.grad)# 2.将参数改为和z同shape的向量[2,3,4,5]后再次反向求导
x.grad.zero_()
z.backward(torch.tensor([2, 3, 4, 5]).reshape(z.shape), retain_graph=True)
print(x.grad)# 3.使用.sum()函数处理向量求导,效果等同于 1:z.backward(torch.ones_like(z)
x.grad.zero_()
z.sum().backward()
print(x.grad)

运行结果:
在这里插入图片描述

  • 使用.sum方法辅助求导后的结果为[3, 4, 5, 6]等效于给所求雅各比行列式左乘了行向量[1, 1, 1, 1]后结果为:[3, 4, 5, 6]
  • 将backward()方法中的参数改为[2, 3, 4, 5]后,相当于给原雅各比行列式左乘了行向量[2, 3, 4, 5],应该是在原来结果[3, 4, 5, 6]的基础上每行分别乘2,3,4,5,最终结果为[6, 12, 20, 30]
    在这里插入图片描述

参考博文:
https://blog.csdn.net/qq_52209929/article/details/123742145
https://zhuanlan.zhihu.com/p/216372680

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

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

相关文章

记录 Linux centos 安装tomact遇到的问题

如果在安装时 觉得自己什么都安装好了&#xff0c;什么也设置好了&#xff0c;包括阿里云的安全组&#xff0c;但是依旧不能进行访问Tomact的主页&#xff0c;你可以查看一下 catalina.out这个文件&#xff0c;出现以下错误这表示 tomact和Java本版有冲突所以一直无法访问&…

【开源与项目实战:开源实战】84 | 开源实战四(上):剖析Spring框架中蕴含的经典设计思想或原则

在 Java 世界里&#xff0c;Spring 框架已经几乎成为项目开发的必备框架。作为如此优秀和受欢迎的开源项目&#xff0c;它是我们源码阅读的首选材料之一&#xff0c;不管是设计思想&#xff0c;还是代码实现&#xff0c;都有很多值得我们学习的地方。接下来&#xff0c;我们就详…

若依——限流(rateLimiter)(lua脚本与令牌桶)

在原版若依当中使用了lua脚本进行限流 注意这里进行了bean的托管&#xff0c;因此我们才能使用limitScript 关于lua脚本的解释 在若依的Plus版本当中&#xff0c;结合了Redisson使用令牌桶进行限流。由于Redisson已经封装好了&#xff0c;使用起来比较简单&#xff0c;更多…

【机器人3】图像雅可比矩阵原理与推导

图像雅可比矩阵原理与推导 理想情况下&#xff0c;图像像素坐标系和图像物理坐标系无倾斜&#xff0c;则二者坐标转换关系如下&#xff0c;且两边求导&#xff1a; [ u v 1 ] [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] (1) \begin{bmatrix}u\\v\\1\end{bmatrix}\begin{b…

【UE5 Cesium】07-Cesium for Unreal 从一个地点飞行到另一个地点(下)

UE版本&#xff1a;5.1 介绍 本文以在基督城&#xff08;新西兰&#xff09;和悉尼&#xff08;澳大利亚&#xff09;这两个城市间为例&#xff0c;在上一篇文章&#xff08;【UE5 Cesium】06-Cesium for Unreal 从一个地点飞行到另一个地点&#xff08;上&#xff09;&#…

C++——命名空间(namespace)

目录 1. C语言命名冲突 2. 命名空间定义 3. 命名空间使用 可能大家在看别人写的C代码中&#xff0c;在一开始会包这个头文件&#xff1a;#include<iostream> 这个头文件等价于我们在C语言学习到的#include<stdio.h>&#xff0c;它是用来跟我们的控制台输入和输出…

echarts图表-实现中国地图的绘制

第一步&#xff1a;引入中国地图的json数据&#xff0c;初始化echarts的dom结构&#xff0c;使用registerMap方法加载地图数据&#xff08;注&#xff1a;echarts5.X版本后删除了中国地图的JSON&#xff0c;需自行下载JSON或降低echarts版本&#xff09; 第二步&#xff1a;传输…

暑期学JavaScript【第三天】

事件流 很多时候&#xff0c;一个事件可能会被多个元素监听。那么这些元素应该按什么顺序响应呢&#xff1f;从父到子称为捕获&#xff0c;从子到父称为冒泡。 事件捕获 可选参数&#xff0c;true or fause&#xff0c;带true代表按捕获方式响应 obj.addEventListener(cli…

AIGC下的CV多模态原理解析:从CLIP/BLIP到stable diffusion/Midjourney、GPT4

前言 终于开写本CV多模态系列的核心主题&#xff1a;stable diffusion相关的了&#xff0c;为何执着于想写这个stable diffusion呢&#xff0c;源于三点 去年stable diffusion和midjourney很火的时候&#xff0c;就想写&#xff0c;因为经常被刷屏&#xff0c;但那会时间错不…

Transformer回归预测

一、Attention is all you need——李沐论文精读Transformer 论文地址&#xff1a; https://arxiv.org/pdf/1706.03762.pdf Transformer论文逐段精读【论文精读】 卷积神经网络对较长的序列难以建模&#xff0c;因为他每次看一个比较小的窗口&#xff0c;如果两个像素隔得比较…

设计模式-05.01-行为型-观察者模板

观察者模式【常用】 我们常把 23 种经典的设计模式分为三类&#xff1a;创建型、结构型、行为型。前面我们已经学习了创建型和结构型&#xff0c;从今天起&#xff0c;我们开始学习行为型设计模式。我们知道&#xff0c;创建型设计模式主要解决“对象的创建”问题&#xff0c;…

大一下暑期计划 + 2023字节青训营预告直播

目录 &#x1f33c;前言 &#x1f339;后端学习方法 &#x1f333;1&#xff0c;层次 &#x1f333;2&#xff0c;体系 &#x1f333;3&#xff0c;算法和数据结构 &#x1f333;4&#xff0c;总结 &#x1f339;前端学习方法 &#x1f333;基础 &#x1f339;求职中如…