Series · ML Math Derivations · Chapter 19

机器学习数学推导(十九):神经网络与反向传播

神经网络如何学习?本文推导前向传播的矩阵形式、反向传播的链式法则逐层推导、梯度消失/爆炸的数学分析、以及 Xavier 和 He 初始化的方差保持策略。

本文概览

单个感知机连 XOR 都解决不了;把足够多的感知机用非线性激活叠起来,却能成为通用函数逼近器。剩下的问题只有一个:这样的网络如何从数据中学习?答案是反向传播——一次链式法则的精巧应用,借由一次"反向遍历"把所有中间结果重复利用。这套机制是过去四十年所有深度学习库的核心引擎。把它的数学讲清楚,会顺带回答两件事:为什么深层网络会出现梯度消失/爆炸,以及为什么权重初始化远比看上去讲究

你会学到:

  1. 感知机:模型、学习规则、收敛定理;
  2. 多层网络的前向传播矩阵形式;
  3. 反向传播:逐层推导链式法则,并搞清楚要缓存哪些量;
  4. 梯度消失与梯度爆炸的根源——一串雅可比矩阵相乘;
  5. Xavier 与 He 初始化:方差保持的推导,以及各自适用的激活函数。

预备知识: 微积分(链式法则、偏导数)、线性代数(矩阵乘法)、基础概率。


1. 感知机:一切的起点

1.1 模型

输入 $\mathbf{x}\in\mathbb{R}^d$、权重 $\mathbf{w}\in\mathbb{R}^d$、偏置 $b\in\mathbb{R}$,感知机计算

$$ z = \mathbf{w}^{T}\mathbf{x} + b, \qquad \hat{y} = \operatorname{sign}(z) = \begin{cases} +1 & z \geq 0,\\ -1 & z < 0.\end{cases} $$

几何上,方程 $\mathbf{w}^{T}\mathbf{x} + b = 0$ 是一个超平面,把输入空间一分为二,$\hat y$ 记录的是样本落在哪一侧。

1.2 学习规则

对一个被错分的样本 $(\mathbf{x}_i, y_i)$(即 $y_i(\mathbf{w}^{T}\mathbf{x}_i + b) \leq 0$),Rosenblatt 的更新公式是

$$ \mathbf{w} \leftarrow \mathbf{w} + \eta\, y_i\, \mathbf{x}_i, \qquad b \leftarrow b + \eta\, y_i. $$

这本质上是在感知机损失 $\sum_{i\in M} -y_i(\mathbf{w}^{T}\mathbf{x}_i + b)$ 上做随机次梯度下降,$M$ 是当前被错分的样本集合。

1.3 收敛定理

定理(Novikoff, 1962)。 若数据线性可分,即存在 $\mathbf{w}^{*}$ 与 $\gamma > 0$ 使得 $y_i\,\mathbf{w}^{*\,T}\mathbf{x}_i \geq \gamma$ 对所有 $i$ 成立,则感知机算法的更新次数不会超过

$$ \frac{\|\mathbf{w}^{*}\|^{2}\, R^{2}}{\gamma^{2}}, \qquad R = \max_i \|\mathbf{x}_i\|. $$

证明的思路是同时给 $\mathbf{w}_k^{T}\mathbf{w}^{*}$ 一个线性下界,给 $\|\mathbf{w}_k\|$ 一个 $\sqrt{k}$ 量级的上界,两者结合就把更新步数 $k$ 卡死了。

1.4 XOR 的尴尬

$(0,0)\!\to\!0$、$(0,1)\!\to\!1$、$(1,0)\!\to\!1$、$(1,1)\!\to\!0$ 这四个点不是线性可分的——没有任何一条直线能把对角的两对分开。Minsky 与 Papert 在 1969 年指出这一点后,连接主义的研究停滞了整整十年。直到多层网络出现,问题才变得平凡:画两条超平面,再做一次组合就行了。


2. 多层网络与前向传播

2.1 网络结构

多层感知机结构

前馈神经网络就是若干仿射变换逐元素非线性的交替:

  • 输入层: $\mathbf{h}^{(0)} = \mathbf{x}\in\mathbb{R}^{d_0}$;
  • 隐藏层: $\mathbf{h}^{(l)}\in\mathbb{R}^{d_l}$,$l = 1, \ldots, L-1$;
  • 输出层: $\mathbf{h}^{(L)} = \hat{\mathbf{y}}\in\mathbb{R}^{d_L}$。

