反向传播

反向传播、损失设计与深度学习的表征学习核心

Posted by CloudingYu on March 20, 2026

一、梯度下降的深入理解

1.1 回顾:梯度下降的数学本质

从一阶泰勒展开重新推导梯度下降:

机器学习的目标是调整参数 $\theta$ 使损失函数 $L(\theta)$ 变小。给定当前参数,我们要找一个 $\Delta\theta$ 使得 $L(\theta + \Delta\theta) < L(\theta)$。

由泰勒一阶展开:

\[L(\theta + \Delta\theta) \approx L(\theta) + \nabla L(\theta)^T \Delta\theta\]

取 $\Delta\theta = -\eta \nabla L(\theta)$,代入得:

\[L(\theta + \Delta\theta) - L(\theta) \approx -\eta \|\nabla L(\theta)\|^2 \leq 0\]

因为范数平方 $|\nabla L(\theta)|^2$ 始终大于零,乘上 $-\eta$ 后一定 $\leq 0$,所以损失函数值一定下降。

2.2 学习率为什么必须足够小

关键:$\eta$ 一定要足够小。因为泰勒展开只是一阶估计,后面还有二阶项(含 Hessian 矩阵)和高阶项。如果 $\eta$ 太大,高阶项累积的影响可能超过一阶项,导致损失不降反升。

这个问题叫 ill-conditioning(病态条件)问题——在优化中经常出现,二阶项的影响可能比一阶项更大,使得不等式不成立。

\[L(\theta + \Delta\theta) = L(\theta) + \nabla L^T \Delta\theta + \frac{1}{2}\Delta\theta^T H \Delta\theta + \cdots\]

2.3 下山法的直觉

比喻:梯度下降就像在一个山上要下山——我眼睛所及的方向去估计东南西北哪个方向下山最快。这个方向估计就是一阶估计。朝这个方向走一步,到新地方后再重新估计,再走一步。所谓”目光所及”就是我一阶估计能看到的范围,走太远就看不到了。

三、反向传播算法

3.1 三层网络的结构

以三层网络为例:

  • 输入层:$X_i$(原始特征)
  • 隐藏层:先计算净输入 $V_j = \sum_i W_{ji} X_i$,再过一个非线性激活函数(如 sigmoid)得到 $h_j = \sigma(V_j)$
  • 输出层:线性组合 $A_k = \sum_j W_{kj} h_j$,再用激活函数得到 $Y_k$

把计算分成两步(净输入 + 激活)的原因:净输入这个概念对理解反向传播和写代码非常重要。

3.2 净输入与激活值

净输入(net input):神经元收到的刺激总和,未经过非线性变换之前的值。

\[\text{净输入} \xrightarrow{\text{非线性函数}} \text{激活输出}\]

这个区分使得梯度计算结构清晰。

3.3 回归任务的配置

回归任务中:

  • 最后一层激活函数:恒等变换(identity,即 $f(x)=x$)
  • 损失函数:平方误差损失(squared loss)
\[L = \frac{1}{2}\sum_k (Y_k - T_k)^2\]

为什么回归不用 sigmoid?因为 sigmoid 是挤压函数(squashing function),将输出压缩到 $(0,1)$,而回归任务的拟合目标取值可能很广,不能被限制在这个区间。

加上恒等变换是为了统一形式——每一个模块都是”线性组合 + 非线性变换”,最后一层只不过非线性变换是恒等函数。

3.4 输出层误差 $\delta_k$ 与隐藏层误差 $\delta_j$

定义输出层误差:

\[\delta_k = \frac{\partial L}{\partial Y_k} = Y_k - T_k\]

这个 $\delta_k$ 的直观含义:如果 $\delta_k > 0$(实际输出 > 目标输出),梯度为正,调整方向为负——要减少输出值。反之亦然。

定义隐藏层误差 $\delta_j$——损失函数对隐藏层净输入 $V_j$ 的导数:

