手推反向传播:单层神经网络的矩阵求导指南

创建时间:2026-07-21 更新时间:2026-07-22 阅读次数:1004 次

深度学习框架能帮我们自动计算梯度,但“能算”和“真懂”之间,隔着一个亲手推导的距离。今天,我们就用最核心的线性代数知识,把这件事彻底讲清楚。

1、搭建最简单的网络

我们构造一个极简回归任务:

  • 输入:一个样本,3个特征,记作列向量 $\mathbf{x} \in \mathbb{R}^{3 \times 1}$
  • 标签:一个真实值,标量 $y$
  • 模型:单层全连接网络,无激活函数(线性单元)

模型的前向传播为:

$$\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}}$。

2、链式法则:梯度流动的路线图

反向传播的核心是链式法则。想求得 $\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$,它是标量。它告诉我们,当前预测值比真实值大多少。

3、矩阵求导核心:攻克 $\frac{\partial \mathcal{L}}{\partial \mathbf{W}}$

这是最需细品的部分。我们的数学工具是矩阵微积分

根据链式法则,梯度可以写成:

$$\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}$ 的转置。 这就是我们推导出的核心公式。它表明:权重的梯度,等于误差信号乘以输入数据。 输入越大,对应连接的权重更新幅度就越大。

4、顺流而下:计算 $\frac{\partial \mathcal{L}}{\partial \mathbf{b}}$

偏置的推导思路相同,更为简单。同样链式分解:

$$\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$。

5、从标量到矩阵:推广到多输出

如果你的单层网络输出有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}$ 的形状完美吻合。

6、总结:记住这幅图景

这次推导揭示了一个生动的几何直观:反向传播就是“误差信号”在“输入数据”上的加权分配。

当你看到公式:

$$\frac{\partial \mathcal{L}}{\partial \mathbf{W}} = \mathbf{\delta} \cdot \mathbf{x}^T$$

脑海里可以浮现出:

每一个权重的梯度,都由它连接的那个输入神经元的激活值,与它传递的误差信号的乘积决定。

至此,我们没用任何框架,仅凭链式法则和矩阵求导,就完整推导了单层网络的梯度。这正是理解所有复杂深层网络反向传播的基石,它们只是把这个过程沿着更长、更复杂的计算图重复应用而已。

本教程共19节,当前为第18节!
本教程最新修订时间为:2026-07-22 00:39:56