跳转到内容
← 返回算法
机器学习算法计算机科学 · 机器学习 · 数值优化15 分钟阅读

梯度下降与反向传播

Gradient Descent and Backpropagation

今天所有主流的神经网络——GPT、Stable Diffusion、AlphaFold、自动驾驶系统——都依赖两个核心算法在数以亿计的参数上共同工作:梯度下降告诉参数应该往哪个方向调整,反向传播高效地计算出"每个参数对误差贡献多少"。没有这两个算法,现代深度学习不可能在计算上可行。 反向传播经常被错误地称为"神经网络的…

梯度下降反向传播神经网络优化算法深度学习

今天所有主流的神经网络——GPT、Stable Diffusion、AlphaFold、自动驾驶系统——都依赖两个核心算法在数以亿计的参数上共同工作:梯度下降告诉参数应该往哪个方向调整,反向传播高效地计算出"每个参数对误差贡献多少"。没有这两个算法,现代深度学习不可能在计算上可行。

破除误解:反向传播不是学习本身

反向传播经常被错误地称为"神经网络的学习算法"。更准确的说法是:反向传播是高效计算梯度的算法;梯度下降是利用梯度来更新参数的优化方法。学习是这两者配合的结果,而非任何单个算法。

另一个误解:反向传播是专门为神经网络发明的。实际上它是自动微分(Automatic Differentiation)链式法则的特殊情况,是一种通用的计算技术。应用于神经网络的历史,常归于 Rumelhart、Hinton 和 Williams 的 1986 年论文(以及此前多位独立发现者)。

损失函数:把"误差"变成数字

训练神经网络,本质是在调参数 θ\theta(权重和偏置),让模型在训练数据上的损失函数(Loss Function) L(θ)L(\theta) 尽量小。损失函数衡量模型输出与正确答案的差距,常见形式有两种:

均方误差(MSE)(回归问题):

L(θ)=1ni=1n(yiy^i)2L(\theta) = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

交叉熵损失(Cross-Entropy)(分类问题):

L(θ)=1ni=1ncyiclogy^icL(\theta) = -\frac{1}{n} \sum_{i=1}^{n} \sum_{c} y_{ic} \log \hat{y}_{ic}

训练目标是找到 θ=argminθL(θ)\theta^* = \arg\min_\theta L(\theta)

梯度下降:沿最陡坡下山

把损失函数想象成一个高维的地形图。参数空间的每个点对应一个"海拔"(损失值)。我们的目标是找到最低点(全局最小值)。

梯度(Gradient) θL\nabla_\theta L 是损失函数在当前点各方向上的"坡度"——指向损失函数上升最快的方向。

梯度下降:沿梯度的反方向走一小步:

θθηθL(θ)\theta \leftarrow \theta - \eta \cdot \nabla_\theta L(\theta)

其中 η>0\eta > 0学习率(Learning Rate)——步长大小。它的选择为什么微妙,用一条一维抛物线就能看清。设 L(w)=κ2w2L(w) = \frac{\kappa}{2} w^2,梯度是 κw\kappa w,一步更新给出 w(1ηκ)ww \leftarrow (1 - \eta\kappa)\, w,迭代 $t$ 步后 wt=(1ηκ)tw0w_t = (1-\eta\kappa)^t w_0:当 0<ηκ<20 < \eta\kappa < 2 时收缩收敛;ηκ\eta\kappa 接近 2 时来回震荡;ηκ>2\eta\kappa > 2 时逐步放大、发散。高维损失曲面在每个方向上各有自己的曲率 κ\kappa,一个标量学习率必须同时迁就所有方向——最陡方向(曲率最大)决定学习率的上限,最平方向决定收敛速度的下限。这就是"太大发散、太小停滞"的几何实质,也是条件数差的损失曲面(狭长的山谷)让朴素梯度下降来回横跳、前进极慢的原因。现代深度学习使用自适应学习率优化器(如 Adam、AdamW)为每个参数分别缩放步长,缓解的正是这个问题。

随机梯度下降(SGD):每次不用全量数据计算梯度(计算代价极高),而是随机取一个小批量(Mini-batch)(如 256 条样本)估算梯度,然后更新。批量大小是一道三方权衡。

  • 梯度估计质量$B$ 条样本平均后的梯度噪声(方差)约为单条的 $1/B$——批量翻倍,噪声只降一半,收益递减。
  • 硬件利用率:太小的批量喂不饱 GPU 的并行单元;大到一定程度后,继续加大只浪费显存,不再加速。
  • 泛化:小批量的噪声像隐形的正则化,实践中往往泛化更好;批量过大时模型容易收敛到"尖锐"的极小值,测试误差变差。

