本文针对最经典的多层前馈神经网络(多层感知机,MLP)的核心训练逻辑——反向传播算法进行完整推导,推导过程默认读者具备基础的线性代数与微积分知识。
## 一、前置符号约定
为避免推导过程中符号歧义,先统一约定所有变量定义:
1. 网络共包含L层,l=0为输入层,l=L为输出层,中间层为隐藏层;
2. 第l层的神经元数量为$n_l$,权重矩阵$W^l \in R^{n_l \times n_{l-1}}$,其中$W^l_{i,j}$表示第l-1层第j个神经元到第l层第i个神经元的权重;
3. 第l层的偏置向量$b^l \in R^{n_l \times 1}$;
4. 第l层的线性输出(激活前值)$z^l \in R^{n_l \times 1}$,激活后输出$a^l \in R^{n_l \times 1}$;
5. $\sigma(\cdot)$为激活函数,逐元素作用于向量;
6. 单个样本的真实标签为$y \in R^{n_L \times 1}$,损失函数$J$为衡量预测值$a^L$与真实标签$y$偏差的标量函数,本文以回归任务常用的均方误差损失为例,即$J = \frac{1}{2} ||a^L – y||_2^2$,系数$\frac{1}{2}$用于抵消求导产生的常数项。
## 二、前向传播流程推导
前向传播是从输入到输出的计算过程,核心是逐层完成线性变换+非线性激活的组合,逐层递推公式如下:
对于第l层(l≥1),有:
$$z^l = W^l a^{l-1} + b^l \tag{1}$$
$$a^l = \sigma(z^l) \tag{2}$$
其中输入层的输出$a^0$就是输入样本$x$。
举个简单的2层网络(1层隐藏层+1层输出层)为例:输入$x=a^0$,经过隐藏层计算得$z^1=W^1a^0+b^1$、$a^1=\sigma(z^1)$,再经过输出层计算得$z^2=W^2a^1+b^2$、$a^2=\sigma(z^2)$,最终损失$J=\frac{1}{2}||a^2 – y||^2$。
## 三、反向传播核心推导
反向传播的目标是计算损失$J$对所有参数$W^l$、$b^l$的梯度,再通过梯度下降法更新参数。整个过程基于链式求导法则,核心是先定义每层的残差$\delta^l = \frac{\partial J}{\partial z^l}$(损失对该层激活前线性输出的偏导),再通过残差快速计算参数梯度。
### 1. 输出层残差$\delta^L$推导
输出层是反向传播的起点,残差直接由损失和输出层激活的导数计算:
$$\delta^L = \frac{\partial J}{\partial z^L} = \frac{\partial J}{\partial a^L} \cdot \frac{\partial a^L}{\partial z^L}$$
代入均方误差损失的偏导$\frac{\partial J}{\partial a^L} = a^L – y$,以及激活函数的逐元素导数$\frac{\partial a^L}{\partial z^L} = \sigma'(z^L)$,可得:
$$\delta^L = (a^L – y) \odot \sigma'(z^L) \tag{3}$$
其中$\odot$为哈达玛积,表示两个维度相同的向量逐元素相乘。
### 2. 隐藏层残差递推公式推导
对于任意隐藏层l(1≤l