1. 反向传播的本质与数学基础
反向传播算法是深度学习模型训练的核心引擎。我第一次接触这个概念时,被它的精妙设计深深震撼——它完美地解决了深层神经网络参数优化的计算难题。
1.1 链式法则:反向传播的数学灵魂
反向传播的核心数学原理是多元微积分中的链式法则。假设我们有一个三层神经网络:
- 输入层:x
- 隐藏层:h = σ(W₁x + b₁)
- 输出层:ŷ = W₂h + b₂
- 损失函数:L = 1/2(ŷ - y)²
要计算损失L对W₁的梯度,按照链式法则:
∂L/∂W₁ = (∂L/∂ŷ)(∂ŷ/∂h)(∂h/∂(W₁x+b₁))(∂(W₁x+b₁)/∂W₁)
这种分解方式使得我们可以从输出层开始,逐层反向计算梯度,而无需为每个参数单独推导梯度公式。
提示:在实际实现中,PyTorch的autograd引擎会自动构建计算图并执行这些链式法则计算,这正是深度学习框架的强大之处。
1.2 计算图:理解反向传播的直观方式
计算图是理解反向传播最直观的工具。在前向传播时,PyTorch会动态构建一个计算图,记录所有运算操作。这个图包含了:
- 叶子节点:输入数据和模型参数
- 中间节点:各种运算操作
- 根节点:最终的损失值
当调用backward()时,系统会从根节点开始,沿着计算图的反向路径,依次计算每个节点的梯度。
python复制# 一个简单的计算图示例
x = torch.tensor(2.0, requires_grad=True)
y = x ** 2
z = y + 1
z.backward()
print(x.grad) # 输出4.0,因为dz/dx = 2x = 4
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. PyTorch中的反向传播实现机制
2.1 Tensor的grad属性与计算图
在PyTorch中,Tensor的grad属性存储了梯度值,但这个属性有几个关键特性:
- grad初始为None,只有在调用backward()后才会被填充
- grad本身也是一个Tensor,与原始Tensor形状相同
- 默认情况下,每次backward()调用会累加梯度值
python复制w = torch.tensor([1.0], requires_grad=True)
fo
