一、反向传播的核心步骤
1. 前向传播与损失计算
• 前向传播:输入数据逐层通过神经网络,每层执行线性变换( z = W x + b z = Wx + b z=Wx+b)和非线性激活(如ReLU、Sigmoid),最终得到预测输出。
• 损失函数计算:根据预测值与真实值的差异,计算损失(如交叉熵损失或均方误差)。例如,交叉熵损失为 L = − ∑ y i log p i L = -\sum y_i \log p_i L=−∑yilogpi,其中 y i y_i yi 是真实标签, p i p_i pi 是预测概率。
2. 反向梯度传播
• 输出层梯度计算:从输出层开始,计算损失对输出的梯度。例如,在Softmax+交叉熵损失中,梯度为预测概率与真实标签的差值( ∂ L ∂ z = p − y \frac{\partial L}{\partial z} = p - y ∂z∂L=p−y)。
• 链式法则逐层回传:
- 激活层梯度:计算当前层激活函数的导数。例如,Sigmoid的导数为 σ ′ ( z ) = σ ( z ) ( 1 − σ ( z ) ) \sigma'(z) = \sigma(z)(1-\sigma(z)) σ′(z)=σ(z)(1−σ(z)),ReLU的导数为0(输入<0)或1(输入>0)。
- 权重梯度计算:将上层梯度与当前层输入相乘,得到权重梯度。例如, ∂ L ∂ W = δ ⋅ x T \frac{\partial L}{\partial W} = \delta \cdot x^T ∂W∂L=δ⋅xT,其中 δ \delta δ 是上层梯度, x x x 是当前层输入。
- 偏置梯度:直接传递上层梯度( ∂ L ∂ b = δ \frac{\partial L}{\partial b} = \delta ∂b∂L=δ)。
3. 参数更新
• 梯度下降优化:根据梯度更新权重和偏置。公式为 W new = W − η ⋅ ∂ L ∂ W W_{\text{new}} = W - \eta \cdot \frac{\partial L}{\partial W} Wnew=W−η⋅∂W∂L,其中 η \eta η 是学习率。
• 正则化与学习率调整:引入L2正则化防止过拟合( ∂ L ∂ W ← ∂ L ∂ W + λ W \frac{\partial L}{\partial W} \leftarrow \frac{\partial L}{\partial W} + \lambda W ∂W∂L←∂W∂L+λW),并通过动态调整学习率加速收敛。
二、关键数学原理与节点类型
1. 链式法则的分解
反向传播的本质是将复杂梯度分解为局部导数的连乘积。例如,损失对某权重 W i j W_{ij} Wij 的梯度可分解为:
∂ L ∂ W i j = ∂ L ∂ z ⋅ ∂ z ∂ W i j = δ ⋅ x j \frac{\partial L}{\partial W_{ij}} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial W_{ij}} = \delta \cdot x_j ∂Wij∂L=∂z∂L⋅∂Wij∂z=δ⋅xj
其中 z z z 是当前层的加权和, x j x_j xj 是前一层第 j j j 个神经元的输出。
2. 典型节点的梯度计算
• 加法节点:梯度原样传递(如 ∂ L ∂ x = δ \frac{\partial L}{\partial x} = \delta ∂x∂L=δ)。
• 乘法节点:梯度交叉相乘(如 x ⋅ ∂ L ∂ z x \cdot \frac{\partial L}{\partial z} x⋅∂z∂L 和 y ⋅ ∂ L ∂ z y \cdot \frac{\partial L}{\partial z} y⋅∂z∂L)。
• 仿射变换(全连接层):梯度由输入和权重共同决定,例如 ∂ L ∂ W = δ ⋅ x T \frac{\partial L}{\partial W} = \delta \cdot x^T ∂W∂L=δ⋅xT。
三、反向传播的挑战与解决方案
1. 梯度消失与爆炸
• 问题:深层网络中梯度可能指数级衰减(如Sigmoid激活)或膨胀(权重初始化过大)。
• 解决方案:
• 使用ReLU等非饱和激活函数。
• 权重初始化(如He初始化)。
• 批量归一化(BatchNorm)稳定输入分布。
2. 计算效率优化
• 小批量训练:将数据分批次计算梯度,减少内存占用并加速收敛。
• 自动微分框架:如PyTorch和TensorFlow,自动构建计算图并高效求导。
四、实际应用示例
以三层神经网络为例:
- 输入层到隐藏层:计算 z 1 = W 1 x + b 1 z_1 = W_1x + b_1 z1=W1x+b1,激活输出 a 1 = σ ( z 1 ) a_1 = \sigma(z_1) a1=σ(z1)。
- 隐藏层到输出层:计算 z 2 = W 2 a 1 + b 2 z_2 = W_2a_1 + b_2 z2=W2a1+b2,输出 p = Softmax ( z 2 ) p = \text{Softmax}(z_2) p=Softmax(z2)。
- 反向传播:从输出层梯度 δ 2 = p − y \delta_2 = p - y δ2=p−y 开始,逐层计算 δ 1 = ( W 2 T δ 2 ) ⊙ σ ′ ( z 1 ) \delta_1 = (W_2^T \delta_2) \odot \sigma'(z_1) δ1=(W2Tδ2)⊙σ′(z1),最终更新 W 1 W_1 W1 和 W 2 W_2 W2。
总结
反向传播通过链式法则将误差信号从输出层回传至输入层,并结合优化算法调整参数。其核心在于高效计算梯度并解决深层网络的稳定性问题。