1、Autograd 求导机制

我们在用神经网络求解PDE时, 经常要用到输出值对输入变量(不是Weights和Biases)求导; 例如在训练WGAN-GP 时, 也会用到网络对输入变量的求导,pytorch中通过 Autograd 方法进行求导,其求导规则如下:

1.1当x为向量,y为一标量时

      

通过autograd 计算的梯度为:

1.2先假设x,y为一维向量

            ​​​​​​​        

其对应的jacobi(雅可比)矩阵为

grad_outputs 是一个与因变量 y 的shape 一致的向量

在给定grad_outputs 后,通过Autograd 方法 计算的梯度如下:

   ​​​​​​​

1.3 当 x 为1维向量,Y为2维向量

给出grad_outputs  与Y的shape一致

Y 与x的jacobi矩阵

​​​​​​​

​​​​​​​        ​​​​​​​        ​​​​​​​

则 Y 对 x 的梯度:

​​​​​​​                 

1.4 当 X ,Y均为2维向量时

​​​​​​​                                 

​​​​​​​        

1.5 当X  Y为更高维度时,可以按照上述办法转化为低维度的求导

值得注意的是:

  • 求导后的梯度shape总与自变量X保持一致
  • 对自变量求导的顺序并不会影响结果,某自变量的梯度值会放到该自变量原来相同位置
  • 梯度是由每个自变量的导数值组成的向量,既有大小又有方向
  • grad_outputs 与 因变量Y的shape一致,每一个参数相当于对因变量中相同位置的y进行一个加权。

2 pytorch求导方法

2.1 在求导前需要对需要求导的自变量进行声明

2.2 torch.autograd.gard()

grad =  autograd.grad( outputs, inputs, grad_outputs=None, retain_graph=None,    create_graph=False, only_inputs=True, allow_unused=False )

参数解释:

outputs:求导的因变量 Y

inputs : 求导自变量 X

grad_outputs:

  • 当outputs为标量时,grad_outputs=None , 不需要写,
  • 当outputs 为向量,需要为其声明一个与outputs相同shape的参数矩阵,该矩阵中的每个参数的作用是,对outputs中相同位置的y进行一个加权。 不然会报错

  • autograd.grad()返回的是元组数据类型,元组的长度与inputs长度相同,元组中每个单位的shape与相同位置的inputs相同

retain_graph:

1、当求完一次梯度后默认会把图信息释放掉,都会free掉计算图中所有缓存的buffers,当要连续进行几次求导时,可能会因为前面buffers不存在而报错。

因为第二个梯度计算z对x的导数,需要y对x的计算导数的缓存信息,但是在计算grad1后,保存信息被释放,找不到了,因此报错。

修改如下:

2、一般计算的最后一个梯度可以不需要保存计算图信息,这样在计算后可以及时释放掉占用的内存。

3、在pytorch中连续多次调用backward()也会出现这样的问题,对中间的backwad(),需要保持计算图信息

create_graph: 若要计算高阶导数,则必须选为True

求二阶导方法如下:

allow_unused: 允许输入变量不进入计算

2.3 torch.backward()

def backward(

gradient: Optional[Tensor] = None,

retain_graph: Any = None,

create_graph: Any = False,

inputs: Any = None) -> Any

)

  • 如果需要计算导数,可以在tensor上直接调用.backward(),会返回该tensor所有自变量的导数。通过name(自变量名).grad 可以获得该自变量的梯度
  • 如果tensor是标量,则backward()不需要指定任何参数
  • 如果tensor是向量,则backward()需要指定gradient一个与tensorshape相同的参数矩阵,即这里的gradient 同 grad_outputs 作用和形式完全一样。

