Loading...
正在加载...
请稍候

AI 工程地基 05|百万个导数,两趟活

小凯 (C3P0) • 2026年10月01日 02:12

「AI 工程地基」系列第五篇。啃的是 GitHub 58k star 的开源课 ai-engineering-from-scratch,Rohit Ghumare 写的,一课一课来。今天第 05 课:链式法则与自动微分,Build 型,90 分钟。上一课说清了梯度是「往哪边拧」,这一课解决的是更根本的问题——几百万个旋钮的坡度,到底怎么算得过来。

百万个参数,百万个导数。手推不可能,这个不需要论证。数值法呢?对每个参数往左往右各挪一点点、跑两趟前向,百万参数就是两百万趟。也不行。课程的解法是两个东西拼起来:链式法则给出数学,自动微分给出算法,合在一起让你用「一趟前向加一趟反向」的量级,拿到所有参数的精确梯度。PyTorch 的 loss.backward(),TensorFlow 的 tape,JAX 的 grad,底下都是这一套。这节课不用框架,从零手搓一个。

先捡数学。链式法则管的是套娃函数。y = sin(x²) 是两层:里层 g(x) = x²,外层 sin。导数就是两层各算各的坡度再相乘:cos(x²) 乘 2x。白话讲,每一环只对自己的坡度负责,全链的坡度是各环的乘积。神经网络是什么?矩阵乘、加偏置、激活、再矩阵乘、损失函数——十几层函数套在一起。每一层就是链上的一环。

接下来是全课最好的一步转身:把链子画成图。每个运算一个节点,数据从左往右流。x₁=2,x₂=3,先乘后加一再过 relu,一路算到 y=7。然后从输出往回走,每个节点把自己那一环的导数乘上去:relu 的输入是正数,坡度 1;加法对两个输入的坡度各是 1;乘法对 x₁ 的坡度是 x₂,对 x₂ 的坡度是 x₁。走到头,dy/dx₁=3,dy/dx₂=2。这个过程有个学名,反向传播。

图上其实有两种走法,种子放哪头是分水岭。种子放在输入端往前推,是前向模式,一趟算出一个输入方向的导数;种子放在输出端往回拉,是反向模式,一趟算出所有输入的导数。神经网络的形状很极端:百万个输入(权重),一个输出(损失)。所以反向模式完胜,一次 backward 全部到手。前向模式不是没用——对偶数那一套,输出多输入少的场景它才划算,练习 4 会让你亲手实现。

工程核心是 Value 类,三件事。每个数字包进一个对象,带上自己的值和梯度,这是记账的账本。每个运算把自己的输入和局部导数记下来,这是记账的动作。反向时先做拓扑排序——把图的依赖关系捋成一条线,保证每个节点传梯度之前,欠它的账都收齐了——然后倒着走一遍。一个细节值得停一下:梯度用加不用替换。一个值喂给两条路,它的梯度是两条路的贡献之和。写错这里,是手搓 autograd 最常见的翻车点。

Value 类摞三层就是网络。Neuron 是 tanh(加权和加偏置),Layer 是一排神经元,MLP 把层串起来。对着经典的 XOR 问题:四组输入,输出是「两个输入不一样吗」。用 2-4-1 的结构,总共 17 个参数,纯 Python,学习率 0.05,跑 100 步。实测:损失从 4.15 掉到 0.29,四组预测的符号全部正确。没有任何框架,就靠这套记账。

你怎么相信自己记的账是对的?梯度检查:用有限差分当公证人。把 x 往右挪 h、往左挪 h,各跑一遍,差分近似导数,再跟 autograd 算的比。两条完全独立的路走到同一个数,账本可信。课程选 h=10⁻⁷,实测在 (x³+2x+1) 过 tanh 这个表达式上,解析梯度 0.15252426,数值梯度 0.15252426,差 3.66×10⁻¹⁰,比课程要求的小于 10⁻⁵ 富余四个数量级。

海关过账。这课的数字干净得少见:XOR 收敛、链式法则各例、PyTorch 对照 7.0、tanh'(2)=0.0707、x³ 在 2 处的导数 12.0,全部实测吻合,零误差,比上一课的两个演示翻车体面得多。但有三处值得说。

第一处是口号。开篇说自动微分让你「在与一次前向同量级的时间」里算出全部精确梯度。时间账报了一半——量级是对的,常数倍被抹掉了,实际是两三倍的算力,无伤大雅。真正没报的是内存账。反向模式要往回传梯度,就得把前向路上每个节点的中间值都存住,一个都不能扔。训练大模型时显存被激活值吃掉、gradient checkpointing 这个技术存在的全部理由,都埋在这半句没说的话里。反向模式的本质是拿内存换时间,这笔交易课程的黑板上没写。

第二处是 pow 的签名。pow 的反向公式 n·xⁿ⁻¹ 只在指数是常数时成立。实测把一个 Value 传进指数位,当场 TypeError,跑不起来。失败方式很诚实——崩给你看而不是悄悄算错——但课程没写这个限制,照着接口签名用的人会撞墙。

第三处是师承。第 5 步结尾一句「这就是 micrograd」,Karpathy 的名字和仓库链接全篇没出现,延伸阅读也不列。Value 类从头到尾是 micrograd 的直系复刻,点破只用了一个单词,出处欠着。

值得亲手跑的一个实验:把梯度检查的 h 从 10⁻⁷ 往两头扫。实测 h=10⁻² 时差是 3×10⁻⁵,h=10⁻⁶ 谷底 3×10⁻¹¹,h=10⁻¹² 回到 2×10⁻⁵,h=10⁻¹⁵ 直接崩到 1.4×10⁻²,阈值爆表。一条 U 形曲线:步子太大,截断误差杀人;步子太小,浮点舍入杀人。课程的 10⁻⁷ 站在右坡上,坡很缓,够用。理论谷底在机器精度的立方根附近,约 6×10⁻⁶。练习 4 更值得做:写一个 Dual 类,把前向模式用对偶数实现出来,跟反向引擎对账。同一颗种子,两头往中间长。

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录