Page 30 · SimLabs LLM Visual

自动微分:模型是怎样学会的

前面你已经看过 Token、Embedding、Attention 和 Transformer Block。但有一个问题始终没有正面回答:这些参数一开始是随机的,模型到底是怎么“学会”的?这一页就补上这个关键环节——自动微分。它让模型知道自己错在哪里、每个参数该往哪个方向调、调多少。没有它,深度学习就不可能真正跑起来。

看懂计算图 理解链式法则 抓住反向传播 亲手调一次参数

为什么需要自动微分

训练模型的过程,本质上是一个“不断纠错”的过程。模型先猜一个答案,然后和正确答案比较,得到一个误差。接下来最关键的一步是:算出每个参数对误差的影响有多大,然后按影响方向去调整参数。这个“影响大小”就是梯度,而自动微分就是高效计算梯度的技术。

① 手动推导太慢

如果每个模型都要人手算梯度,面对几十亿参数的 LLM 根本不可能。自动微分让计算机自动完成这件事。

② 数值近似太贵

用“扰动一个参数看误差变化”的数值方法,每个参数都要重新算一次前向传播,参数量大时成本爆炸。

③ 反向传播一次搞定

自动微分(尤其是反向模式)只需要一次前向 + 一次反向,就能得到所有参数的梯度,效率极高。

先抓住一句话: 自动微分不是“近似求导”,而是利用链式法则,把复杂表达式的导数拆成一系列简单运算的导数,再按计算图反向组合起来。它算出的梯度和手动推导完全一致。

亲手跑一遍:计算图上的前向与反向

下面是一个最小的可训练模型。它只有一个参数 w,输入是 x,目标是 y,预测值和目标的差距用平方误差衡量。整个过程只有三个运算:乘法、减法、平方。虽然简单,但它包含了 LLM 训练中所有核心步骤的缩影。

// 前向传播:从输入一路算到损失
u = w · x // 线性预测
z = u − y // 和目标的差距
L = z² // 平方损失

// 反向传播:用链式法则求梯度
∂L/∂z = 2z
∂L/∂u = ∂L/∂z · ∂z/∂u = 2z
∂L/∂w = ∂L/∂u · ∂u/∂w = 2z · x

// 参数更新:沿梯度反方向走一小步
w ← w − η · ∂L/∂w

输入 x

2.00

参数 w

1.00

目标 y

5.00

学习率 η

0.10
① 前向传播 ② 反向传播 ③ 更新参数
节点 含义 前向值 梯度 ∂L/∂
点击「执行前向传播」开始
当前阶段: 等待开始。点击「执行前向传播」,让数据从输入流向损失。

链式法则:为什么梯度可以“乘着走”

自动微分的数学核心只有一句话:复合函数的导数,等于各层导数的乘积。这就是链式法则。下面把这个例子完整拆开,每一步都写清楚。

1

从损失开始

损失是 L = z²。对 z 求导得到 ∂L/∂z = 2z。这是反向传播的起点,相当于告诉模型:“当前误差对中间变量 z 有多敏感”。

∂L/∂z = 2z = ?
2

穿过减法

因为 z = u − y,所以 ∂z/∂u = 1。根据链式法则,∂L/∂u = ∂L/∂z · 1,梯度原样传过来。

∂L/∂u = ∂L/∂z · 1 = ?
3

穿过乘法

因为 u = w · x,所以 ∂u/∂w = x。于是 ∂L/∂w = ∂L/∂u · x。这一步非常关键:梯度会被输入值缩放。输入越大,参数 w 的梯度也越大。

∂L/∂w = ∂L/∂u · x = ?
4

沿梯度反方向更新

梯度告诉了我们“增大 w 会让损失变大还是变小”。要降低损失,就朝梯度相反的方向走一小步:w ← w − η · ∂L/∂w。学习率 η 控制步长。

w ← w − η · ∂L/∂w = ?
一句话理解链式法则: 梯度像接力棒,从损失出发,每经过一个运算就乘上这个运算的局部导数,一路传到每个参数。自动微分就是让计算机自动完成这趟“接力”。

数值梯度验证:自动微分算得对吗

自动微分算出的梯度到底可不可信?有一个简单的验证方法:给参数加一个很小的扰动 ε,看损失变化了多少。这就是数值梯度。如果它和自动微分的结果非常接近,说明计算正确。

数值梯度的定义

数值梯度用差分近似导数:

∂L/∂w ≈ (L(w + ε) − L(w − ε)) / (2ε)

这个方法虽然简单,但每个参数都要额外算两次前向传播,参数量大时非常慢。所以训练时用自动微分,验证时用数值梯度。

实时对比

下面是当前参数下,两种方法算出的梯度对比:

方法∂L/∂w
自动微分(解析)—
数值梯度(ε=0.001)—
差异—

