Pytorch(5)-梯度反向传播

自动求梯度

  • 1. 函数对自变量x求梯度--ax^2+b
  • 2. 网络对参数w求梯度- loss(w,x)
  • 3. 自动求梯度的底层支持--torch.autograd
    • 3.1 Variable
      • 3.1.1 Variable构造函数
      • 3.1.2 Variable链式求导--backward()
      • 3.1.3 Variable反向传播函数--grad_fn
    • 3.2 计算图
      • 3.2.1 动态创建计算图
      • 3.2.2 非叶子节点的梯度--autograd.grad 与 hook
    • 3.3 复杂自建函数,自动求导支持

1. 函数对自变量x求梯度–ax^2+b

torch提供了简便的求梯度方法:带入变量值x,求解目标函数f(x),将目标函数的值反向传播f.backward(),就能计算对应变量的导数。

  1. 以二次函数为例:f(x)=ax2+bf(x)=ax^2+bf(x)=ax2+b
  2. 其中a,b是已知的参数,对x 求导:f′(x)=2axf'(x)=2axf(x)=2ax
  3. a=1,x=1时a=1,x=1时a=1,x=1f′(x)=2f'(x)=2f(x)=2
import torch
from torch.autograd import Variable
def f(x):return x**2
x1 = Variable(torch.Tensor([1]),requires_grad=True)  # 使用variable封装待求导的参数
print("初始化", x1.grad)y=f(x1)
y.backward()
print("一次传播", x1.grad)x1.grad.data.zero_()
print("梯度置零", x1.grad)y=f(x1)
y.backward()
y=f(x1)              # #如果x1.grad 每次计算前梯度不归零,那么当前的梯度会与原来的梯度累加
y.backward()         # #每次loss 反向传播前需要将梯度设置为0
print("二次传播", x1.grad)

输出

初始化 None
一次传播 tensor([2.])
梯度置零 tensor([0.])
二次传播 tensor([4.])

2. 网络对参数w求梯度- loss(w,x)

神经网络训练:通过调整神经网络参数使网络输出尽可能接近于想要的对象。具体通过损失函数的梯度下降实现的,即损失函数对网络参数求梯度,利用该梯度调整网络参数。

模型的损失函数实际是输入x 和模型参数w 的函数:loss(w,x)。依据part1demo流程,随机初始化w后,输入观测数据x(图像 或者 其他需要分类或者回归的数据)。loss(w, x).backward()就可以求出对应的网络参数w的梯度。再利用各种优化算法(SGD,admn)更新各个网络参数w即可。
pytorch 网络训练的流程

  1. 搭建好网络:net()
  2. 数据x输入网络:y=net(x,w)
  3. 网络输出y与标签label计算标量损失函数:loss(y,label,w)
  4. 损失函数loss()反向传播:loss.backward()->通过自动求导Adagrad实现
  5. 网络参数更新:net.parameters().step()->通过优化器实现

注意事项:在每次损失函数反向传播计算梯度时,原本的参数梯度必须设置为0。否则,各个参数的梯度会累加之前的梯度。网络参数梯度置0:

optimizer=torch.optim.SGD(net.parameters(),lr=0.001,momentum=0.1)
optimizer.zero_grad()
loss.backward()

3. 自动求梯度的底层支持–torch.autograd

torch.autograd 是一套自动求导引擎,能够根据输入前向传播过程自动构建计算图,并执行反向传播. 计算图是深度学习框架的核心。

[本节为陈云<<深度学习框架-pytorch 入门与实践>>一书第3.2章的内容autograd 读书笔记.]

pytorch 中 autograd模块 实现了 计算图 相关功能. autograd 的核心数据结构Variable。
pytorch 中 autograd模块 底层采用 计算图 实现梯度计算。

3.1 Variable

Variable中封装了以下三个部分内容

  1. data : 保存数据tensor
  2. grad : 保存data对应的梯度,形状与data一致,也是一个Variable
  3. grad_fn : 指向一个Function,记录Variable操作历史,如果一个变量是由用户创建的,则他为叶子节点,对应的grad_fn为None.

3.1.1 Variable构造函数

