autograd
利用计算图来实现 自动求导(backpropagation)。PyTorch 的计算图是 动态图(相比 TensorFlow 1.x 的静态图),更灵活,适合循环结构和可变长度输入。
假设有简单的计算: z=x2+2x+1z = x^2 + 2x + 1
Python + PyTorch 实现:
import torch# 创建张量,开启自动求导x = torch.tensor(3.0, requires_grad=True)# 前向计算y = x**2 + 2*x + 1print(y) # 输出 16.0php116 Bytes© 菜鸟-创作你的创作
此时,PyTorch 会动态生成如下计算图:
x ----> x**2 ----+ \ + ----> yx ----> 2*x ----/ 1 --------------+php102 Bytes© 菜鸟-创作你的创作
x
x**2
, 2*x
y
y.backward() # 计算 dy/dxprint(x.grad) # 输出 8.0php47 Bytes© 菜鸟-创作你的创作
推导过程: dydx=ddx(x2+2x+1)=2x+2=8\frac{dy}{dx} = \frac{d}{dx}(x^2 + 2x + 1) = 2x + 2 = 8
x.grad
存储的是 梯度值特点 | 说明 |
---|---|
动态图 | 每次 forward 都构建计算图,支持 if/for 等动态控制流 |
节省内存 | backward 后中间节点释放,可减少内存占用 |
灵活调试 | 可在 forward 时随意打印、调试张量 |
自动求导 | 无需手动计算梯度,复杂网络也适用 |
x = torch.tensor(2.0, requires_grad=True)y1 = x**2y2 = x**3z = y1 + y2z.backward()print(x.grad) # dy/dx = 2*x + 3*x**2 = 4 + 12 = 16php139 Bytes© 菜鸟-创作你的创作
with torch.no_grad(): y = x**2 # 不会记录计算图php45 Bytes© 菜鸟-创作你的创作
import torch.nn as nnmodel = nn.Linear(10, 1)x = torch.randn(1, 10)y = model(x) # 自动构建计算图loss = y.sum()loss.backward() # 自动计算所有参数梯度php139 Bytes© 菜鸟-创作你的创作
backward()
自动求梯度。requires_grad=True
控制哪些张量需要求梯度。https://www.52runoob.com/archives/5763
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。