训练循环:让模型一步步变好

单次更新不够,真实训练是“前向 → 反向 → 更新”不断循环。每循环一次,参数就朝着降低损失的方向挪一点。下面这个曲线记录了自动训练 20 步后,损失如何下降。

点击「自动训练 20 步」查看 loss 曲线
训练步数 → —
你可能会注意到: 损失一开始下降很快,后来变慢。这是因为越接近最优解,梯度越小,参数更新幅度也越小。这种现象在真实 LLM 训练中同样存在,所以需要学习率调度、优化器(如 AdamW)等技巧来改善。

知识点完整总结

这一页涉及的每一个概念,下面用六张卡片完整讲清楚。你可以按顺序读,也可以挑自己最关心的部分看。

📖 标准介绍

自动微分(Automatic Differentiation, AD)是一种在计算机程序中精确计算函数导数的技术。它把程序拆解为基本运算(加、减、乘、除、exp、log 等),利用链式法则逐步组合这些基本运算的导数,从而得到整个函数的梯度。

自动微分分为前向模式和反向模式。深度学习使用反向模式(即反向传播),因为它的计算成本与参数数量无关,只需要一次前向 + 一次反向就能得到所有参数的梯度。

常见实现:PyTorch 的 autograd、TensorFlow 的 GradientTape、JAX 的 grad。

💡 通俗介绍

想象你在爬山,但眼前全是雾,看不见山顶。你唯一能做的,是感受脚下哪边是上坡、哪边是下坡。自动微分就是那个告诉你“每个方向坡度是多少”的工具。

模型里有几百万、几十亿个“旋钮”(参数),每个旋钮都影响最终结果。自动微分能一次性告诉你:每个旋钮往哪边拧、拧多少,能让误差降得最快。

没有它,你就只能一个个旋钮去试,效率极低。有了它,模型才能“自己学会”。

🔧 解决了什么问题

它解决了“如何高效、准确地计算复杂函数对所有参数的梯度”这个问题。

  • 手动推导:太慢、容易出错,参数量大时不可行。
  • 数值差分:每个参数都要额外算两次前向,成本随参数量线性增长。
  • 符号微分:表达式会爆炸,不适合有循环和条件的程序。

自动微分兼顾了准确性和效率,是深度学习能规模化的关键基础设施。

⭐ 为什么重要

自动微分是整个深度学习训练体系的数学引擎。没有它,就没有反向传播;没有反向传播,就没有梯度下降;没有梯度下降,模型就无法从数据中学习。

从最简单的线性回归,到 GPT、Diffusion、AlphaFold,所有现代神经网络的训练都依赖自动微分。它让研究人员可以自由设计复杂的网络结构,而不必担心梯度推导的负担。

可以说:自动微分是“深度学习能自动化”的底层前提。

🚀 应用场景

  • 神经网络训练:所有深度学习框架的核心,包括 CNN、RNN、Transformer、Diffusion。
  • 大语言模型微调:LoRA、RLHF、DPO 等都依赖自动微分计算梯度。
  • 科学计算:物理模拟、分子动力学、天气预报中的可微编程。
  • 优化问题:最优控制、逆运动学、强化学习策略梯度。
  • 概率编程:贝叶斯推断中的变分推断、哈密顿蒙特卡洛。
  • 可微渲染:3D 重建、神经辐射场(NeRF)。

⚠️ 缺陷与局限

  • 内存开销大:反向传播需要保存前向传播的中间结果,显存占用随网络深度增加。这也是为什么大模型训练需要梯度检查点(Gradient Checkpointing)等技术。
  • 不适用于不可导操作:argmax、离散采样、硬阈值等操作无法直接求导,需要用 Straight-Through Estimator、Gumbel-Softmax 等技巧近似。
  • 反向模式不适合“少输入多输出”:如果输入维度远小于输出维度,前向模式更高效。深度学习通常是“多参数输入、标量损失输出”,所以反向模式最合适。
  • 数值稳定性问题:梯度可能爆炸或消失,需要梯度裁剪、归一化、残差连接等手段配合。
  • 实现复杂度高:手写自动微分引擎需要正确处理计算图、内存管理、并行计算等,工程门槛不低。
一句话理解自动微分: 它让计算机自动完成“链式法则接力”,把损失对每个参数的敏感度精确算出来,从而让模型能够一步步朝着更好的方向调整自己。这是所有大模型“学会”能力的起点。

学完这一页,最好记住三件事

计算图是骨架

前向传播把运算连成图,反向传播沿图回传梯度。图的结构决定了梯度怎么流动。

链式法则是规则

每个局部导数相乘,梯度就能从输出一路传到输入。自动微分只是让计算机自动执行这个规则。

梯度下降是行动

知道梯度之后,沿反方向走一小步,参数就更新了。学习率决定步子有多大。