社区首页 >问答首页 >了解PyTorch中的反向传播

了解PyTorch中的反向传播
EN

Stack Overflow用户
提问于 2021-09-28 12:10:22
回答 3查看 540关注 0票数 3

我正在探索PyTorch,但我不理解以下示例的输出:

代码语言:javascript
代码运行次数:0
复制
# Initialize x, y and z to values 4, -3 and 5
x = torch.tensor(4., requires_grad = True)
y = torch.tensor(-3., requires_grad = True)
z = torch.tensor(5., requires_grad = True)

# Set q to sum of x and y, set f to product of q with z
q = x + y
f = q * z

# Compute the derivatives
f.backward()

# Print the gradients
print("Gradient of x is: " + str(x.grad))
print("Gradient of y is: " + str(y.grad))
print("Gradient of z is: " + str(z.grad))

输出

代码语言:javascript
代码运行次数:0
复制
Gradient of x is: tensor(5.)
Gradient of y is: tensor(5.)
Gradient of z is: tensor(1.)

我毫不怀疑,我的困惑源于一个小小的误解。有人能以循序渐进的方式解释一下吗?

EN

回答 3

Stack Overflow用户

发布于 2021-09-28 12:29:21

我希望您能理解,当您使用f.backward()时,您在x.grad中得到的是

在你的情况下

。所以,很简单(用基础微积分)

如果你输入x,y和z的值,这就解释了输出。

但是,这并不是真正的“反向传播”算法。这只是偏导数(这就是你在问题中所问的全部)。

编辑:如果你想了解它背后的反向传播机制,请参阅@Ivan的答案。

票数 2
EN

Stack Overflow用户

发布于 2021-09-28 15:33:35

我可以提供一些关于反向传播的PyTorch方面的见解。

当操作需要梯度计算(requires_grad=True)的张量时,PyTorch跟踪反向传播的操作,并构造一个特别的计算图。

让我们看一下你的例子:

代码语言:javascript
代码运行次数:0
复制
q = x + y 
f = q * z

其对应的计算图可以表示为:

代码语言:javascript
代码运行次数:0
复制
  x   -------\
              -> x + y = q ------\
  y   -------/                    -> q * z = f
                                 /
  z   --------------------------/ 

其中xyz称为叶张量。反向传播包括计算xyy的梯度,分别对应于dL/dxdL/dydL/dz。其中,L是基于图形输出f的标量值。执行的每个操作都需要实现一个反向函数(这是所有数学上可区分的PyTorch内置的情况)。对于每个操作,此函数可有效地用于计算输出w.r.t的梯度。输入。

向后传递将如下所示:

代码语言:javascript
代码运行次数:0
复制
dL/dx <------\    
  x   -----\  \ 
            \ dq/dx 
             \  \ <--- dL/dq-----\
              -> x + y = q ----\  \
             /  /               \ df/dq
            / dq/dy              \  \ <--- dL/df ---
  y   -----/  /                   -> q * z = f
dL/dy <------/                   /  /
                                / df/dz
  z   -------------------------/  /
dL/dz <--------------------------/

第一个运算符的"d(outputs)/d(inputs)"术语是:dq/dx = 1dq/dy = 1。对于第二个运算符,它们是df/dq = zdf/dz = q

反向传播归结为应用链规则:dL/dx = dL/dq * dq/dx = dL/df * df/dq * dq/dx。直观上,我们以相反的方式分解dL/dx,而不是反向传播实际所做的,这是自下而上导航。

在不考虑形状的情况下,我们从dL/df = 1开始。实际上,dL/df具有f的形状(请参阅下面链接的另一个答案)。这将导致dL/dx = 1 * z * 1 = z。同样,对于yz,我们也有dL/dy = zdL/dz = q = x + y。这就是你观察到的结果。

我给出了一些相关主题的答案:

票数 1
EN

Stack Overflow用户

发布于 2021-09-29 08:54:08

你只需要理解什么是操作,以及你应该用来处理每个操作的偏导数是什么,例如:

代码语言:javascript
代码运行次数:0
复制
x = torch.tensor(1., requires_grad = True)
q = x*x
q.backward()

print("Gradient of x is: " + str(x.grad))

会给你2,因为x*x的导数是2*x

如果我们以你的x为例,我们有:

代码语言:javascript
代码运行次数:0
复制
q = x + y
f = q * z

可以修改为:

代码语言:javascript
代码运行次数:0
复制
f = (x+y)*z = x*z+y*z

