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

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

评论