通过小例子理解Pytorch自动求导原理

7dfb6097687ba8d990a43915fba0f7e4.gif

作者:郭震

梯度结果

x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x + 2
z = y.mean()
z.backward()
print(x.grad)  # 输出: tensor([0.3333, 0.3333, 0.3333])

例子解释梯度求导

让我们详细解释一下这个 PyTorch 代码示例中的每一步操作.

1. 创建张量 x

x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

这里,我们创建了一个包含三个元素的张量

x

,值为

[1.0, 2.0, 3.0]

.

requires_grad=True

表示我们希望对这个张量进行自动求导,也就是说,我们希望能够计算关于这个张量的梯度.

2. 执行张量运算

y = x + 2

这一步是对张量

x

进行加法运算,结果是一个新的张量

y

,其值为

[3.0, 4.0, 5.0]

.这个运算会记录在计算图中,以便后续进行反向传播时使用.

3. 计算张量 z

z = y.mean()

这里我们计算张量

y

的均值.

mean()

函数会将张量

y

中的所有元素求和,然后除以元素的个数,得到一个标量值.对于这个例子,

y

的均值是

(3.0 + 4.0 + 5.0) / 3 = 4.0

,所以

z

是一个值为

4.0

的标量张量.

4. 进行反向传播

z.backward()

调用

backward()

方法开始反向传播计算梯度.由于

z

是通过多个张量运算得到的,因此这个过程会计算

z

x

的梯度.

5. 打印梯度

print(x.grad)  # 输出: tensor([0.3333, 0.3333, 0.3333])
x.grad

中保存了

z

x

的梯度.我们来详细计算这个梯度.

梯度计算过程

我们需要计算 zx 的梯度,即 ∂z/∂x.回顾一下每一步运算:y = x + 2

z = y.mean()

首先,我们计算 zy 的梯度.

因为 z = mean(y),均值的梯度是每个元素的梯度都是 1/3(因为 y 中有 3 个元素),所以有:

[Math Processing Error]∂𝑧∂𝑦𝑖=13

接下来,根据链式法则,zx 的梯度是 zy 的梯度乘以 yx 的梯度.因为 y = x + 2,所以:

[Math Processing Error]∂𝑦𝑖∂𝑥𝑖=1

所以最终的梯度是:[Math Processing Error]∂𝑧∂𝑥𝑖=∂𝑧∂𝑦𝑖⋅∂𝑦𝑖∂𝑥𝑖=13⋅1=13≈0.3333

因为 x 中每个元素对 z 的贡献是相同的,所以 x.grad 中每个元素的梯度都是 0.3333.因此,输出 x.gradtensor([0.3333, 0.3333, 0.3333]).

这个示例展示了 PyTorch 中自动求导的基本原理,通过记录操作构建计算图,然后使用反向传播计算梯度.

感谢你的支持,原创不易,希望转发,点击,以及收藏,也可以点击阅读原文更多AI知识分享,同时也可以关注知识星球:郭震AI学习星球

最后,若想利用副业时间提高技能和收入,可以加入我的星球:

18aac47ddd24ff4b072f80a517cc7e19.png长按上图二维码查看「郭震AI学习星球」

  • 更多Python、数据分析、爬虫、前后端开发、人工智能等教程参考.

  • 以上全文,欢迎继续点击阅读原文学习,阅读更多AI资讯,[请点击这里]  https://ai-jupyter.com/

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值