Goyal 等人(Facebook,2017)给出了一个影响深远的工程经验——线性缩放规则(Linear Scaling Rule):批量放大 $k$ 倍,学习率也放大 $k$ 倍(梯度噪声小了,步子可以等比例放大),配合训练初期逐步升高学习率的预热(Warmup)。他们用 8192 的批量在 256 张 GPU 上一小时训练完 ImageNet 上的 ResNet-50,精度与小批量基线持平。"大批量 + 大学习率 + 预热"自此成为大规模训练的标准配方。

反向传播:链式法则的计算图实现

神经网络是一系列函数的复合:

L=fn(fn1(f1(x;θ1);θn1);θn)L = f_n(f_{n-1}(\ldots f_1(x; \theta_1) \ldots; \theta_{n-1}); \theta_n)

要对每个参数 θi\theta_i 求偏导数 Lθi\frac{\partial L}{\partial \theta_i},需要对这个嵌套复合函数反复使用链式法则(Chain Rule)

Lθi=Lznznzn1zi+1θi\frac{\partial L}{\partial \theta_i} = \frac{\partial L}{\partial z_n} \cdot \frac{\partial z_n}{\partial z_{n-1}} \cdots \frac{\partial z_{i+1}}{\partial \theta_i}

如果对每个参数都独立计算,代价是 O(θ)O(|\theta|) 次前向传播——参数数量 θ|\theta| 可达数十亿,完全不可行。

反向传播的核心思想:按计算图从后向前一次性计算所有梯度,中间结果被共享复用:

前向传播:x -> z1 -> z2 -> ... -> L   (存储中间激活值)
          ↓    ↓    ↓         ↓