Variable的构造函数–需要传入tensor,还有两个可选参数:

  1. requires_grad : bool 是否需要对该variable进行求导
  2. volatile : bool 为True , 那么基于该variable 构建的图都不会求导,转为推理阶段设计.

volatile优先级别比requires_grad高。在计算路径上同时存在requires_grad=True 和 volatile=True 的变量,那么其后的通过计算得出的变量的requires_grad 为False.

3.1.2 Variable链式求导–backward()

Variable支持大部分的tensor操作,但不支持部分inplace函数。如果想要计算各个Variable的梯度,只需要调用根节点variable的backward方法,autograd 会自动沿计算图反向传播,计算每一个叶子节点的梯度.

Variable.backward(grad_variables=None,retain_graph=None,create_graph=None)

  1. grad_variables : 相当与链式法则∂z∂x=∂z∂y∂y∂x\frac{\partial z}{\partial x}=\frac{\partial z}{\partial y}\frac{\partial y}{\partial x}xz=yzxy中的∂z∂y\frac{\partial z}{\partial y}yz 。y.backward(grad_y) 等价于 z.backward()

  2. retain_graph : 反向传播中会缓存一些中间结果,反向传播结束后缓存被清空。可以通过指定这个参数不清空缓存,用于多次反向传播。

  3. create_graph : 反向传播过程中再次构建计算图,通过backward of backward实现高阶求导.

3.1.3 Variable反向传播函数–grad_fn

variable变量的grad_fn 属性可以用来查看反向传播函数, next_functions保存grad_fn的输入,是一个tuple。每个变量在图中的位置可以通过grad_fn 属性在图中的位置推测得到。每一个前向传播函数都有一个与之对应的反向传播函数,用来计算各个输入变量的梯度;这些函数以Backward结尾。

x=Variable(torch.ones(1)) 
b=Variable(torch.rand(1,requires_grad=True)) 
w=Variable(torch.rand(1),requires_grad=True)
y=w*x
z=y+b
z.grad_fn       						# 查看z的反向传播函数                                                     
Out[16]: <AddBackward0 at 0x7f84b0a0e3c8>z.grad_fn.next_functions               # z 反向传播函数的输入,一个为y.grad_fn(为MulBackward0),另一个是b.grad_fn(为none)                                          
Out[17]: ((<MulBackward0 at 0x7f84903a9588>, 0), (None, 0))y.grad_fn                                                              
Out[27]: <MulBackward0 at 0x7f84903a9588>
y.grad_fn.next_functions                                                           
Out[19]: ((<AccumulateGrad at 0x7f84b0a0ee10>, 0), (None, 0))z.backward(retain_graph=True)           # 保留中间结果                                    
w.grad                                                                 
Out[23]: tensor([1.])z.backward(retain_graph=True)           # 保留中间结果, 才能二次传播                                  
w.grad                                                                 
Out[26]:tensor([2.])                    # 这个为2 不是保留中间结果的原因,而是两次梯度传播

3.2 计算图

pytorch 中 autograd模块 底层采用 计算图 实现梯度计算。计算图是一种特殊的有向无环图 , 用于记录算子变量 之间的关系。

在pytorch 中autograd模块会随着用户操作,记录生成当前 variable 的所有操作。以此建立一个有向无环图(每个变量都有一个有向无环图?还以一个计算过程有一个?应该是一个计算过程有一个图)。用户每进行一次操作,计算图就会变化。对应的变化会通3.1.3 的grad_fn 记录

3.2.1 动态创建计算图

pytorch 的计算图在每次前向传播的时候都是从头开始构建的 , 所以能够利用python的控制语句(for,if) 根据需求 创建动态图.

少一个例子

3.2.2 非叶子节点的梯度–autograd.grad 与 hook

在反向传播的过程中,非叶子节点的导数在计算完成之后即被清空,若想查看这些变量的梯度,有两种方法:autograd.grad 与 hook。

torch.autograd.grad()

In [28]: x=Variable(torch.ones(3),requires_grad=True)                           
In [30]: w=Variable(torch.ones(3),requires_grad=True)                           
In [31]: y=x*w                                                                  
In [32]: z=y.sum()                                                              
In [33]: z.backward()                                                           
In [34]: (x.grad,w.grad,y.grad)                                                 
Out[34]: (tensor([1., 1., 1.]), tensor([1., 1., 1.]), None)   # y.grad的梯度计算完被释放掉了
# 使用torch.autograd.grad()计算中间节点的梯度
In [35]: torch.autograd.grad(z,y)      # 求Z对Y的梯度                                      
Out[35]: (tensor([1., 1., 1.]),)