\[\delta_j = \left(\sum_k \delta_k W_{kj}\right) \cdot \sigma'(V_j)\]

解读:$\delta_j$ 衡量的是这个隐藏层神经元净输入的变化对最终损失函数的影响——即这个神经元的敏感性。$\delta_j$ 越大,说明这个神经元对最终损失的影响越大。

3.5 核心公式:梯度 = 误差 × 输入

关键:这是写代码时最好用的公式。求某条权重边 $W$ 的梯度,只需看它箭头指向那端的 $\delta$ 乘以它的输入。

对于输出层权重 $W_{kj}$:

\[\frac{\partial L}{\partial W_{kj}} = \delta_k \cdot h_j\]

对于隐藏层权重 $W_{ji}$:

\[\frac{\partial L}{\partial W_{ji}} = \delta_j \cdot X_i\]

偏置(bias)的梯度就是对应的 $\delta$(因为 bias 的输入恒为 1)。

总结:写代码时,你只要小心翼翼地把每一层的 $\delta$ 算出来,整层的权重梯度就是 $\delta$ 乘以该层的输入。一层层往前算,代码结构非常清晰,也便于调试。

3.6 有向图视角

神经网络本质上是一个有向图(有向无环图)。正向传播沿箭头方向计算,反向传播沿箭头反方向用链式法则求梯度。这个视角引出了自动微分(automatic differentiation)——深度学习框架正是利用计算图自动求每个节点的梯度。

要点:符号微分听起来很玄,实际上就是自动把神经网络每个节点的梯度算出来。这正是 PyTorch/TensorFlow 等框架能让我们方便地写神经网络的原因。

四、分类任务与 Softmax

4.1 分类任务的配置

分类任务采用不同的损失函数-激活函数配合:

任务类型 最后一层激活函数 损失函数
回归 恒等变换(identity) 平方误差损失(MSE)
分类 Softmax 交叉熵(Cross-Entropy)

4.2 Softmax 与交叉熵的配合推导

Softmax 函数定义:

\[Y_k = \frac{\exp(A_k)}{\sum_s \exp(A_s)}\]

交叉熵损失:

\[L = -\sum_k T_k \log Y_k\]

其中 $T_k$ 是 one-hot 编码的目标分布(正确类别为 1,其余为 0)。

4.3 Softmax 导数推导的关键技巧

推导 $\frac{\partial Y_s}{\partial A_k}$ 时分两种情况:

  • 当 $s = k$:$\frac{\partial Y_k}{\partial A_k} = Y_k(1 - Y_k)$
  • 当 $s \neq k$:$\frac{\partial Y_s}{\partial A_k} = -Y_s Y_k$

将两项合并后,利用 $\sum_s T_s = 1$(目标分布和为 1),最终得到非常简洁的结果:

总结:不论是回归还是分类,最后一层的输出误差形式统一都是:

\[\delta_k = Y_k - T_k\]

这个统一形式的前提条件是:回归用 MSE + 恒等激活,分类用交叉熵 + Softmax。两者必须正确配对。

这个统一优雅的形式大大简化了代码编写——不管你做什么任务,最后一层梯度计算方法完全一致。

五、通用近似定理

5.1 神经网络为什么能拟合任意函数

用矩形波逼近的思想解释通用近似定理(Universal Approximation Theorem):

  1. 一个隐层神经元配合 sigmoid 激活函数,可以产生一个类似阶跃函数的输出
  2. 两个这样的神经元相减,可以构造出一个矩形波(在某区间内高、其余地方低)
  3. 无数多个不同位置的矩形波可以拼接成任意函数形状

这类似于傅里叶级数用正弦波叠加任意波形——神经网络用矩形波叠加任意函数。

说明:从数学上讲,用黎曼近似的思想,足够多的矩形的方块就能逼近任意函数。严格的泛函分析证明比较复杂,但直觉就是这样。

5.2 定理的局限

要点:通用近似定理只告诉我们”存在一组参数可以拟合”,但它没有告诉我们怎么找到这组参数。我们唯一的有效算法是反向传播,而反向传播容易陷入局部最小值、对初始值异常敏感。

六、损失函数曲面的几何特征

6.1 三种典型地形

损失函数曲面的三种常见问题:

地形 英文 特征 导致的问题
悬崖 Cliff 局部梯度范数极大 梯度爆炸(Gradient Explosion)
平坦区域 Plateau 曲面非常平坦,梯度接近 0 梯度消失(Gradient Vanishing)
鞍点 Saddle Point 某些方向是极小值,某些方向是极大值,梯度全为零 训练停滞

解释:悬崖就像突然掉下去——不像 smooth 的慢慢降,而是”啪”一下子就掉下去了。而 Plateau 会让网络在平坦区域几乎停滞不前。

6.2 Mini-batch 为什么有效

说明:为什么我们要用 mini-batch 随机采一个批量来估计梯度?因为 mini-batch 引入了梯度噪声。在鞍点处,全量梯度为零,网络会被困住。但 mini-batch 的梯度噪声会让参数发生随机挪移——一旦挪出鞍点区域,就可以继续下降。

同样,噪声也帮助逃离平坦区域。后续课程会讲到动量方法(Momentum)——就是为了让参数尽快从平坦区域冲出去。

6.3 Hessian 矩阵与收敛判定

如何严格证明一个神经网络已经收敛到局部最小值?

  1. 看损失函数值是否足够小(不充分)
  2. 看各参数梯度是否接近零(不充分)
  3. 充分条件Hessian 矩阵正定(所有顺序主子式 > 0)

用简化的三层网络展示了 Hessian 矩阵正定的验证过程。如果 Hessian 正定,则参数空间的任何微小扰动都会使损失函数增大——这就是局部最小值的严格定义。

6.4 参数空间的对称性

注意:神经网络参数空间有对称性——交换隐藏层两个神经元的所有连入权重、连出权重和偏置,网络的输出和损失函数完全不变,但参数配置不同。

这意味着:如果存在一个局部最小值,通过神经元置换一定可以找到另一个参数配置完全不同的局部最小值。神经网络的最优解不是唯一的

七、表示学习:深度学习的核心思想

7.1 从颜色编码到语义表示

用一个图像分割的例子引出表示学习的思想:

假设有四种颜色(绿、棕、蓝、白),用不同的编码方式表示。在某种编码下,所有颜色在欧氏空间中的距离都一样——你无法先合并树冠(绿)和树干(棕)。但如果你用任务驱动的方式重新编码,让语义相似的颜色的编码在空间中更近,分割就容易了。

关键:请注意这一点——后面对理解大语言模型都非常有帮助。

7.2 One-hot 编码的局限

传统的文字表示方法——独热编码(One-Hot Encoding):每个字是一个 2500 维向量(对常用汉字),只有一位是 1,其余全为 0。

独热编码的致命问题:所有字之间的距离都一样。你看到”猫躺在床上”,永远无法泛化到”狗站在树下”——因为”猫”和”狗”、”躺”和”站”的编码没有任何关系。

7.3 分布式表示

深度学习的做法:将每个字变成一个紧凑的向量(如 50 维或 100 维),通过任务自动学习。在这个空间中:

  • 语义或语法功能相似的字距离更近
  • 距离代表语义相似度

总结:深度学习真正的理论启发是什么?我们要去学表示——学一个紧凑空间中的表示。这个表示要对任务有帮助,而且要有良好的几何结构。以前的研究者从未考虑这件事——他们假定编码已经给定,死硬地用更复杂的模型提升性能。而深度学习去改最初的编码

7.4 课程框架

深度学习的学习内容可概括为三部分:

  1. 损失函数设计:为特定任务设计损失函数(分类、回归、生成……),损失可能不止一项
  2. 网络结构:前馈网络(感知机)、卷积神经网络(CNN)、循环神经网络(RNN)……
  3. 优化方法:SGD、动量、Adam 等

这三部分学完,深度学习的核心框架就完全掌握了。

八、逻辑回归:从二分类到 Softmax

8.1 似然函数

逻辑回归的建模从似然函数(Likelihood Function)出发。对于一个二分类问题(标签 $T_i \in {0, 1}$):

一个好的模型应该让标签为 1 的样本输出概率大,标签为 0 的样本输出概率小。单个样本的似然可以写为:

\[P(T_i \mid X_i) = Y_i^{T_i} \cdot (1 - Y_i)^{1 - T_i}\]
  • 当 $T_i = 1$:只剩 $Y_i$(希望 $Y_i$ 大)
  • 当 $T_i = 0$:只剩 $1 - Y_i$(希望 $Y_i$ 小)

对所有样本连乘(基于独立同分布假设),得到似然函数。

8.2 从似然到交叉熵

连乘在数学上难以处理(样本间产生耦合)。取对数(单调递增函数,不改变最优点)将其变成连加:

\[\log L = \sum_i \left[ T_i \log Y_i + (1 - T_i) \log(1 - Y_i) \right]\]

最大化对数似然 = 最小化负对数似然 = 交叉熵损失

8.3 对数几率与 Sigmoid 的推导

逻辑回归的经典建模思路如下:

考虑两个类别概率的比值(odds),取对数得到 log-odds

\[\log\frac{Y}{1-Y}\]

希望用一个最简单的形式——输入特征的线性组合——来建模 log-odds:

\[\log\frac{Y}{1-Y} = \theta_0 + \theta_1 X_1 + \cdots + \theta_D X_D\]

从中反解出 $Y$:

\[Y = \frac{1}{1 + \exp(-(\theta_0 + \sum_{d=1}^D \theta_d X_d))} = \sigma(\theta^T X)\]

这就是 Sigmoid 函数的来源——不是凭空设计的,而是从”用线性模型建模 log-odds”这个朴素想法反推出来的。

要点:当时的数学家想用一种最简单的线性组合方式去解决二分类问题——”能用线性模型描述的东西绝不用更复杂的东西”。逻辑回归(Logistic Regression)虽然叫”回归”,实际上是一个二分类模型。

8.4 从二分类到多分类:Softmax

多分类的推广思路:把线性输出 $f_k(X)$ 用 $\exp$ 提升,分母是所有类别的 $\exp$ 之和,得到概率分布:

\[Y_k = \frac{\exp(f_k(X))}{\sum_j \exp(f_j(X))}\]

这就是 Softmax。再配合交叉熵损失,和神经网络的最后一层完美对接。

九、本章主线总结

  1. 梯度下降的数学根基:一阶泰勒展开 → 为什么负梯度方向能下降 → 为什么学习率要小(ill-conditioning)
  2. 反向传播的核心:三层网络结构 → 净输入与激活的区分 → $\delta_k$ 和 $\delta_j$ 的递推 → “梯度 = 误差 × 输入”的简洁公式 → 有向图/自动微分的统一视角
  3. 损失函数与激活函数的配合:回归 = MSE + 恒等,分类 = 交叉熵 + Softmax → $\delta_k = Y_k - T_k$ 的统一形式
  4. 通用近似定理:矩形波逼近任意函数 → “存在”但不告诉我们”怎么找” → 引出优化困难
  5. 损失曲面的几何特征:梯度爆炸(悬崖)、梯度消失(Plateau)、鞍点 → mini-batch 噪声的意义 → Hessian 正定判定收敛 → 参数空间对称性
  6. 表示学习:One-hot 的距离均等 vs 分布式表示的语义几何 → 深度学习本质上是在学表示 → 距离即语义相似度
  7. 逻辑回归到 Softmax:似然函数 → log-odds → Sigmoid 的推导 → Softmax 的多分类推广

核心观点:深度学习不仅仅是堆更多层、搞更复杂的模型——真正的变革在于让模型自己去学习更好的表示,而不是在固定编码上死磕。