前向传播(Forward Propagation)
前向传播是神经网络中从输入数据到输出预测值的计算过程。它通过逐层应用权重(W)和偏置(b),最终生成预测值 $y’ $,并计算损失函数$L $。
模型定义
$$ y’ = W \cdot x + b $$
损失函数(均方误差)
$$ L = \frac{1}{n} \sum_{i=1}^{n} (y’(i) - y_{\text{true}}(i))^2 $$
示例
输入数据:$x = [1.0, 2.0] $ 真实标签:$y_{\text{true}} = [3.0, 5.0]$ 参数初始值:$W = 1.0, \ b = 0.5$
前向计算
预测值:$y’(1) = 1.0 \cdot 1.0 + 0.5 = 1.5, \quad y’(2) = 1.0 \cdot 2.0 + 0.5 = 2.5$ 损失函数:$L = \frac{1}{2} \left[ (1.5 - 3)^2 + (2.5 - 5)^2 \right] = \frac{1}{2} (2.25 + 6.25) = 4.25$
计算图(Computational Graph)
计算图是一种数据结构,用于表示前向传播中的计算过程。图中的节点代表数学操作(如加法、乘法),边代表数据流动(张量)。 对上述线性回归模型,计算图如下:
输入 x → (Multiply W) → (Add b) → 预测值 t_p → (Subtract y_true) → 误差平方 → 求和平均 → 损失 L
- 节点:乘法、加法、平方、求和、平均等操作。
- 边:数据流(如 $ x, W, b, y’, L$)。
反向传播(Backward Propagation)
反向传播是通过链式法则(Chain Rule),从损失函数$ L $开始,反向计算每个参数$(W, b)$的梯度 $( \frac{\partial L}{\partial W} ) $和$ ( \frac{\partial L}{\partial b} ) $的过程。下面以线性回归模型公式示例:
损失对预测值的梯度
$$ \frac{\partial L}{\partial y’(i)} = \frac{2}{n} (y’(i) - y_{\text{true}}(i)) $$
预测值对参数的梯度
- 对权重 $W $:$ \frac{\partial y’(i)}{\partial W} = x(i) $
- 对偏置 $b $:$\frac{\partial y’(i)}{\partial b} = 1 $
合并梯度
权重梯度:$ \frac{\partial L}{\partial W} = \sum_{i=1}^{n} \frac{\partial L}{\partial y’(i)} \cdot \frac{\partial y’(i)}{\partial W} = \frac{2}{n} \sum_{i=1}^{n} (y’(i) - y_{\text{true}}(i)) \cdot x(i) $
偏置梯度:$ \frac{\partial L}{\partial b} = \sum_{i=1}^{n} \frac{\partial L}{\partial y’(i)} \cdot \frac{\partial y’(i)}{\partial b} = \frac{2}{n} \sum_{i=1}^{n} (y’(i) - y_{\text{true}}(i)) $
反向传播示例
使用前向传播的结果: 计算误差项 $$ y’(1) - y_{\text{true}}(1) = 1.5 - 3 = -1.5, \quad y’(2) - y_{\text{true}}(2) = 2.5 - 5 = -2.5 $$ 计算梯度
权重梯度:$\frac{\partial L}{\partial W} = \frac{2}{2} [(-1.5) \cdot 1.0 + (-2.5) \cdot 2.0] = 1.0 \cdot (-1.5 - 5) = -6.5 $
偏置梯度:$\frac{\partial L}{\partial b} = \frac{2}{2} [(-1.5) + (-2.5)] = 1.0 \cdot (-4) = -4$
PyTorch示例
import torch
# 定义参数(启用梯度追踪)
W = torch.tensor(1.0, requires_grad=True)
b = torch.tensor(0.5, requires_grad=True)
# 输入数据
x = torch.tensor([1.0, 2.0])
y_true = torch.tensor([3.0, 5.0])
# 前向传播
y_pred = W * x + b
loss = torch.mean((y_pred - y_true) ** 2)
# 反向传播
loss.backward()
# 输出梯度
print(f"dL/dW: {W.grad}") # 输出 tensor(-6.5)
print(f"dL/db: {b.grad}") # 输出 tensor(-4.0)
关键点说明
- 动态计算图:PyTorch 在前向传播时自动构建计算图。
- 反向传播触发:调用 .backward() 后,从损失节点反向遍历图,计算所有 requires_grad=True 的张量的梯度。
- 梯度存储:梯度结果存储在张量的 .grad 属性中。
总结:
| 概念 | 作用 | 示例中的体现 |
|---|---|---|
| 前向传播 | 计算预测值和损失函数 | $ y’ = W \cdot x + b, L = 4.25 $ |
| 计算图 | 记录所有计算操作,为反向传播提供路径 | 乘法、加法、平方、求和、平均等操作组成的数据结构 |
| 反向传播 | 通过链式法则计算参数梯度 | $ \frac{\partial L}{\partial W} = -6.5 $ |
输入 x
│
▼
[W*x] → 乘法操作(计算图节点)
│
▼
[+b] → 加法操作(计算图节点)
│
▼
预测值 y' → [平方损失] → 平均损失 L
│ ▲
└──────────────────────────┘
反向传播(梯度回传)
评论