2.2 前向传播(矩阵形式)

前向传播流程

第 $l$ 层做两件事:

$$ \mathbf{z}^{(l)} = \mathbf{W}^{(l)}\,\mathbf{h}^{(l-1)} + \mathbf{b}^{(l)}, \tag{1} $$$$ \mathbf{h}^{(l)} = \sigma\!\left(\mathbf{z}^{(l)}\right), \tag{2} $$

其中 $\mathbf{W}^{(l)}\in\mathbb{R}^{d_l\times d_{l-1}}$,$\mathbf{b}^{(l)}\in\mathbb{R}^{d_l}$。前向过程中要把 $\mathbf{h}^{(l-1)}$ 与 $\mathbf{z}^{(l)}$ 缓存下来,反向传播时正要用它们。

2.3 激活函数全家福

激活函数及其导数

函数公式导数备注
Sigmoid$\sigma(z) = \dfrac{1}{1+e^{-z}}$$\sigma(z)\bigl(1-\sigma(z)\bigr)$输出在 $(0,1)$;两端饱和导致梯度消失
Tanh$\tanh(z)$$1 - \tanh^{2}(z)$零中心化,比 sigmoid 强,但仍会饱和
ReLU$\max(0, z)$$\mathbb{1}[z > 0]$正区间梯度恒为 1;可能产生死神经元
Leaky ReLU$\max(\alpha z, z)$,$\alpha\!\approx\!0.01$$1$ 或 $\alpha$缓解死 ReLU
GELU$z\,\Phi(z)$平滑、近 $0$ 处呈钟形Transformer 的默认选择
Swish$z\,\sigma(z)$$\sigma(z) + z\,\sigma(z)(1-\sigma(z))$自门控、平滑

图右侧把一个事实摆在了眼前:sigmoid 的导数最大也只有 $0.25$,而 ReLU 在激活区间内的导数恒等于 $1$。这一点点差距,决定了下面整章的故事走向。

2.4 通用逼近定理

通用逼近:单隐层 ReLU MLP 拟合不同目标函数

定理(Cybenko 1989;Hornik 1991)。 对紧集上任意连续函数 $f$ 和任意 $\varepsilon > 0$,都存在某个单隐层网络

$$ g(\mathbf{x}) = \sum_{j=1}^{M} v_j\, \sigma\!\left(\mathbf{w}_j^{T}\mathbf{x} + b_j\right) $$

满足 $\|f - g\|_\infty < \varepsilon$。上图正是这个定理的可视化:一个 64 单元的 ReLU 单隐层网络,能够同时逼近一段平滑的正弦、一条绝对值折线、甚至一个不连续的阶跃。

注意。 这只是存在性结果:它没说 $M$ 要多大,更没说梯度下降一定能找到好的 $g$。实践中深度比宽度更高效——一个深度为 $L$ 的网络可以表达需要宽度 $\Omega(2^{L})$ 的函数(Telgarsky, 2016)。


3. 反向传播:把链式法则用到极致

3.1 损失函数

回归任务通常用均方误差:

$$ \mathcal{L} = \tfrac{1}{2}\,\bigl\|\hat{\mathbf{y}} - \mathbf{y}\bigr\|^{2}. $$

分类任务通常用 softmax + 交叉熵:

$$ \mathcal{L} = -\sum_{c} y_c \log \hat{y}_c, \qquad \hat{\mathbf{y}} = \operatorname{softmax}(\mathbf{z}^{(L)}). $$

3.2 核心思想

反向传播梯度流

我们要算的是每一层的 $\partial\mathcal{L}/\partial\mathbf{W}^{(l)}$ 与 $\partial\mathcal{L}/\partial\mathbf{b}^{(l)}$。如果对每个参数都从输出回算一遍,复杂度是 $\mathcal{O}(P^2)$($P$ 是参数总数)。反向传播的关键洞察是:所有梯度共享同一段从输出到该层的"后缀路径"。只要每层算一个误差信号 $\boldsymbol{\delta}^{(l)}$,所有参数梯度就能用一个外积一次性补齐。复杂度直接降到 $\mathcal{O}(P)$。

