深度学习框架能帮我们自动计算梯度,但“能算”和“真懂”之间,隔着一个亲手推导的距离。今天,我们就用最核心的线性代数知识,把这件事彻底讲清楚。
我们构造一个极简回归任务:
模型的前向传播为:
$$\hat{y} = \mathbf{W} \mathbf{x} + \mathbf{b}$$
其中权重矩阵 $\mathbf{W} \in \mathbb{R}^{1 \times 3}$,偏置 $\mathbf{b} \in \mathbb{R}^{1 \times 1}$,模型输出 $\hat{y}$ 是一个标量。
因为输出是1维,所以权重 $\mathbf{W}$ 在这里是行向量。这种视角能让我们充分练习矩阵运算。
我们定义均方误差作为损失函数:
$$\mathcal{L} = \frac{1}{2} (\hat{y} - y)^2$$
目标很明确:求出损失 $\mathcal{L}$ 对权重 $\mathbf{W}$ 和偏置 $\mathbf{b}$ 的梯度,即 $\frac{\partial \mathcal{L}}{\partial \mathbf{W}}$ 和 $\frac{\partial \mathcal{L}}{\partial \mathbf{b}}$。
反向传播的核心是链式法则。想求得 $\frac{\partial \mathcal{L}}{\partial \mathbf{W}}$,我们需要沿着 $\mathbf{W} \rightarrow \hat{y} \rightarrow \mathcal{L}$ 这条路径,让梯度流过。
我们需要先计算一个关键中间量:损失对模型输出的梯度。
$$\frac{\partial \mathcal{L}}{\partial \hat{y}} = \frac{\partial}{\partial \hat{y}} \left( \frac{1}{2}(\hat{y} - y)^2 \right) = \hat{y} - y$$
记这个误差信号为 $\delta = \hat{y} - y$,它是标量。它告诉我们,当前预测值比真实值大多少。
这是最需细品的部分。我们的数学工具是矩阵微积分。
根据链式法则,梯度可以写成:
$$\frac{\partial \mathcal{L}}{\partial \mathbf{W}} = \frac{\partial \mathcal{L}}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial \mathbf{W}}$$
$\delta$ 已经是标量了,那 $\frac{\partial \hat{y}}{\partial \mathbf{W}}$ 是什么?我们已知 $\hat{y} = \mathbf{W}\mathbf{x} + \mathbf{b}$。把一个标量对一个矩阵求导,结果形状应与原矩阵一致,即 $1 \times 3$。
让我们用元素级的视角来推导。将行向量 $\mathbf{W}$ 写成 $[w_1, w_2, w_3]$,向量 $\mathbf{x}$ 写成 $[x_1, x_2, x_3]^T$。前向传播展开就是:
$$\hat{y} = w_1 x_1 + w_2 x_2 + w_3 x_3 + \mathbf{b}$$
现在,看梯度矩阵中的第一个元素,$\frac{\partial \mathcal{L}}{\partial w_1}$:
$$\frac{\partial \mathcal{L}}{\partial w_1} = \frac{\partial \mathcal{L}}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial w_1} = \delta \cdot x_1$$
类似地,$\frac{\partial \mathcal{L}}{\partial w_2} = \delta \cdot x_2$,$\frac{\partial \mathcal{L}}{\partial w_3} = \delta \cdot x_3$。
把这三个偏导数按 $\mathbf{W}$ 的形状排列,就得到了:
$$\frac{\partial \mathcal{L}}{\partial \mathbf{W}} = [\delta \cdot x_1, \ \delta \cdot x_2, \ \delta \cdot x_3]$$
这个结果恰好可以写成简洁的矩阵形式:
$$\frac{\partial \mathcal{L}}{\partial \mathbf{W}} = \delta \cdot \mathbf{x}^T$$
一个标量 $\delta$,乘以输入向量 $\mathbf{x}$ 的转置。 这就是我们推导出的核心公式。它表明:权重的梯度,等于误差信号乘以输入数据。 输入越大,对应连接的权重更新幅度就越大。
偏置的推导思路相同,更为简单。同样链式分解:
$$\frac{\partial \mathcal{L}}{\partial \mathbf{b}} = \frac{\partial \mathcal{L}}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial \mathbf{b}}$$
因为 $\hat{y} = \mathbf{W}\mathbf{x} + \mathbf{b}$,$\frac{\partial \hat{y}}{\partial \mathbf{b}}$ 就是 $1$。所以:
$$\frac{\partial \mathcal{L}}{\partial \mathbf{b}} = \delta \cdot 1 = \delta$$
偏置的梯度,就直接等于误差信号 $\delta$。
如果你的单层网络输出有2个值(比如二分类),$\hat{y}$ 变成了向量 $\hat{\mathbf{y}} \in \mathbb{R}^{2 \times 1}$,权重 $\mathbf{W} \in \mathbb{R}^{2 \times 3}$。
前向传播:
$$\hat{\mathbf{y}} = \mathbf{W}\mathbf{x} + \mathbf{b}$$
此时的梯度公式依然优雅:
$$\frac{\partial \mathcal{L}}{\partial \mathbf{W}} = \frac{\partial \mathcal{L}}{\partial \hat{\mathbf{y}}} \cdot \mathbf{x}^T$$
这里的 $\frac{\partial \mathcal{L}}{\partial \hat{\mathbf{y}}}$ 是一个 $2 \times 1$ 的误差向量 $\mathbf{\delta}$。一个列向量乘以一个行向量 $\mathbf{x}^T$,结果是 $2 \times 3$ 的矩阵,这和权重矩阵 $\mathbf{W}$ 的形状完美吻合。
这次推导揭示了一个生动的几何直观:反向传播就是“误差信号”在“输入数据”上的加权分配。
当你看到公式:
$$\frac{\partial \mathcal{L}}{\partial \mathbf{W}} = \mathbf{\delta} \cdot \mathbf{x}^T$$
脑海里可以浮现出:
每一个权重的梯度,都由它连接的那个输入神经元的激活值,与它传递的误差信号的乘积决定。
至此,我们没用任何框架,仅凭链式法则和矩阵求导,就完整推导了单层网络的梯度。这正是理解所有复杂深层网络反向传播的基石,它们只是把这个过程沿着更长、更复杂的计算图重复应用而已。