pytorch求导总结(torch.autograd)相关推荐

  1. [转]一文解释PyTorch求导相关 (backward, autograd.grad)

    PyTorch是动态图,即计算图的搭建和运算是同时的,随时可以输出结果:而TensorFlow是静态图. 在pytorch的计算图里只有两种元素:数据(tensor)和 运算(operation) 运 ...

  2. 用numpy、PyTorch自动求导、torch.nn库实现两层神经网络

    用numpy.PyTorch自动求导.torch.nn库实现两层神经网络 1 用numpy实现两层神经网络 2 用PyTorch自动求导实现两层神经网络 2.1 手动求导 2.2 gradient自动 ...

  3. pytorch 笔记: 扩展torch.autograd

    1 扩展torch.autograd 向 autograd 添加操作需要为每个操作实现一个新的 Function 子类. 回想一下,函数是 autograd 用来编码操作历史和计算梯度的东西. 2 何 ...

  4. pytorch自动求导机制

    Torch.autograd 在训练神经网络时,我们最常用的算法就是反向传播(BP). 参数的更新依靠的就是loss function针对给定参数的梯度.为了计算梯度,pytorch提供了内置的求导机 ...

  5. autograd-自动求导系统

    torch.autograd 权值的更新需要求解梯度,pytorch提供了自动求导系统,我们只需要搭建前向传播计算图,由autograd的方法就可以得到所有张量的梯度. 其中最常用的方法是backwa ...

  6. 【2】激活函数与Loss函数求导

    文章目录 1.常见的激活函数与梯度 Sign函数 Sigmoid函数 Tanh函数 ReLU函数 Softmax函数 Leaky ReLU函数 SELU函数 Softplus函数 2.常见的Loss与 ...

  7. PyTorch定义新的自动求导(Autograd) 函数

    PyTorch定义新的自动求导(Autograd) 函数 pytorch官网提供了定义新的求导函数的方法(链接放在文章末尾了),官网举的例子,可能我比较笨,愣是反应了好一会儿才理解.这篇博客主要讲 P ...

  8. PyTorch 笔记Ⅱ——PyTorch 自动求导机制

    文章目录 Autograd: 自动求导机制 张量(Tensor) 梯度 使用PyTorch计算梯度数值 Autograd 简单的自动求导 复杂的自动求导 Autograd 过程解析 扩展Autogra ...

  9. pytorch自动求导

    1.求导 params = torch.tensor([1.0, 0.0], requires_grad=True) 注意到了张量构造函数的 require_grad = True 吗?这个参数告诉P ...

最新文章

  1. [python教程入门学习]Python标准库映射类型与可散列数据类型的关系
  2. Android -- ImageLoader本地缓存
  3. Java-Java中的线程池原理分析及使用
  4. 程序员取名:用大数据分析一下宝宝取名时最容易重复的名字
  5. Android Studio运行报错:无法访问XXX......请删除该文件或确保该文件位于正确的类路径子目录中
  6. TestCenter中测试需求、测试用例、测试计划的评审方法
  7. java udp 接收不定长_JAVA UDP通信为什么只能接收一次数据,我想要时刻接收数据,并更新UI,大神们帮我看看程序吧?...
  8. 《古剑奇谭2》详细测评心得
  9. Jira项目导入,被导入项目与目的系统数据类型不一致导入不成功的解决方案
  10. 19. Treat class design as type design
  11. wget下载网络资源
  12. PAT 甲级1069/乙级 1019 PAT Ranking 个人错误总结
  13. quartz框架(五)-Trigger相关内容
  14. python爬千图网高清图片
  15. [BJDCTF2020]Mark loves cat(3种解法)
  16. 深入JUnit源码之Runner
  17. 震惊,用过微粒贷的人没资格贷款买房!
  18. 神经网络 深度神经网络,深度神经网络基本原理
  19. 前端面试查漏补缺--(二) 垃圾回收机制
  20. 【免费领取】趣味测试小程序源码/内置超多趣味测评+可插入流量主广告位微信小程序源码

热门文章

  1. 看英语书记录的单词-3
  2. 手撕代码deep image matting(6):dataset(1)
  3. 下载视频-you-get
  4. 数字文旅解决方案 数字文旅
  5. 计算机课学生评价用语,关于学生上课的评语及评课用语
  6. 在 Java 中的一个单元格中应用多种字体
  7. 大道至简(读后感)第一章 编程的精义
  8. LDAP中CN,OU,DC等的含义
  9. 局部非饱和性的含义_范里安-微观经济学现代观点讲义(new)
  10. 不看好Twitter广告模式