3.3 误差信号的递推

定义第 $l$ 层的误差信号:

$$ \boldsymbol{\delta}^{(l)} \;=\; \frac{\partial \mathcal{L}}{\partial \mathbf{z}^{(l)}}. \tag{3} $$

输出层($l = L$,softmax + 交叉熵)。 把 $\partial\hat{\mathbf{y}}/\partial \mathbf{z}^{(L)}$ 算开,再用 $\sum_c y_c = 1$ 化简,会出现一个漂亮的结果:

$$ \boldsymbol{\delta}^{(L)} \;=\; \hat{\mathbf{y}} - \mathbf{y}. \tag{4} $$

预测减真值——这就是 softmax + 交叉熵被定为分类标配的核心原因之一。

隐藏层的反向递推。 对 $l < L$,把 $\mathbf{z}^{(l+1)} = \mathbf{W}^{(l+1)}\sigma(\mathbf{z}^{(l)}) + \mathbf{b}^{(l+1)}$ 代入链式法则:

$$ \boldsymbol{\delta}^{(l)} \;=\; \bigl(\mathbf{W}^{(l+1)\,T}\boldsymbol{\delta}^{(l+1)}\bigr) \,\odot\, \sigma'\!\left(\mathbf{z}^{(l)}\right). \tag{5} $$

直观理解:把上一层的误差用转置权重矩阵推回来,再用本层的激活导数逐元素门控

3.4 参数梯度

拿到所有 $\boldsymbol{\delta}^{(l)}$ 之后,参数梯度就是顺手一步外积:

$$ \frac{\partial \mathcal{L}}{\partial \mathbf{W}^{(l)}} \;=\; \boldsymbol{\delta}^{(l)}\, \mathbf{h}^{(l-1)\,T}, \tag{6} $$$$ \frac{\partial \mathcal{L}}{\partial \mathbf{b}^{(l)}} \;=\; \boldsymbol{\delta}^{(l)}. \tag{7} $$

每一层的权重梯度,都是输出端的误差信号输入端的激活值之外积。后者正是前向时缓存下来的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
def backprop(X, y, weights, biases, activations):
    """前馈网络的一次前向 + 一次反向。"""
    L = len(weights)

    # 前向传播 —— 缓存激活值与预激活
    h = [X]
    z = []
    for l in range(L):
        z_l = weights[l] @ h[-1] + biases[l]
        z.append(z_l)
        h.append(activations[l](z_l))

    # 反向传播 —— 假设输出端是 softmax + 交叉熵
    delta = h[-1] - y
    grad_W = [None] * L
    grad_b = [None] * L
    for l in range(L - 1, -1, -1):
        grad_W[l] = delta @ h[l].T
        grad_b[l] = delta.sum(axis=1, keepdims=True)
        if l > 0:
            delta = (weights[l].T @ delta) * activations[l].deriv(z[l - 1])
    return grad_W, grad_b

整套算法本质上只有三行:一次外积、一次求和、一次"转置矩阵-向量乘 + 激活导数门控"。现代 autograd 框架替我们打理记账,但内部跑的就是这套递推。


4. 梯度消失与梯度爆炸

4.1 梯度消失

把 (5) 式从第 $L$ 层一路展开到第 $1$ 层,可以看出:第 $1$ 层的梯度是 $L-1$ 个雅可比类因子的连乘