反向传播:dL/dx <- dL/dz1 <- dL/dz2 <- ... <- dL/dL=1
```

每条边只被访问一次,所有参数的梯度都在一次后向遍历中计算完毕,时间复杂度约等于两次前向传播的代价——与参数数量线性而非平方相关。这正是深度学习在计算上可行的关键。

一个最小例子把机制说透。设 L=(wxy)2L = (w \cdot x - y)^2,计算图有三个节点:u=wxu = w \cdot x$e = u - y$L=e2L = e^2。前向时把每个节点的值存下来;反向时从 L/L=1\partial L / \partial L = 1 出发,每个节点只做一件事——把上游传来的梯度乘以自己的局部导数,再传给上游:L/e=2e\partial L / \partial e = 2eL/u=1\partial L / \partial u = 1,于是 L/w=2ex\partial L / \partial w = 2e \cdot x。每个节点的局部导数都是平凡的(一次乘法或加法),复杂的是复合的顺序,而计算图替我们管理了这个顺序。现代框架(PyTorch、JAX)做的正是把用户的每一步运算记录成这样的图,再自动执行这趟反向遍历。

现代优化器

朴素梯度下降有许多实际问题:

动量(Momentum):把梯度想成"力"、参数想成有质量的球——更新方向不再只看当前梯度,而是历史梯度的指数加权平均。在狭长山谷里,垂直于谷底方向的震荡分量正负抵消,沿谷底方向的分量持续累积,收敛因此显著加速。动量还让小批量的噪声梯度被时间平均平滑掉一部分。常见的改进是 Nesterov 动量:先按累积的动量预判一步、在预判位置算梯度,修正更及时,凸情形下理论收敛速度更快。

Adam(Adaptive Moment Estimation,Kingma & Ba, 2015):最广泛使用的优化器。为每个参数维护梯度的一阶矩(均值)和二阶矩(方差的估计),自适应地调整每个参数的学习率:

mt=β1mt1+(1β1)gtm_t = \beta_1 m_{t-1} + (1-\beta_1) g_t vt=β2vt1+(1β2)gt2v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2 θt=θt1ηvt+ϵmt\theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{v_t} + \epsilon} m_t

一阶矩 mtm_t 就是动量,负责方向;二阶矩 vtv_t 是关键创新——梯度长期偏大的参数步长被自动调小,梯度稀疏或偏小的参数步长被放大,相当于给每个参数单独估计了一回"局部曲率"并对冲掉。这正是对前面"一个标量学习率迁就所有方向"困境的工程解法:不追求理论上的最优步长,而是让各方向的有效步长落在相近的量级。

AdamW:Adam + 权重衰减(L2 正则化的解耦实现),是训练大语言模型的事实标准。之所以要"解耦",是因为原始 Adam 把 L2 项混进梯度后再做矩估计,权重衰减的强度会被每个参数的自适应缩放扭曲——衰减打在哪个参数上、打多重,都变得不可控;把衰减从梯度里拿出来单独施加,两者才互不干扰。

深度网络的训练挑战

随着网络加深,梯度下降面临额外困难:

梯度消失(Vanishing Gradient):反向传播把各层的局部梯度连乘回浅层——链式法则里没有"平均"机制,只有乘法。以当时主流的 Sigmoid 激活为例,其导数最大只有 $1/4$;即使每层都工作在最佳点,三十层之后梯度也被乘上了不超过 (1/4)301018(1/4)^{30} \approx 10^{-18} 的因子。浅层参数几乎收不到任何误差信号,训练在实际上冻结。Glorot 和 Bengio(2010)的实验还指出了更糟的细节:Sigmoid 的输出均值是 0.5 而非 0,深层网络的激活会整体被推向饱和区——那里的导数接近 0,连 $1/4$ 都保不住。同一个连乘结构也解释了镜像问题:若各层梯度略大于 1,连乘的结果是梯度爆炸(在循环网络中尤其突出,工程上靠梯度裁剪应急)。这是 1980–90 年代深层神经网络难以训练、研究一度陷入低谷的主要技术原因。

解决方案:ReLU 激活函数(f(x)=max(0,x)f(x) = \max(0, x),正区间梯度恒为 1)、残差连接(ResNet,给梯度提供"高速公路"绕过多层),以及批归一化(Batch Normalization)都帮助缓解了这个问题,是深度学习复兴(2012 年 AlexNet 之后)的关键技术。

鞍点问题:高维空间中,不仅有局部极小值,更常见的障碍是鞍点(某些方向上升、某些方向下降的点)。梯度在鞍点处为 0,朴素梯度下降会卡住。现代研究表明,对足够大的神经网络,局部极小值和鞍点的情况比理论担忧的要乐观(Dauphin et al., 2014 等工作),随机梯度下降的噪声有时帮助逃出鞍点。

代价与争议

对"为什么有效"的理解仍不完整:为什么随机梯度下降在数十亿参数的非凸损失函数上能收敛到"好"的解?理论解释仍然不完整。实践经验领先于理论理解,这在机器学习中是常态。

计算成本:训练 GPT-4 规模的模型需要数千张 GPU 运行数月,能耗相当于一个小城市。训练过程的碳足迹引发了关于 AI 可持续发展的争论。

泛化之谜:深度网络的参数数量远超训练样本数——按经典统计理论,它们应该严重过拟合。但实践中,过参数化的网络在测试集上表现良好。这个"双重下降"(double descent)现象挑战了经典学习理论,目前仍是活跃的研究课题。

跨域连接

  • 多元微积分:反向传播是链式法则的反向模式自动微分,其代价与输出维度成正比、与参数数量无关。这一条决定了深度学习的可行性:一个标量损失、十亿参数,一次反向就够。反过来若是少参数多输出,前向模式才划算。选哪种模式不是实现偏好,而是由雅可比矩阵的形状决定的。
  • 动态规划:计算图上每条边只被访问一次,中间结果被复用而非重算,这正是动态规划的骨架。代价也随之而来:复用要求把前向的激活值全部留着,显存占用与深度成正比。重计算式的检查点技术就是沿这条权衡线往回退——多算一遍换少存一份,与"查表还是重算"的取舍完全同构。
  • 统计学:参数数远超样本数时经典理论预言严重过拟合,实际却不然,测试误差随容量增大先升后降。这说明"参数计数"不是正确的复杂度度量——真正起作用的是优化过程隐含的正则化:随机梯度倾向于收敛到某一类解,而不是任意一个训练误差为零的解。理论落后于实践在这里是字面意义上的。
  • 神经元:生物神经元不做反向传播。误差信号必须精确地沿正向连接的转置回传,而突触没有这条通道,这就是权重传输问题。它不是工程细节而是结构性障碍:任何"大脑在做反向传播"的说法都得先指出这条反向通路在哪。把网络当作大脑模型时,这是最该标注的边界。
  • 气候建模:变分资料同化用伴随模式把观测误差沿时间反向传播、修正初始场,用的正是同一套链式法则。因此模式必须可微:参数化方案里的开关判断会让伴随在阈值处失效,实务中必须把它们平滑化。同一条约束在两个领域给出同一个工程后果——不可微的分支是反向传播的天敌。

参考文献

  • Rumelhart, D., Hinton, G. & Williams, R. Learning Representations by Back-Propagating Errors. Nature 323, 533–536 (1986).
  • Kingma, D. & Ba, J. Adam: A Method for Stochastic Optimization. ICLR 2015. arXiv:1412.6980.
  • Dauphin, Y. et al. Identifying and Attacking the Saddle Point Problem in High-dimensional Non-convex Optimization. NeurIPS 2014.
  • Glorot, X. & Bengio, Y. Understanding the Difficulty of Training Deep Feedforward Neural Networks. AISTATS 2010, pp. 249–256.
  • Goyal, P. et al. Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour. arXiv:1706.02677 (2017).

延伸阅读

  • Goodfellow, I., Bengio, Y. & Courville, A. Deep Learning. MIT Press, 2016. (第8章:优化;免费在线)