hook 呢?🤔️

3.3 复杂自建函数,自动求导支持

自己写一个复杂函数,不支持自动求导。这种情况下,定义此复杂函数为Function(), 继承自,Torch.autograd.Function。实现前向与反向传播 的代码。使用Function.apply(variable)调用实现Function。
详见:p95

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

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

相关文章

VIM使用系列之一——配置VIM下编程和代码阅读环境

作者&#xff1a;gnuhpc from http://blog.csdn.net/gnuhpc http://gnuhpc.wordpress.com/ 本文环境&#xff1a;ubuntu 10.10/vim7.2 前言&#xff1a;一年前写过一篇关于VIM的C/C编程环境的文字&#xff0c;一年中又接触了很多东西&#xff0c;深入使用中发现其实还是需要有…

fastText初探

目录&#xff1a;1、应用场景2、优缺点3、FastText的原理4、FastText词向量与word2vec对比 目录&#xff1a; 1、应用场景 fastText是一种Facebook AI Research在16年开源的一个文本分类器。 其特点就是fast。相对于其它文本分类模型&#xff0c;如SVM&#xff0c;Logistic …

mpiBlast安装详解以及使用说明

Getting mpiblast 现在下载包文件&#xff1a; wget http://www.mpiblast.org/downloads/files/mpiBLAST-1.6.0-pio.tgz 解压包文件&#xff1a; tar xvzf mpiBLAST*.tgz 然后下载ncbi&#xff1a; wget ftp://ftp.ncbi.nih.gov/toolbox/ncbi_tools/old/20061015/ncbi.tar.gz…

Pytorch(6)-设置随机种子,复现模型结果

设置随机种子&#xff0c;复现模型结果1.Python本身的随机因素2.numpy随机因素3.pytorch随机因素在很多情况下&#xff0c;我们希望能够复现实验的结果。为了消除程序中随机因素的影响&#xff0c;我们需要将随机数的种子固定下来。将所有带随机因素的种子全部固定下来后&#…

如何让自己学习?

阶段性反馈机制&#xff08;如何持之以恒、让自己发疯&#xff09; 反馈机制是王者荣耀的核心武器&#xff0c;击杀野怪获得金币&#xff0c;不断地努力&#xff0c;获得奖励是我们不断的玩这个游戏的主要原因&#xff0c;也是人的本能&#xff0c;我什么都得不到凭什么这么做&…

追女孩子必备

当然&#xff0c;首先要知道女孩子的手机号码。 其次&#xff0c;要对她有兴趣啦。 发个短信&#xff1a;“上次跟你聊天很愉快&#xff0c;能否再次邀你出来聊聊天&#xff1f;” 注意&#xff1a;女孩子答应的话&#xff0c;要找的地点是个比较清静的酒吧&#xff0c;暂时别去…

python中使用“if __name__ == '__main__'”语句的作用

首先用最简洁的语言来说明一下 if __name__ __main__: 的作用&#xff1a;防止在被其他文件导入时显示多余的程序主体部分。 先举个例子&#xff0c;如果不用if __name__ __main__: 会发生什么事&#xff1a; 首先在yy.py中调用cs.py #yy.pyimport csprint(引用cs)cs.cs()p…

bishi

鄙视 2011-04-26 20:43:02| 分类&#xff1a;默认分类 |字号订阅腾讯笔试题&#xff1a;const的含义及实现机制 const的含义及实现机制&#xff0c;比如&#xff1a;const int i,是怎么做到i只可读的&#xff1f; const用来说明所定义的变量是只读的。 这些在编译期间完成&…

NLP复习资料(1)-绪论、数学基础

NLP复习资料-绪论、数学基础1.绪论2.数学基础2.1信息论基础&#xff1a;2.2应用实例&#xff1a;词汇消歧国科大&#xff0c;宗老师《自然语言处理》课程复习笔记&#xff0c;个人整理&#xff0c;仅供参考。1.绪论 1&#xff0e; 语言学、计算语言学、自然语言理解、自然语言…

