PyTorch入门学习:4-Back Propagation

Back Propagation 反向传播

1 Introduction

  • 对于简单的神经网络,我们可以使用解析式来计算梯度。
  • 但是对于复杂的神经网络,我们无法使用解析式来计算梯度,因此需要使用反向传播算法。
  • 每个层单独计算梯度并不复杂,而复合后,梯度的计算就变得复杂起来。

复杂神经网络如何计算梯度?

2 Computational Graph 计算图

一个两层的神经网络 如图,表示一个两层的神经网络,其中MM表示矩阵的乘法。输入为,输出为,中间层的输出为,其中分别为第一层和第二层的权重矩阵,分别为第一层和第二层的偏置向量。

  • 注意:从这里开始,处理的数据都是张量
  • 这里还有一个问题,这个两层的神经网络通过整理后,得到,等效为一层的神经网络。 因此,需要在每一层后添加一个非线性函数(激活函数),例如ReLU函数。后续会详细介绍。

3 Chain Rule

  1. Create Computational Graph(Forward)
  2. Local Gradient
  3. Given gradient from successive node
  4. Use chain rule to compute gradient(Backward)

利用链式法则计算梯度的步骤

一个简单的两层神经网络的反向传播过程

  • 求梯度的最小单元是每个层的本地梯度,视定义的原子操作而定。

4 Tensor in Pytorch

tensor(张量)是pytorch中最基本的数据结构,它是一个多维数组,用于存储和操作数据。

tensor类型

  • 如图,tensor类型中包括Data本身以及梯度值。 Implementation
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
import torch

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w=torch.tensor([1.0])
w.requires_grad = True
# or w=torch.tensor([1.0], requires_grad=True)
# 只有在w.requires_grad=True时,才会计算梯度

# 用构建计算图的视角来看待代码
def forward(x):
return w*x

def loss(x, y):
y_pred = forward(x)
return (y_pred - y)**2

for epoch in range(100):
for x, y in zip(x_data, y_data):
l = loss(x, y)
# 每一次计算都会重新构建计算图(有时在每代中网络结构会改变)
l.backward() # 反向传播,计算梯度
print(f"epoch: {epoch}, w.grad: {w.grad.item()}")
# item()用于将tensor转换为python中的标量
w.data -= 0.01 * w.grad.data
# tensor中的grad也是一个tensor,若不使用data来访问,优惠进行一次构建计算图的操作
w.grad.data.zero_()
# 每一次迭代后,需要将梯度清零,否则会累加

PyTorch入门学习:4-Back Propagation
https://eleco.top/2026/02/24/learn-torch-4-Back-Propagation/
作者
Eleco
发布于
2026年2月24日
许可协议