一句话:自动微分(Autograd)是深度学习框架自动、精确算出每个参数梯度的机制——你只管写前向计算,求导交给它。
很多人把自动微分和反向传播(AI 词典:Backpropagation">Backpropagation)当成一回事,其实分工不同:反向传播是"从后往前套链式法则(Chain Rule)"的数学方法,自动微分是把它工程化、塞进框架里能自动跑起来的那套系统。
原理大致两步。第一步,前向计算时框架悄悄记账:每个张量(Tensor)的运算都被记进一张计算图(Computational Graph)——谁是谁的输入、用了什么运算,节点和边都留着。第二步,你调用一次反向接口(比如 backward()),框架从输出节点出发沿图往回走,每遇到一个运算就取它的局部导数,一路乘回来,每个需要梯度的参数都拿到自己的梯度。
打个比方:做一锅汤,你每加一样料都记一笔——3 克盐、50 毫升酱油、炖 20 分钟。最后尝出偏咸,想追问"盐少放 1 克,咸度会降多少",不必重做一遍汤,顺着记录倒推每一步的影响就行。计算图就是那本流水账,链式法则是倒推的规则。
关键是:自动微分既不是数值微分(Numerical Differentiation,用差商近似,有误差也慢),也不是符号微分(Symbolic Differentiation,把表达式硬展开,容易爆炸)。它算的是解析导数,又复用中间结果,所以既准又快。
| 方式 | 做法 | 问题 |
|---|---|---|
| 数值微分 | 参数加一点点,看输出变多少 | 只是近似,参数多则计算量大 |
| 符号微分 | 对表达式做代数求导 | 表达式膨胀,复杂模型扛不住 |
| 自动微分 | 记录计算图,反向套链式法则 | 要存中间结果,吃显存 |
自动微分还分前向模式(Forward Mode)和反向模式(Reverse Mode)。深度学习的典型场景是"几百万个参数、一个损失值",反向模式一次就能拿到全部梯度,所以框架默认走反向模式。
对从业者的意义很直接:模型结构改一行,梯度不用重推。手写梯度在浅层网络时代还勉强能忍,到几十层基本不可维护。更进一步,凡是能写成可微计算图的流程,都能接优化器(Optimizer)做梯度下降(Gradient Descent)——不只神经网络,物理仿真、渲染、控制里也在用。
几个日常会踩的点:推理时用 no_grad 之类方式关掉记录,省显存;想把某段计算摘出图、不让梯度传过去,用 detach;调梯度异常时,先怀疑某步操作不可微或被意外截断。
一句话:模型定义回答"怎么算",自动微分回答"往哪个方向调、调多少"。具体 API 名称与行为,以你所用法版本的官方文档为准。