redis——sentinel

什么是哨兵机制 Redis的哨兵(sentinel) 系统用于管理/多个 Redis 服务器,该系统执行以下三个任务: 监控: 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。 提醒:当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他…

珍藏

http://www.cnblogs.com/leoo2sk/archive/2011/04/19/nginx-module-develop-guide.html http://ldl.wisplus.net/page/6/

FM,FFM及其实现

在推荐系统和计算广告业务中&#xff0c;点击率CTR&#xff08;click-through rate&#xff09;和转化率CVR&#xff08;conversion rate&#xff09;是衡量流量转化的两个关键指标。准确的估计CTR、CVR对于提高流量的价值&#xff0c;增加广告及电商收入有重要的指导作用。业界…

linux-在cenos上安装大全(nginx/JRE/maven/Tomcat/MYSQL/redis/kafka/es...)

云服务器 阿里云 腾讯云 七牛云 百度云 天翼云 华为云 西部数码 自己购买一个&#xff0c;学生和企业用户都有优惠的。 putty 自己下载一个putty&#xff0c;用来操作云服务器。 putty.org 一路下一步就ok。 点击putty.exe,输入你的ip或域名 最好改成20&#xff1…

NLP复习资料(2)-三~五章:形式语言、语料库、语言模型

NLP复习资料-三~五章1.第三章&#xff1a;形式语言2.第四章&#xff1a;语料库3.第五章&#xff1a;语言模型国科大&#xff0c;宗老师《自然语言处理》课程复习笔记&#xff0c;个人整理&#xff0c;仅供参考。1.第三章&#xff1a;形式语言 1.语言描述的三种途径&#xff1a…

存储管理的页面置换算法

存储管理的页面置换算法 存储管理的页面置换算法在考试中常常会考到&#xff0c;操作系统教材中主要介绍了3种常用的页面置换算法&#xff0c;分别是&#xff1a;先进先出法&#xff08;FIFO&#xff09;、最佳置换法&#xff08;OPT&#xff09;和最近最少使用置换法&#xff…

KKT条件初步理解

最近学习的时候用到了最优化理论&#xff0c;但是我没有多少这方面的理论基础。于是翻了很多大神的博客把容易理解的内容记载到这篇博客中。因此这是篇汇总博客&#xff0c;不算是全部原创&#xff0c;但是基础理论&#xff0c;应该也都差不多吧。因才疏学浅&#xff0c;有纰漏…

NLP复习资料(3)-六~七章:马尔科夫模型与条件随机场、词法分析与词性标注

NLP复习资料1.第六章 马尔科夫模型与条件随机场2.第七章 词法分析与词性标注国科大&#xff0c;宗老师《自然语言处理》课程复习笔记&#xff0c;个人整理&#xff0c;仅供参考。1.第六章 马尔科夫模型与条件随机场 1.马尔科夫模型&#xff1a;P6系统每一时刻的状态只与前一个…

redis——实战点赞

点赞功能随处可见&#xff0c;我们都知道点赞是一个非常高频的操作&#xff0c;redis就非常适合做这种工作。 实现效果&#xff1a; 分析&#xff1a;三种类型&#xff1a;给帖子点赞&#xff0c;给评论点赞&#xff0c;给回复点赞 我们只实现查看点赞数量的话&#xff0c;只…

network

1.网络结构 在OSI参考模型中&#xff0c;物理层的作用是透明的传输比特流。对等实体在一次交互作用中传送的信息单位称为协议数据单元&#xff0c;它包括控制信息和用户数据两部分。上下层实体之间的接口称为服务访问点(SAP)&#xff0c;网络层的服务访问点也称为网络地址&…

NLP复习资料(4)-第八章 句法分析

NLP复习资料-第八章国科大&#xff0c;宗老师《自然语言处理》课程复习笔记&#xff0c;个人整理&#xff0c;仅供参考。第八章&#xff1a;语法理论&#xff08;第三章的后续&#xff09; 1.出发点chomsky的四类文法过于泛化&#xff0c;生成能力太强了&#xff0c;会生成没有…