【深度学习基础】Pytorch的动态计算图与自动求导

正向传播

一个完整的神经网络往往需要进行两个最重要的步骤

1.正向传播 即带入输入的数据跑一次神经网络
2.反向传播 利用损失函数更新权重

反向传播

反向传播是神经网络的核心,神经网络的精度受权重控制(w和b)一次正向传播后,往往会根据损失函数来计算调节这些权重,以保证神经网络的精度。

损失函数的值受到权重的影响,而更新权重使得损失函数的值最小化的核心算法就是梯度下降。

反向传播就是计算损失函数对于权重参数的偏导数,而很多时候损失函数关于权重来说是个嵌套的函数,需要通过链式法则来计算,而偏导数的计算又是非常复杂的,因此需要Pytorch来自动计算。

自动求导机制

直接看一个例子

使用Pytorch计算

y=2x^{T}x这个函数的各个x自变量的梯度

首先定义x矩阵,注意需要转化为浮点数

为了后面能够求梯度需要将x的require_grad属性设置为True

计算y

调用反向传播函数计算x的梯度

注意几点,y的值多了一个属性grad_fn,这个代表了x是怎么运算得到y的为后续求导提供支持。

如果不调用y.backword(),x的梯度是不会计算的,因此返回None,当调用后,即可得到x的梯度

显然可以发现由于x是列向量,而x的转置*x实际上就是x的平方因此偏导数是4x,可以发现最终的值确实是4x。

需要注意的是Pytorch采取的是动态图机制,因此backword不能再次调用了,要调用需要重新来一遍

 

同时如果x还要参与某个函数的计算的话需要对x的梯度进行清空,否则pytorch会默认把两次梯度进行求和。

可以发现是错的,因为y1是x的求和函数,那么实际上梯度一定为1,而上一次梯度是[0,4,8,12]显然是相加了。

有些时候如果不想进行梯度计算,可以使用with torch.no_grad,或者对x进行detch方法产生一个require_grad为False的相同的张量。

动态图机制

简单的来介绍一下Pytorch的动态图计算机制

计算图为一个有向无环图,每个节点代表一个算子,节点之间的边代表了计算方式。

或者搬运网上的说法

计算图是用来描述运算的有向无环图,有两个主要元素:

节点 (Node) :节点表示数据,如向量、矩阵、张量。

(Edge):边表示运算,如加减乘除卷积等。

与Tensorflow相比,Pytorch采取的是动态计算图机制,也就是随着创建的张量来构建动态图,因此backword之后pytorch为了节省内存而把得出的动态计算图去除了。

动态计算图的优点很明显便于操作,但是缺点是会相较慢一点。动态计算图的存在Pytorch才能跟踪每个变量的情况从而得出每个权重的梯度。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值