如果我们取f在x的函数中的偏导数,我们只得到z。

要得到这个结果,您必须将所有其他变量视为常量,并应用您已经知道的导数规则。

但请记住,pytorch执行以获得这些结果的过程不是符号或数字微分,而是自动微分,这是一种有效获得梯度的计算方法。

仔细看看:

https://www.cs.toronto.edu/~rgrosse/courses/csc321_2018/slides/lec10.pdf

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69367939

复制
相关文章
CNN的反向传播DNN中的反向传播卷积神经网络中的反向传播
DNN中的反向传播 反向传播算法是神经网络的训练的基本算法组成之一,在训练神经网络时,训练分为两个步骤:计算梯度和更新权值。其中反向传播负责的是梯度的计算,而训练算法的区分主要在更新权值的方式上。对于DNN,基本的反向传播思路为: $$\cfrac{dz}{dw_{i}} = \cfrac{dz}{da_{i+1}} \times \cfrac{da_{i+1}}{dw_{i}}$$ 其中,$\cfrac{dz}{dw_{i}}$为输出(多为代价函数输出)对第i层的权值的梯度,$\cfrac{da_{i+1
月见樽
2018/04/27
1.2K0
pytorch学习笔记(三):反向传播
细节提要: Tensor张量可以视作数据结构:数据data + 梯度grad(grad也是张量) 核心代码:l.backward()反向传播,程序自动求出所有需要的梯度 w.grad.data.zero_()每步做完清零很重要,否则影响下一次求的梯度
zstar
2022/06/14
2660
pytorch学习笔记(三):反向传播
pytorch基础知识-反向传播
如图所示为由最开始的输入到输出。给了每个节点上一个weight(权重),第一层和第二层均用O代表输出。通过链式法则分解成上式子。
用户6719124
2019/11/17
4750
pytorch loss反向传播出错
今天在使用pytorch进行训练,在运行 loss.backward() 误差反向传播时出错 :
全栈程序员站长
2022/08/31
1.2K0
CNN中的反向传播
我们知道Pooling操作会使得feature map的尺寸发生变化,假如做$2\times 2$的池化,假设$l+1$层的feature map有16个梯度,那么第$l$层应该需要64个梯度,做法很简单,只需要把1个像素的梯度反向传给4个像素即可,但是要保证传递的梯度总和不变。由于有这条原则,因此avg pooling和max pooling的反向传播并不相同
mathor
2020/02/20
8440
[源码解析] PyTorch 分布式(13) ----- DistributedDataParallel 之 反向传播
上文我们已经对Reduer的前向传播进行了分析,本文就接着来看看如何进行反向传播。
罗西的思考
2021/12/01
9560
[源码解析] PyTorch 分布式(13) ----- DistributedDataParallel 之 反向传播
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
这篇文章主要介绍了pytorch .detach() .detach_() 和 .data用于切断反向传播的实现。
狼啸风云
2020/07/13
6.5K1
反向传播算法
反向传播算法 目录 关键词 损失函数 反向传播算法 BP算法伪代码 上一篇----》神经网络 》点击查看 1 关键词 反向传播算法 Backpropagation Algorithm 批量梯度下降法 batch gradient descent 整体代价函数 overall cost function 方差 squared-error 均方差 average sum-of-squares error 规则化项 regularization term 权重衰减 weight decay 偏置项 bias te
昱良
2018/04/08
1.3K0
反向传播算法
前反向传播
X: [[0.83494319 0.11482951] [0.66899751 0.46594987] [0.60181666 0.58838408] [0.31836656 0.20502072] [0.87043944 0.02679395] [0.41539811 0.43938369] [0.68635684 0.24833404] [0.97315228 0.68541849] [0.03081617 0.89479913] [0.24665715 0.28584862] [0.31375667 0.47718349] [0.56689254 0.77079148] [0.7321604 0.35828963] [0.15724842 0.94294584] [0.34933722 0.84634483] [0.50304053 0.81299619] [0.23869886 0.9895604 ] [0.4636501 0.32531094] [0.36510487 0.97365522] [0.73350238 0.83833013] [0.61810158 0.12580353] [0.59274817 0.18779828] [0.87150299 0.34679501] [0.25883219 0.50002932] [0.75690948 0.83429824] [0.29316649 0.05646578] [0.10409134 0.88235166] [0.06727785 0.57784761] [0.38492705 0.48384792] [0.69234428 0.19687348] [0.42783492 0.73416985] [0.09696069 0.04883936]] Y: [[1], [0], [0], [1], [1], [1], [1], [0], [1], [1], [1], [0], [0], [0], [0], [0], [0], [1], [0], [0], [1], [1], [0], [1], [0], [1], [1], [1], [1], [1], [0], [1]] w1: [[-0.8113182 1.4845988 0.06532937] [-2.4427042 0.0992484 0.5912243 ]] w2: [[-0.8113182 ] [ 1.4845988 ] [ 0.06532937]] After 0 training steps,loss on all data is 5.13118 After 500 training steps,loss on all data is 0.429111 After 1000 training steps,loss on all data is 0.409789 After 1500 training steps,loss on all data is 0.399923 After 2000 training steps,loss on all data is 0.394146 After 2500 training steps,loss on all data is 0.390597 w1: [[-0.7000663 0.9136318 0.08953571] [-2.3402493 -0.14641273 0.58823055]] w2: [[-0.06024271] [ 0.9195618 ] [-0.06820712]]
裴来凡
2022/05/29
5960
前反向传播
反向传播详解
反向传播 下降的幅度与斜率大小成正比,越到最小点时,每步应越来越小,防止调过头 某一点导数大小即可表现为 w的变化幅度 w - k * ▽J(w) ▽J(w)为正表示向左走 w变小 ,为负表示
Dean0731
2020/05/11
6730
BP反向传播
""" 案例:研究生学院录取数据,用梯度下降训练一个网络。 数据有三个输入特征:GRE 分数、GPA 分数和本科院校排名(从 1 到 4)。排名 1 代表最好,排名 4 代表最差。 """ # ----------分隔线------------- """ 数据解读说明: admit 0未录取 1 录取 gre分数 gpa绩点分数 rank 本科院校等级 #数据预处理 admit --目标标签 rank ---分类变量--》亚编码|one-hot独热编码,相当于去除量纲的影响 gre,gpa
诡途
2021/12/30
4400
[MachineLearning] 反向传播Back Propagation
如何直观地解释 back propagation 算法? - 胡逸夫的回答 - 知乎
wOw
2018/09/18
8990
[MachineLearning] 反向传播Back Propagation
【TensorFlow篇】--反向传播
反向自动求导是 TensorFlow 实现的方案,首先,它执行图的前向阶段,从输入到输出,去计算节点 值,然后是反向阶段,从输出到输入去计算所有的偏导。
LhWorld哥陪你聊算法
2018/09/13
6750
【TensorFlow篇】--反向传播
反向传播是什么?
深度学习系统能够学习极其复杂的模式,它们通过调整权重来实现这一点。深度神经网络则通过反向传播的过程进行调整,如果没有反向传播,深度神经网络就无法执行识别图像和解释自然语言等任务。
AiTechYun
2020/02/23
1.4K0
反向传播算法(Backpropagation)
BP算法(即反向传播算法)是在有导师指导下,适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个n输入m输出的BP神经网络所完成的功能是从n维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合,因此具有很强的函数复现能力。这是BP算法得以应用的基础。
easyAI
2019/12/18
9020
卷积神经网络中卷积运算的前向传播与反向传播推导
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/90412121
Tyan
2019/05/25
1.2K0
手推Assignment2中BN反向传播
或许有些人对于上一节说的BN推导没有深入理解,那么本节则从一篇非常好的论文中来实践带大家手推一遍,与此同时,完成Week6的作业!
公众号guangcity
2019/09/20
1.1K0
手推Assignment2中BN反向传播
反向传播与它的直观理解
反向传播与它的直观理解:为了感谢大神,我是跪在电脑前fork的。问题描述与动机:大家知道,我们给定图像像素向量和函数f(x),希望计算f在x上的梯度。直观理解:反向传播是图解求导的链式法则。
MachineLP
2018/01/09
6570
反向传播与它的直观理解
计算图演算:反向传播
除了深度学习,反向传播算法在许多其他领域也是一个强大的计算工具,从天气预报到分析数值稳定性——区别只在于名称差异。事实上,这种算法在几十个不同的领域都有成熟应用,无数研究人员都为这种“反向模式求导”的形式着迷。
崔庆才
2019/09/04
1.6K0
计算图演算:反向传播
点击加载更多

相似问题

PyTorch布尔-停止反向传播?

23

PyTorch中的截断反向传播(代码检查)

135

pyTorch中的反向传播考虑了哪些参数?

14

需要帮助了解Andrew NG ML反向传播

11

PyTorch丢失()和反向传播是否理解lambda层?

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文