1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| # PyTorch Autograd 详解
## 背景介绍 `torch.autograd`是PyTorch的自动微分引擎,为神经网络训练提供支持。
神经网络(NN)是在输入数据上执行的嵌套函数集合,这些函数由参数(权重和偏差)定义,在PyTorch中存储在张量中。
训练NN分为两个步骤: 1. **前向传播**:NN对输出做出最佳猜测 2. **反向传播**:NN根据误差调整参数,收集误差导数并使用梯度下降优化参数
## Autograd内部机理

实现autograd依赖于两种数据类型: - `Variable`:包装tensor数据,包含额外属性: - `data`:存储的tensor数据 - `grad`:存储梯度 - `creator`:创建此Variable的Function
工作流程: 1. 输入Variable经过操作(operation)生成输出Variable 2. 每个操作自动生成对应的Function实例 3. 反向传播时,Function自动计算梯度并存储在grad属性中
**重要概念**: - 只有creator为null的变量(叶子节点)才能返回导数 - 中间变量的grad为0
## 使用案例
### 1. 基本梯度采集
```python import torch import torchvision import numpy as np
# 创建需要跟踪梯度的张量 a = torch.tensor([2., 3.], requires_grad=True) b = torch.tensor([6., 4.], requires_grad=True)
# 定义计算图 Q = 3*a**3 - b**2
# 反向传播(只能对标量输出) Q.sum().backward() # 或使用 Q.backward(gradient=torch.tensor([1., 1.]))
# 验证梯度 print(9*a**2 == a.grad) # tensor([True, True]) print(-2*b == b.grad) # tensor([True, True])
|
2. 在神经网络中的应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| model = torchvision.models.resnet18(pretrained=True) data = torch.rand(1, 3, 64, 64) labels = torch.rand(1, 1000)
prediction = model(data)
loss = (prediction - labels).sum() loss.backward()
optim = torch.optim.SGD( model.parameters(), lr=1e-2, momentum=0.9 ) optim.step()
|
重要注意事项
backward()只能对标量输出调用
- 中间变量的grad为0,只有叶子节点能获得梯度
- 优化器通过
.step()方法更新参数
- 每次反向传播前需要清空梯度(可通过
optim.zero_grad()实现)
提示:使用前需确保已安装torchvision(pip install torchvision)
```