云计算百科
云计算领域专业知识百科平台

AI 的引擎:自动微分到底是怎么工作的?

AI 的引擎:自动微分到底是怎么工作的?

深度学习能训练,靠的是反向传播;反向传播的数学本质,是自动微分(AD)。但"自动微分"既不是数值近似,也不是符号推导——它是第三种、也是被低估的一种求导方式。今天一次讲清:三种求导方式差在哪,AD 凭什么成为 AI 的引擎。

一、求导的三种方式

同一个函数 f(x₁,x₂) = sin(x₁) + x₁·x₂ + e^x₂,三种方式求梯度:

1. 数值微分(差分近似)

f'(x) ≈ (f(x+h) – f(x-h)) / 2h

用两个很近的点算斜率。简单粗暴,但有两个误差源打架:截断误差(h 大则大)和舍入误差(h 太小,浮点精度爆炸)。精度天花板约 1e-8,且每个参数都要重新算一遍函数——深度学习几亿参数,直接不可用。

2. 符号微分(解析推导)

用链式法则、乘法法则把导数表达式"推"出来——就是你在高数课上做的事。精度完美,但表达式膨胀:嵌套深度 k 的程序,导数表达式可能膨胀到 k! 量级。算 f(x₁,x₂) 还好,算一个 100 层的神经网络,符号表达式会膨胀到内存都装不下。

3. 自动微分(AD)

既不近似、也不膨胀。核心思想:把计算过程拆成一连串基本运算(加减乘除、sin、exp……),对每个基本运算精确求导,再用链式法则把导数"传"过去——精度和符号微分一样(与解析导数逐位一致),开销只比原计算多一个常数倍。

二、AD 的秘密:对偶数(dual number)

前向模式 AD 用"对偶数" x + ε·x’:实数部分存值,对偶部分存导数。定义运算规则:

(a + εa') + (b + εb') = (a+b) + ε(a'+b')
(a + εa') × (b + εb') = (ab) + ε(a'b + ab')
sin(x + εx') = sin(x) + ε·cos(x)·x'

导数的信息跟着值一起算——一次前向就把值和导数都算出来了,而且每一步都是精确的。

三、代码演示:三种方式同台对比

import numpy as np
import math

# 目标函数 f(x1,x2) = sin(x1) + x1*x2 + exp(x2)
def f(x1, x2):
return math.sin(x1) + x1*x2 + math.exp(x2)

x1, x2 = 0.5, 0.3

# 1. 数值微分(中心差分)
h = 1e-6
df_num = [(f(x1+h, x2)f(x1h, x2))/(2*h),
(f(x1, x2+h)f(x1, x2h))/(2*h)]

# 2. 符号微分(手写解析式)
df_sym = [math.cos(x1) + x2, x1 + math.exp(x2)]

# 3. 自动微分(dual number 前向模式)
class Dual:
def __init__(self, val, der=0.0):
self.val, self.der = val, der
def __add__(self, o): return Dual(self.val+o.val, self.der+o.der)
def __mul__(self, o): return Dual(self.val*o.val, self.der*o.val+self.val*o.der)

def sin(d): return Dual(math.sin(d.val), math.cos(d.val)*d.der)
def exp(d): return Dual(math.exp(d.val), math.exp(d.val)*d.der)

def f_ad(x1d, x2d):
return sin(x1d) + x1d*x2d + exp(x2d)

df_ad = [f_ad(Dual(x1,1.0), Dual(x2,0.0)).der,
f_ad(Dual(x1,0.0), Dual(x2,1.0)).der]

print(f"数值微分: [{df_num[0]:.8f}, {df_num[1]:.8f}]")
print(f"符号微分: [{df_sym[0]:.8f}, {df_sym[1]:.8f}]")
print(f"自动微分: [{df_ad[0]:.8f}, {df_ad[1]:.8f}]")
print(f"AD vs 符号误差: {abs(df_ad[0]df_sym[0])+abs(df_ad[1]df_sym[1]):.2e}")

运行输出:

数值微分: [1.17758256, 1.84985881]
符号微分: [1.17758256, 1.84985881]
自动微分: [1.17758256, 1.84985881]
AD vs 符号误差: 0.00e+00

三种方式结果一致,但AD 与符号微分的误差是 0.00e+00——逐位一致。区别在工程性:数值微分慢且精度受限,符号微分会膨胀,AD 快、准、不膨胀——所以 PyTorch、JAX、TensorFlow 全部用 AD。

四、反向模式:深度学习的关键

上面的例子是前向模式(对每个输入求导一次)。但深度学习的参数有几亿个,输出只有 1 个(loss)——这时候要用反向模式(反向传播):从输出往回传梯度,一次反向就能算出所有参数的导数,开销是前向的 2-3 倍。

前向模式适合"输入少输出多"(如雅可比矩阵),反向模式适合"输入多输出少"(如神经网络训练)。PyTorch 的 .backward() 就是反向模式 AD 的工程实现。

五、避坑清单

  • AD ≠ 数值微分:AD 是精确的(逐位一致),不是近似
  • AD ≠ 符号微分:AD 不产生膨胀的符号表达式,它分解计算流程
  • 反向传播 = 反向模式 AD:理解了这个,你就不怕"梯度消失"的数学
  • 控制流没问题:if/循环在 AD 里照常工作(按实际执行路径求导),符号微分反而做不到
  • 前向 vs 反向要选对:输入少输出多用前向,输入多输出少(训练)用反向
  • 六、想系统学可微分编程?

    本文精选自 ima 知识号【Kruptos】《可微分编程与科学计算》订阅库(第 002 期数值/符号/自动微分对比、第 003 期前向 AD、第 004 期反向 AD 等 100 期系统教程,从自动微分三范式到 PINN、神经算子、可微物理仿真,每期配可运行 Python 代码)。

    📚 完整系列 100 期 + 配套代码,已在 ima 知识号发布

    本文只是系列的一个切片。完整系列(100 期系统教程 + 每期可运行代码)在 ima 知识号【Kruptos】持续更新中:

    • 🗂 67+ 技术知识库:信号与系统、SDR 软件无线电、数字信号处理、操作系统、AI Agent、大模型微调……几乎覆盖全部软硬件技术栈
    • 🧠 8 款 AI 技能:系列生产、知识库管理、CMMI 受管开发、自进化 Agent 等,已在 ima 技能广场上架,即装即用
    • ✅ 全部免费订阅,后续更新自动推送

    🔍 订阅方式:打开 ima(腾讯智能工作台)→ 搜索「Kruptos」→ 一键订阅。或在 ima 内直接搜索《可微分编程与科学计算》等知识库名称。

    💬 你第一次被反向传播震撼是什么时候?评论区聊聊——想看前向 AD 还是 Hessian 计算,点赞高的安排。


    作者:Kruptos(西电毕业,13 年无线通信/DSP/嵌入式科研)|原创内容,转载注明出处

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » AI 的引擎:自动微分到底是怎么工作的?
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!