前向传播、反向传播和计算图

前向传播(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  
  │                          ▲  
  └──────────────────────────┘  
          反向传播(梯度回传)