$$ \frac{\partial \mathcal{L}}{\partial \mathbf{W}^{(1)}} \;\propto\; \prod_{l=2}^{L} \Bigl[\mathbf{W}^{(l)\,T}\, \operatorname{diag}\bigl(\sigma'(\mathbf{z}^{(l-1)})\bigr)\Bigr]. $$

对 sigmoid,$\sigma'(z)\leq 0.25$。如果每个权重矩阵的谱范数在 $1$ 附近,第 $1$ 层梯度的量级大约就是 $0.25^{L-1}$。$L=20$ 时约为 $3.6\times 10^{-12}$——梯度更新在数值上就是零,浅层永远学不动。

4.2 梯度爆炸

把不等号反过来:如果权重谱范数大于 $1$ 而激活导数没有强收缩,同一连乘就会指数增长。几百步就溢出了。RNN 之所以特别容易爆炸,是因为同一个权重矩阵会被乘上 $T$ 次(按时间展开)。

4.3 把曲线读出来

梯度范数随深度的变化

上图把这件事用数值跑了一遍:把一个单位误差信号从输出端反传到第 $1$ 层,比较不同设置下的梯度范数随深度的变化。Sigmoid(即使用 Xavier 初始化)每加一层就跌一个数量级;ReLU + He 初始化几乎稳定在 $1$ 附近;ReLU + 不缩放则反向爆炸。注意 y 轴是对数坐标——每条网格线就是十倍。

4.4 解决方案一览

问题方案起作用的原理
消失ReLU 激活正区间 $\sigma'(z) = 1$,没有指数衰减
消失残差连接$\mathbf{h}^{(l)} = \mathbf{h}^{(l-1)} + F(\mathbf{h}^{(l-1)})$,梯度有一条恒等通路绕过非线性
消失批归一化稳定每层激活的分布
爆炸梯度裁剪当 $\|\mathbf{g}\| > c$ 时按 $\mathbf{g}\!\leftarrow\!(c/\|\mathbf{g}\|)\,\mathbf{g}$ 重新缩放
两者合理初始化让激活与梯度的方差跨层保持稳定(见下一节)

5. 权重初始化策略

5.1 为什么初始化要那么讲究

  • 全零初始化。 同层的所有神经元在做同一件事,收到的梯度也一模一样,对称性根本破不开。
  • 太大。 预激活掉进激活函数的饱和尾巴,梯度归零。
  • 太小。 激活值往 $0$ 收缩,信号在前向过程中就消失了。

我们想做的事很明确:让激活与梯度的方差跨层保持稳定。具体的尺度,由该层的 fan-in 与所选激活共同决定。

5.2 Xavier(Glorot)初始化

考察第 $l$ 层中的一个神经元,fan-in 为 $n_{\text{in}}$,fan-out 为 $n_{\text{out}}$:

$$ z_j = \sum_{i=1}^{n_{\text{in}}} w_{ji}\, h_i. $$

若 $w_{ji}$ 与 $h_i$ 独立、零均值,则

$$ \operatorname{Var}(z_j) = n_{\text{in}}\cdot \operatorname{Var}(w)\cdot \operatorname{Var}(h). $$

要求前向时 $\operatorname{Var}(z) = \operatorname{Var}(h)$,得到 $\operatorname{Var}(w) = 1/n_{\text{in}}$;同样的分析在反向上要求 $\operatorname{Var}(w) = 1/n_{\text{out}}$。Glorot 与 Bengio(2010)取了一个折中:

$$ \operatorname{Var}(w) = \frac{2}{n_{\text{in}} + n_{\text{out}}}, \qquad w \sim \mathcal{U}\!\left(-\sqrt{\tfrac{6}{n_{\text{in}}+n_{\text{out}}}},\; \sqrt{\tfrac{6}{n_{\text{in}}+n_{\text{out}}}}\right). \tag{8} $$

适用于 Sigmoid、Tanh 这类对称激活。

5.3 He 初始化

ReLU 的特殊之处在于:期望意义上有一半的单元被置零,$h$ 的方差贡献就被砍掉一半。He 等人(2015)因此把方差再放大两倍:

$$ \operatorname{Var}(w) = \frac{2}{n_{\text{in}}}, \qquad w \sim \mathcal{N}\!\left(0,\, \tfrac{2}{n_{\text{in}}}\right). \tag{9} $$

适用于 ReLU 及其变体

5.4 总结表

激活函数初始化$\operatorname{Var}(w)$
Sigmoid / TanhXavier$\dfrac{2}{n_{\text{in}} + n_{\text{out}}}$
ReLUHe$\dfrac{2}{n_{\text{in}}}$
Leaky ReLU($\alpha$)He(修正版)$\dfrac{2}{(1 + \alpha^{2})\, n_{\text{in}}}$

上一节梯度图里的绿色曲线(ReLU + He)就是这套理论的实验佐证:它是唯一一条不论深度多深都接近 $1$ 的曲线。


6. 损失曲面长什么样

非凸损失曲面与 SGD 轨迹

哪怕是一个微型网络,损失曲面也是高度非凸的:两个深盆地、一个鞍点、一道小脊。上图把 SGD 从一个不太好的初始位置出发的轨迹画了出来。两个定性事实值得记住:

  1. 大多数局部最优都"够好"。 网络越宽,经验损失的极小值点往往集中在一组深度相近的平坦盆地里(Choromanska et al., 2015)。“必须找全局最优"的执念是凸优化时代的遗产,在深度学习里并不成立。
  2. 高维空间里鞍点远多于局部最优。 在 $\mathbb{R}^d$ 中,一个随机临界点的 Hessian 所有 $d$ 个特征值同号的概率指数级地小。SGD 自带的噪声,恰好帮我们逃出这些鞍点(Dauphin et al., 2014)。

这两点也解释了:尽管缺乏凸性保证,简单的一阶方法至今仍主导着深度学习。


7. 练习题

练习 1(链式法则)。 设 $y = \sigma(wx + b)$,$\sigma(z) = 1/(1+e^{-z})$,求 $\partial y/\partial w$。

解答。 $\partial y/\partial w = \sigma'(z)\,x = \sigma(z)\bigl(1 - \sigma(z)\bigr)\,x$。

练习 2(梯度消失)。 为何 sigmoid 容易造成梯度消失,而 ReLU 不会?

解答。 $\sigma'(z)\leq 0.25$ 恒成立,$L$ 层连乘最多就是 $0.25^{L}$,指数衰减。ReLU 在激活区间内导数恒为 $1$,没有指数衰减。

练习 3(批归一化)。 BatchNorm 为何能加速训练?

解答。 把每层的预激活拉回到大致零均值、单位方差,稳定了梯度量级,从而允许更大学习率;mini-batch 自带的噪声还附带一点正则化效果。

练习 4(Dropout 在测试时)。 训练时使用 $p = 0.5$ 的 dropout,测试时如何处理?

解答。 测试时保留所有神经元,但把权重乘以 $(1 - p) = 0.5$ 以保持期望输出不变。多数现代库用反向 dropout:训练时除以 $(1-p)$,测试时不做任何调整。

练习 5(Xavier)。 为什么 Xavier 取 $\operatorname{Var}(w) = 2/(n_{\text{in}} + n_{\text{out}})$?

解答。 前向方差守恒要求 $n_{\text{in}}\operatorname{Var}(w) = 1$;反向方差守恒要求 $n_{\text{out}}\operatorname{Var}(w) = 1$。一种调和式折中 $\operatorname{Var}(w) = 2/(n_{\text{in}} + n_{\text{out}})$ 同时近似满足两者。


参考文献

[1] Rosenblatt, F. (1958). The perceptron: A probabilistic model for information storage and organization in the brain. Psychological Review, 65(6), 386–408.

[2] Rumelhart, D. E., Hinton, G. E., & Williams, R. J. (1986). Learning representations by back-propagating errors. Nature, 323(6088), 533–536.

[3] Cybenko, G. (1989). Approximation by superpositions of a sigmoidal function. Mathematics of Control, Signals and Systems, 2(4), 303–314.

[4] Hornik, K. (1991). Approximation capabilities of multilayer feedforward networks. Neural Networks, 4(2), 251–257.

[5] Glorot, X., & Bengio, Y. (2010). Understanding the difficulty of training deep feedforward neural networks. AISTATS, 249–256.

[6] He, K., Zhang, X., Ren, S., & Sun, J. (2015). Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification. ICCV, 1026–1034.

[7] Ioffe, S., & Szegedy, C. (2015). Batch normalization: Accelerating deep network training by reducing internal covariate shift. ICML, 448–456.

[8] Dauphin, Y., Pascanu, R., Gulcehre, C., Cho, K., Ganguli, S., & Bengio, Y. (2014). Identifying and attacking the saddle point problem in high-dimensional non-convex optimization. NeurIPS.

[9] Choromanska, A., Henaff, M., Mathieu, M., Ben Arous, G., & LeCun, Y. (2015). The loss surfaces of multilayer networks. AISTATS.

[10] Telgarsky, M. (2016). Benefits of depth in neural networks. COLT.

[11] Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press. (第 6 章:深度前馈网络)


系列导航

Liked this piece?

Follow on GitHub for the next one — usually one a week.

GitHub