在市郊的套娃工厂里,质检员小美的工作是检查每一层木偶的尺寸。她发现外层直径总是随着内层直径变化——内层大 1 毫米,外层平均大 0.3 毫米,这个“0.3“就是导数。可厂长紧接着抛出新问题:”你的测量方法本身就准吗?误差的变化率,会不会在套娃层与层之间越放越大?“于是小美必须对自己的测量方法再做一次测量——测量”变化率的变化率“。这个”对求导过程再求导”得到的结果,就是高阶导数。 这个故事不是管理学,而是深度学习编译器里的日常。现代 AI 引擎(PyTorch、JAX、TensorFlow)都内置了自动微分(Automatic Differentiation,AD),它把复杂的损失函数拆成一串最基本的加减乘除,像流水线一样逐个求导。而当你需要二阶、三阶导数时,引擎做的事情就像小美套娃式质检:先求一次导,再对“求导过程”本身求一次导,继续往下套。每一次嵌套,计算图就膨胀一圈,内存多记一摞账,误差也像回声一样被放大——这三个麻烦,正是本文要讲透的三大主题。
高阶导数是元学习(MAML)、物理信息神经网络(PINN)与二阶优化器的共同地基,掌握嵌套自动微分,是 AI 编译器与训练优化工程师从“会用框架”走向“能造引擎”的必修课。
可视化演示
展示嵌套自动微分的计算图展开、前向与反向微分模式效率对比以及Hessian矩阵结构与近似计算策略。
本节配有交互动效(进入视口后自动加载,约 3KB)。
嵌套自动微分 一阶反向传播构建梯度计算图 对梯度图再次微分得到二阶导数 d²f/dx² = d/dx(df/dx) 每增加一阶微分,计算图节点和内存开销翻倍
高阶导数概念
套娃工厂里,质检员小美每天给新出厂的套娃测尺寸误差。她记下“内层直径每变化 1 毫米,外层直径变化多少”——这个变化率就是导数。可厂长紧接着追问:“你的测量方法本身稳不稳?误差的变化率,会不会在层与层之间越放越大?”于是小美不得不对自己的测量方法再做一次测量:把“变化率”本身的变化率量出来。这就是二阶导数——对求导过程再求导。三阶、四阶,无非是继续往下套。
在数学上,一阶导数 df/dx 刻画函数在某一点变化有多快;对导函数再求一次导,得到二阶导数 d²f/dx²,刻画“变化率的变化率”,几何上就是曲线的弯曲程度。逐层求下去就是高阶导数。人工手推高阶链式法则又长又容易错,自动微分(AD)则把函数编译成一张计算图,用程序自动完成一阶、二阶乃至任意阶的求导——它把“求导”本身变成了可重复调用的操作。
以复合函数 f(g(x)) 为例。一阶链式法则只有一项 f'(g)·g';二阶就要同时对这两部分再求导,触发乘积法则,产生两项之和。这个展开模式在 AD 引擎里被翻译成一段固定的传播规则,每多求一阶,就多套一层同样的规则。
对小美来说,这个公式像一张“账目核对表”:第一项是内层误差被外层放大时产生的平方放大效应,第二项是外层自己误差的波动。两笔账都对上,二阶质检才算完成。AD 引擎做的,正是自动把这两笔账算出来。
- 一阶导打底先按普通链式法则求一阶导数,得到 f'(g(x))·g'(x)。这是计算图上完成的第一层“质检记录”。
- 乘积法则展开二阶导要对一阶导结果整体再求导,于是触发乘积法则,拆成两项之和。
- 链式法则套链式第一项里 f'(g(x)) 对 x 求导还需再套一次链式法则,产生因子 g'(x),于是出现 [g'(x)]²。
- 合并整理把两项合并,就得到完整的二阶链式法则——两次嵌套求导自然产生“导数平方”项。
计算图展开
车间的每道工序都画在一张生产流程图(计算图)上:节点是一道工序,边是半成品流向。第一次质检,小美只需在图上顺手标上“误差传递箭头”,图基本照旧;可质检长要复核二阶,她就得把“误差箭头”也当作一道新工序,重新画一轮流程——流程图开始变厚。
计算图是自动微分的心脏:它把目标函数 L 表示成有向无环图,叶子是参数,根是损失,中间每个节点是一次四则运算或初等函数。一阶反向传播,就是沿着边倒着把梯度传回每个叶子;而求二阶导数,相当于把“一阶求导”也画进图里,成为新的子图。
计算图展开(graph unrolling)指的就是这个不断叠加的过程。对 f(x)=sin(x)·x²,一阶展开挂上 cos(x) 和 2x 两个导数节点;二阶展开又对它们各挂一层导数子图。每高一阶,图的节点与边都增长一个固定比例。k 阶导数对应 k 层导数子图叠加,这就是高阶计算“越来越贵”的根源。
小美的碎纸机旁堆满了越来越厚的流程复印版。聪明的办法不是无限复印,而是让同一个绘图员(AD 引擎)在旧图上“原地增量”地添加导数层,并共享没变的部分——这正是编译器做计算图优化时“图重写”的意义。
- 微分算子d/dx 是一个把函数映成导函数的操作符,本身也可以参与复合。
- 算子复合符号 ∘ 表示先做内层算子、再作用外层算子的规则。两个 d/dx 复合就是求两次导。
- k 次嵌套连续复合 k 次记为 (d/dx)^k,每一层对应计算图上新增一层导数节点,图随 k 膨胀。
前向嵌套技术
质检方案 A:小美从最外层套娃往最里层逐层测,把“本层读数对下一层读数的敏感度”记在随身小本上。好处是只需一本小本子(内存极少);坏处是,想弄清楚任意两层之间的相互影响,几乎每条传递路径都得走一遍——套娃越深,路径越密,腿越累。
这就是前向嵌套(fwd-over-fwd):外层用前向模式,内层也还是前向模式。前向模式一次传播只能得到某一个方向上的导数(雅可比-向量积 J·v);想要完整的 n×n 海森矩阵,就得沿着 n 个输入方向各跑一遍,总代价是 O(n²) 倍的计算图规模。
具体做法是给每个变量同时携带两个影子值:一阶扰动值和二阶扰动值。每个乘法节点 v=a·b 按下述公式同步更新两阶导数;遍历整张图后,从输出端的二阶影子值里就能读出海森矩阵的各个元素。
前向嵌套像“带小本逐层下传信息”:内存省、思路直,但输入维度 n 一大,就要 n 个质检员各跑一整趟。因此它只适合输入维度低、但输出维度高的小套娃——比如几十个参数的物理系统辨识问题。
- 一阶种子向量把扰动方向设为坐标轴 e_i,只考察第 i 个输入维度。
- 一阶前向传播沿计算图逐边累乘导数,得到一阶导数值。
- 二阶传播规则每个乘法节点同时更新二阶导,交叉项来自乘积法则。
- 展开与收集总输出的二阶导展开式里,二次型项藏着海森元素;遍历 n 个方向即可拼出完整海森,总代价 O(n²)。
反向嵌套技术
质检方案 B:小美把套娃拆到最里层,从里往外反推“每一层尺寸变化对最终误差的总影响”。一次反推,所有层的影响一次拿到——这就是反向传播。她还发明了混搭招数:外层用一批人反向把总误差分摊到各层,内层再派一个小队沿某个指定方向前向微调,两队配合,一趟就算出“沿着这个方向,梯度会变化多快”。
混搭招数的学名叫前向套反向(fwd-over-rev):先做一次反向传播拿到梯度 ∇f,再对这个梯度做一次前向方向导数。方向导数沿着任意给定的 v,得到海森-向量积 H·v,代价只有 O(n)——比前向嵌套组装完整海森快了一个数量级。反向套反向(rev-over-rev)则需要对反向传播过程本身再做一次反向,每一层中间结果都要存两份,内存常常爆炸,工程上极少采用。
H·v 是二阶计算的“瑞士军刀”:牛顿法用它迭代解线性系统,MAML 用它算元梯度,PINN 用它求 PDE 残差的高阶项。它的巧妙之处在于永远不显式构建海森矩阵,只回答“沿 v 方向梯度变多少”这一个问题。
混搭质检的启示是:全能账本(完整海森)往往不划算,按需回答单个问题(H·v)才是工程常态。小美最终在厂房推行的,正是这套“反推一层、前向一问”的混搭 SOP。
- 参数化直线x(τ)=x+τv 是过 x 沿 v 的方向线,τ 是步长标量。
- 梯度向量函数∇f 把每个空间点映成一个向量,沿这条直线梯度不断变化。
- 对 τ 求导在 τ=0 处求方向导数,链式法则把 v 与二阶偏导配对,结果正好是 H·v。
海森矩阵应用
厂长想要一张“全厂对照表”:第 i 行第 j 列记着“第 j 层套娃变化 1 毫米时,第 i 层读数变化多少”——这就是海森矩阵。它比一阶的雅可比矩阵(所有输出对输入的线性影响)更进一步,记录的是“影响本身的变化率”。
对 n 维输入、标量输出,雅可比退化成梯度行向量,海森则是 n×n 的对称方阵,有 n(n+1)/2 个独立元素。它的价值在于揭示曲率:某个方向曲率大,说明这里的地形陡峭弯曲,牛顿法根据这张“地形图”对梯度步长做修正。
牛顿迭代公式里,海森矩阵的逆把梯度按曲率重新标定:陡峭方向走小步,平缓方向走大步,于是二阶收敛,迭代次数远少于梯度下降。但 n×n 求逆是 O(n³),现实工程改用两条路:一是 H·v 配共轭梯度法,二是 L-BFGS 维护低秩近似。在 PINN 中,热传导方程残差 (∂u/∂t − α∂²u/∂x²)² 里的 ∂²u/∂x² 正是网络输出的海森项,由嵌套自动微分直接给出。
对照表虽好,但 n 层套娃要填 n² 个格子,填表比质检本身还贵。聪明的工厂只填“常用路径”上的格子(低秩近似),或按需抽查(每次只算一条 H·v)——用最少的记账,换最快的改进,这正是所有二阶优化器的生存哲学。
- 当前参数点x_k 是第 k 次迭代的解,所有量都在这一点展开。
- 梯度项∇f 指出最陡上升方向,下降方向取它的负号。
- 海森求逆H⁻¹ 相当于按各方向曲率 1/λ_i 缩放,把梯度重新标定。
- 迭代更新减去“修正量”得到新点,二阶信息让它在二次曲面上一步到位。
数值稳定性
小美的质检记录要一层层转抄进汇总表。每转抄一次就引入一点抄写误差,抄到第七八层时,这点误差像礼堂里的回声一样反复震荡放大,甚至盖过真实数据。如果套娃本身长得不匀称——有的层尺寸敏感、有的层迟钝——放大就更严重。
高阶自动微分没有有限差分那种步长截断误差,但它躲不过另一类误差:浮点舍入。每层导数运算都会引入约 1e-15 量级的舍入,嵌套层数越多,累积越厉害;若海森矩阵病态(特征值数量级相差悬殊),微小扰动会被放大成千上万倍;深层网络中,高阶中间量还可能沿反向路径指数级增长,形成梯度爆炸。
工程上的对策有一整套:阻尼法给海森加上 λI,把特征值整体抬高、远离零;梯度裁剪限制最大范数;输入归一化让各方向曲率不过分悬殊;必要时对关键二阶项使用 float64 或混合精度。判断“病不病”的量化指标是条件数。
小美最后悟出的道理:再厚再全的记录,也要定期用基准量具校准;二阶优化器同理——上战场前先算算条件数,病态就加阻尼,别硬着头皮全速跑。数值稳定,是高阶导数从论文走向产品前的最后一道质检。
- 海森特征值λ 是矩阵 H 的第 i 个特征值,刻画对应方向上的曲率。
- 比值定义条件数是最大与最小特征值绝对值之比。
- 稳定性判据κ 越大,扰动被放大的最坏倍数越大,数值越危险。
内存开销优化
小美的反向质检方案有个致命弱点:要“倒着装回去”,必须先记住每一层拆开前的原样,于是所有半成品都得堆在仓库。套娃只有十层还好,深到一百层,仓库立刻告急。
反向传播必须从输出倒推梯度,因此前向阶段产生的每一层激活值都要缓存到反推时使用,全缓存内存是 O(T),T 为计算图深度。高阶嵌套再叠加反向模式,中间变量成倍增长;计算图展开又让节点数膨胀——内存已经成为高阶自动微分落地时的第一瓶颈。
主流对策是检查点(checkpointing):每隔 √T 层存一个状态快照,反推某段时先加载最近的快照、重新算一遍该段的中间结果。内存从 O(T) 降到 O(√T),总计算量从 2T 涨到约 3T——用 50% 的多余计算换来数量级的内存节省。此外,许多海森矩阵天然稀疏(局部连接的网络),只需保存非零分块,能进一步压缩账本。
仓库放不下,就把“全库存”改成“样品间加现做现卖”:只存少量关键半成品(快照),要的时候重新加工。二阶导数的工程实现,说到底就是在一本烂账(高内存)和一趟冤枉路(多计算)之间,找出最省的那个折中点。
- 图深度 T串行中间状态的数量,决定全缓存的内存规模。
- 检查点分块每隔 √T 层存一个快照,快照数 = T/√T = √T。
- 重算开销反推每段都从快照重放,总操作数约为前向、重算、反推三趟之和。
AI 应用场景
物理信息神经网络(PINN)
阶段:模型训练
解决的问题:传统求解偏微分方程用有限差分或有限元,需要网格剖分,边界和奇异点处误差大、网格越细计算越贵。PINN 把 PDE 残差直接写进损失函数,其中热传导方程残差 (∂u/∂t − α∂²u/∂x²)² 天然包含网络输出对空间坐标的二阶导数 u_xx——这类高阶项无法用一阶梯度凑出来,必须依赖嵌套自动微分。AI 的方式把“解方程”变成“训练网络”,完全免去网格剖分。
具体案例:在一维热传导算例中,用 PyTorch 对网络输出 u(x,t) 连续调用两次 torch.autograd.grad 得到 u_xx,与 ∂u/∂t 组成残差损失。训练一万步后,预测温度场与解析解误差低于 1%,而传统有限差分在相同精度下需要更细网格和更多迭代。
元学习(MAML)
阶段:训练范式设计
解决的问题:普通模型每次遇到新任务都从零训练,样本效率低。MAML 让模型“学会学习”:内层用少量样本微调,外层目标要衡量“微调后损失对初始参数”的敏感度,展开后出现损失对初始参数的海森-向量积项 H·v。它靠 fwd-over-rev 在 O(n) 内完成,而不是组装完整海森。
具体案例:在少样本图像分类中,内层用每类 5 张图微调骨干网络,外层计算元梯度时对初始权重做 H·v 修正。JAX 生态通过 jax.grad 与自定义向量-雅可比积(vjp)实现这一嵌套,训练速度比显式 hessian 快数十倍。
二阶优化器(牛顿法 / L-BFGS)
阶段:训练优化
解决的问题:一阶 SGD 收敛慢、对学习率敏感;传统牛顿法要组装并求逆 n×n 海森矩阵,O(n³) 代价在高维模型上不可行。二阶优化器用 H·v 配共轭梯度法隐式求解 H·d = −∇f,不显式存矩阵,让二阶信息在小模型与 GNN 训练中真正落地。
具体案例:在逻辑回归与小型 MLP 上,使用 PyTorch 2.0 的 functorch 或 torch.autograd.functional.hessian 计算 H·v,配合共轭梯度求解牛顿步,十几次迭代即收敛,而 SGD 需要数百轮。L-BFGS 则维护低秩近似,进一步把内存压到 O(n)。
Python 演示
class Dual: """前向模式自动微分使用的对偶数:val 记录函数值,der 记录导数值。 二阶导数通过把 Dual 再嵌入 Dual 实现,即嵌套自动微分。""" def __init__(self, val, der=0.0): self.val = val self.der = der def __add__(self, other): other = other if isinstance(other, Dual) else Dual(other, 0.0) return Dual(self.val + other.val, self.der + other.der) def __radd__(self, other): return Dual(other, 0.0) + self def __sub__(self, other): other = other if isinstance(other, Dual) else Dual(other, 0.0) return Dual(self.val - other.val, self.der - other.der) def __rsub__(self, other): return Dual(other, 0.0) - self def __mul__(self, other): other = other if isinstance(other, Dual) else Dual(other, 0.0) return Dual(self.val * other.val, self.der * other.val + self.val * other.der) def __rmul__(self, other): return Dual(other, 0.0) * self def __pow__(self, n): return Dual(self.val ** n, n * self.val ** (n - 1) * self.der) def derivative(f): """一阶自动微分变换:输入函数 f,输出其导函数 f'""" def df(x): return f(Dual(x, 1.0)).der return df def target(x): """目标函数 f(x) = 3x^3 - 2x^2 + 5x + 1""" return 3 * x ** 3 - 2 * x ** 2 + 5 * x + 1 if __name__ == "__main__": x0 = 1.5 f1 = derivative(target) # 第一层套娃:f' f2 = derivative(f1) # 第二层套娃:对 f' 再求导 = f'' print("f(%.1f) = %.6f" % (x0, target(x0))) print("f'(%.1f) = %.6f" % (x0, f1(x0))) print("f''(%.1f) = %.6f" % (x0, f2(x0))) print("解析对照: f''(x) = 18x - 4, f''(%.1f) = %.6f" % (x0, 18 * x0 - 4))
self.der * other.val + self.val * other.der这正是乘法求导法则 (uv)'=u'v+uv' 的代码化,一阶导数值沿计算图逐边累乘累加。return Dual(other, 0.0) * self让3 * x这种“标量在前、对偶数在后”的写法也能触发求导,Python 遇到左边不可运算时会尝试右边的__rmul__。def derivative(f):把“求导”封装成一个函数变换:输入普通函数,输出它的导函数,这就是自动微分引擎的迷你版。return f(Dual(x, 1.0)).der给输入注入单位扰动 1.0,前向传播一次取回导数分量,这就是前向模式 O(n) 一次传播的原理。f2 = derivative(f1)核心一步!对导函数再做一次自动微分变换,实现对导数求导——这就是嵌套自动微分,等价于套娃多套一层。
常见误区
误区“f''(x) 不就是 f'(x) 的平方吗?反正都是把变化放大,乘一下就好。” 初学者容易把“阶”理解为对数值得乘方或累加。
正解二阶导数是对“导函数”再求一次导,对象是函数而非数值。f'' 描述的是 f' 的增长速度,与 (f')² 完全不同。比如 f(x)=x² 的 f'=2x、f''=2,而 (f')²=4x²,天差地别。用套娃比喻:不是把尺子的读数平方,而是“用尺子去量尺子的刻度是否均匀”。
为何常见:“导数”本身已足够抽象,初学者对“变化率的变化率”缺乏直观,容易拿已经学会的一阶运算去类比猜测。
误区“反正框架提供了 backward(),高阶导数只是多调用一次,前向嵌套和反向嵌套都一样好用。” 不少开发者以为传个 create_graph=True 就万事大吉。
正解不同嵌套模式复杂度天差地别:fwd-over-fwd 组装完整海森要 O(n²);fwd-over-rev 算 H·v 只要 O(n);rev-over-rev 要保存巨量中间变量,内存经常爆炸。工程上高频使用的是 HVP 而非全海森。套娃比喻:反着装回去需要记住每一层原样,反过来再套两层,仓库直接爆仓。
为何常见:PyTorch 等框架把底层 AD 引擎封装得太顺,一阶 backward 用成肌肉记忆,容易误以为高阶只是“再加一层自动挡”。
误区“AD 没有有限差分的步长问题,算出来的导数就是精确的,放心用。”
正解AD 确实是计算图上的解析求导,没有截断误差;但浮点数本身有舍入误差,嵌套层数越多、海森条件数越大,舍入被放大的风险越高。病态情况下二阶信息甚至会把优化带偏,必须靠阻尼、裁剪等手段兜底。
为何常见:教材常强调 AD“精度高”以对比有限差分,学习者把“无截断误差”简化成了“绝对精确”。
误区“牛顿法用了 H⁻¹,那我先把整个海森矩阵组装出来,再调一个求逆库不就行了?”
正解大部分场景只需要海森-向量积 H·v——共轭梯度法解线性系统、MAML 元梯度、PINN 损失微分都用它。组装 H 是 O(n²) 存储加 O(n³) 求逆,而 HVP 只要 O(n)。真正的工程实践是“永远不组装完整海森”,L-BFGS 连近似矩阵都不存,只存梯度差。
为何常见:教科书上的牛顿法都写 H⁻¹,学习者照搬公式,忽略了公式只是推导工具,实现完全可以用矩阵-向量积绕过求逆。
面试题
Q1. 关于高阶导数的本质,下列说法正确的是?
- A.对导数数值做乘方运算得到
- B.与一阶导数计算完全无关
- C.相当于增加神经网络的层数
- D.对求导过程再求导得到的← 正确答案
答案:D。高阶导数不是对导数值做乘方,而是把求导这个“操作”再作用到导函数上,就像套娃质检把测量方法再测量一遍。B 说与一阶无关、C 扯到网络层数都不对。
Q2. 二阶导数在几何上的直观意义是?
- A.曲线与坐标轴的交点位置
- B.曲线切线斜率的大小
- C.曲线斜率的变化快慢← 正确答案
- D.曲线弧长的总长度数值
答案:C。一阶导数是切线斜率,二阶导数是斜率本身的变化快慢,对应曲线弯曲程度(曲率)。交点与弧长都和二阶导数无直接关系。
Q3. 前向嵌套(fwd-over-fwd)组装完整海森矩阵的计算代价是?
- A.O(n) 时间且只存一个方向
- B.O(n³) 时间但内存恒定不变
- C.O(1) 时间并直接读出矩阵
- D.O(n²) 时间且内存也平方增长← 正确答案
答案:D。前向嵌套每跑一个方向只能拿到一条海森信息,n 个方向拼出完整 n×n 海森,时间 O(n²);二阶影子值沿途要存,内存也随矩阵平方增长。O(n³) 是求逆的代价而非组装代价。
Q4. 要高效计算海森-向量积 H·v,最合适的自动微分模式是?
- A.反向套反向的嵌套自动微分
- B.用有限差分近似梯度后点乘
- C.先反向求梯度再前向求方向导数← 正确答案
- D.先显式组装海森矩阵再相乘
答案:C。fwd-over-rev 先反向拿梯度 ∇f,再沿 v 前向求方向导数,即得 H·v,复杂度 O(n)。rev-over-rev 内存爆炸,显式组装再乘是 O(n²),有限差分还引入截断误差。
Q5. 关于反向-反向嵌套(rev-over-rev),下列说法正确的有?
- A.需要对反向传播再走一遍反向← 正确答案
- B.相比前向嵌套更节省内存开销
- C.需要保存大量中间激活值← 正确答案
- D.通常不用于大规模模型训练← 正确答案
答案:ACD。rev-over-rev 对反向图再做反向,需要保存两层反向的中间激活,内存极大,并不比前向嵌套省内存;因此大规模训练基本不用。套娃比喻:反向本来就要求记住全部原样,再套一层反向等于把仓库翻倍。
Q6. 物理信息神经网络(PINN)训练时,损失函数中的 PDE 残差通常需要?
- A.网络输出的二阶导数项参与← 正确答案
- B.网络输出的一阶梯度就足够
- C.完全不需要任何梯度信息项
- D.必须转为有限差分近似求解
答案:A。热传导等 PDE 的残差如 ∂u/∂t − α∂²u/∂x² 直接含网络输出对空间坐标的二阶导数 u_xx,只能靠嵌套自动微分得到。只有一阶梯度不够,有限差分既不精确也难与反向传播协同。
Q7. 高阶自动微分在数值稳定性上的挑战包括?
- A.病态海森会放大微弱扰动← 正确答案
- B.嵌套层数加深舍入误差累积← 正确答案
- C.高阶梯度可能出现指数爆炸← 正确答案
- D.只要用浮点类型就万事大吉
答案:ABC。病态条件数放大扰动、深层嵌套累积舍入、高阶中间量指数爆炸都是真实挑战。“用浮点就稳”过于天真——浮点是误差来源而非保险,工程上需要阻尼与裁剪。
Q8. 检查点(checkpointing)技术的主要作用是?
- A.减少前向传播的必要次数
- B.使反向传播速度显著提升
- C.保证二阶导数完全无误差
- D.用重算换取更低的中间存储← 正确答案
答案:D。检查点每隔 √T 层存快照、需要时重算中间段,本质是用时间换空间。它不减少前向次数(反而增加重算)、不加快反向、更不保证无误差,只是把内存从 O(T) 压到 O(√T)。
Q9. 元学习算法 MAML 的元梯度通常需要计算什么?
- A.损失对初始参数的海森向量积← 正确答案
- B.模型权重矩阵的二维范数
- C.损失函数对数据的一阶导数
- D.每个训练批次的数据方差
答案:A。MAML 外层目标要对“微调后的损失”求关于初始参数的梯度,展开后出现海森-向量积项,正是 fwd-over-rev 的典型场景。其他选项与元梯度无关。
Q10. 关于计算图展开的性质,下列说法正确的有?
- A.每嵌套一次导数图就新增一层节点← 正确答案
- B.高阶求导会使计算图持续膨胀← 正确答案
- C.展开规模与嵌套层数完全无关
- D.同一 AD 引擎可复用于导数图← 正确答案
答案:ABD。每嵌套一次导数,导数子图作为新一层节点叠加到原图上,计算图必然随嵌套层数膨胀;而同一套 AD 引擎可以对导数图重复调用,这正是嵌套自动微分可行性的基础。C 说“完全无关”显然错误。