理解动态计算图,requires_grad、zero_grad

本文深入解析PyTorch动态计算图的工作原理,包括叶子节点、requires_grad属性、detach()、zero_grad()、retain_grad()和torch.no_grad()的作用。在训练神经网络时,了解这些概念对于有效地进行反向传播和权重更新至关重要。通过实例展示了如何利用这些工具在反向传播过程中控制梯度计算和权重更新。

动态计算图是在程序前向传播的过程中构建起来的,主要是用来进行反向传播。相比搭建网络结构时关注每一层的计算方式,计算图主要视角是数据节点(Tensor)。

在计算图构建和反向传播过程中存在一些令人混淆的概念,例如is_leaf、requires_grad、detach()、zero_grad()、 retain_grad()、torch.nograd()。从计算图反向传播的角度去理解这些概念,一切就变的清晰了。

动态图中的反向传播

图1 动态计算图

上图是计算图的示意图:X1和X2是两组输入数据Tensor,P1和P2是网络的权重Tensor,Y和Z是计算的中间结果Tensor,Fn是得到中间结果的计算操作。

  • 训练网络的最终目的是更新P1和P2的值,因此需要计算loss关于P1和P2的梯度,为了得到关于P1和P2的梯度,需要依次计算loss关于中间结果Y和Z的梯度。

  • 权重Tensor的梯度计算不依赖输入数据且输入数据X不需要更新数值,所以X1和X2不需要计算梯度。

因此默认情况下用户创建的输入数据requirs_grad=False, 网络的权重参数requirs_grad=True

1. 叶子节点

  • 由用户的上帝之手直接创造出的Tensor为叶子节点, 这些节点没有记录grad_fn参数(例如输入数据网络权重)。

  • 由需要梯度计算的叶子节点通过运算衍生出来的Tensor为非叶子节点,这些节点有grad_fn参数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blanklog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值