想象一间物流分拣中心:包裹从入口皮带上线,依次经过翻转、分流、合并等传送带,最终到达出货口。主管想知道——如果在入口把包裹多推一厘米,它在出口的位置会偏移多少?普通的做法是反复做实验:推一次量一次,慢且带误差。聪明的做法是:包裹上线那一刻就贴一张“灵敏度跟单”,上面记着“入口每多推一厘米,我当前位置偏多少”。包裹每过一段传送带,机器就按这段的动作自动更新跟单数字。等包裹到出口,跟单上的数字就是整个系统对入口推力的总敏感度。 这就是前向模式自动微分(Forward Mode):函数值(包裹位置)和导数值(跟单数字)沿同一个方向同步前进,一遍走完,两者同时到站。你可能会问:那大名鼎鼎的“反向传播”呢?它就像事后追溯——货物出了问题,专员从出口倒查每个环节的影响系数。两种思路各有适合的场景,本文就用这条分拣流水线,带你看懂前向模式的原理、优劣、应用,以及如何用代码实现它。

岗位关联

前向模式是自动微分家族的另一半。理解它,你才懂得在AI编译器、科学计算、金融风控中该选哪种求导策略,而不是只迷信反向传播。

目录
  1. 可视化演示
  2. 前向模式初探
  3. 计算图基石
  4. 导数传播机制
  5. 前向反向对比
  6. 雅可比矩阵
  7. 敏感性分析
  8. 工程实现
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

前向模式初探

回到分拣中心。包裹从入口上线时被贴上一张跟单,上面最初只有一行字:“入口每多推一厘米,我现在的位置偏一厘米”——也就是导数值 1。包裹每经过一段传送带,操作员按照这段传送带的动作更新跟单:遇到“翻转方向”就换号乘系数,遇到“两条线合并”就把两路影响加起来。重点在于:包裹本身(值)和跟单(导数)从不分开,一起走完全程。这就是前向模式最朴素的定义——从输入端出发,沿计算方向同步求函数值和导数值。

技术上说,我们不再把“求导”当成一个独立的后处理步骤,而是把每个参与计算的变量扩展成一对数字:(值, 导数)。从输入变量开始,导数的初始值由“你想对谁求导”决定(想对哪个输入求偏导,就把它的导数分量设为1,其余为0),这个初始值称为种子。此后每执行一次运算,值按普通规则算,导数按微积分法则同步更新,直到输出端。

v˙i=∑j<i∂vi∂vj⋅v˙j\dot{v}_i = \sum_{j < i} \frac{\partial v_i}{\partial v_j} \cdot \dot{v}_j

1. 灵敏度符号:$\dot{v}_i$ 表示节点 $v_i$ 对输入 $x$ 的导数。在流水线里,它就是跟单上“入口每多推一厘米,我在当前节点偏移多少”。

v˙i\dot{v}_i

2. 前驱集合:$j < i$ 表示所有直接参与计算出 $v_i$ 的上一级节点。如同传送带上紧挨着的前一段操作。

j<ij < i

3. 局部导数:$\dfrac{\partial v_i}{\partial v_j}$ 是当前节点算子对它的某个输入的偏导。比如节点是乘法器 $v_i = v_j \cdot v_k$,对 $v_j$ 的局部导数就是另一个因子 $v_k$。

∂vi∂vj\frac{\partial v_i}{\partial v_j}

4. 相乘累加:把“局部导数 × 前驱跟单值”对每个前驱算一遍再加总,得到当前节点的总灵敏度。

∑j<i∂vi∂vj⋅v˙j\sum_{j < i} \frac{\partial v_i}{\partial v_j} \cdot \dot{v}_j

跟单从入口一路贴上出口,没有回头路,也没有重复劳动。这正是前向模式的优雅之处:一遍遍历,值和导数同时到站。

计算图基石

分拣中心不会把传送带随便接,主管手里有一张流水线图纸:每个圆圈代表一段操作(翻转、分流、合并),每条箭头代表包裹从一个操作流向另一个操作。这张图纸就是计算图——用有向无环图(DAG)描述“先算什么、再算什么”。节点是加减乘除等基本算子,边是数据依赖。

在计算图中,包裹的流动路径由拓扑顺序决定。所谓拓扑顺序,就是保证计算某个节点之前,它的所有前驱都已经算完。这就像流水线安装规则:前面的传送带不会依赖后面的机器。前向模式恰好沿这个拓扑顺序走一遍:走到哪个节点,就算这个节点的值和跟单,然后继续向后。整个过程不需要跳来跳去,也不需要反复扫描。

dydx=dydu⋅dudx\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}

1. 中间变量:$\dfrac{du}{dx}$ 是中间变量 $u$ 对输入 $x$ 的导数,即跟单传进当前段之前的值。

dudx\frac{du}{dx}

2. 输出对中间量:$\dfrac{dy}{du}$ 是本段算子对输入的局部导数,如同翻转机把 $u$ 的变化放大或缩小的系数。

dydu\frac{dy}{du}

3. 乘积合成:两段相乘得到 $\dfrac{dy}{dx}$。它说明:整条线的总敏感度 = 每一段传送带敏感度的乘积。

dydu⋅dudx\frac{dy}{du} \cdot \frac{du}{dx}

有了计算图这张“图纸”,前向模式就变成一个确定性流程:按拓扑顺序遍历节点,每处只更新一次跟单。图纸越清晰,遍历就越省力。

导数传播机制

跟单是如何在一段传送带上被更新的?假设当前段是一个乘法器:两个输入分别是 $a$ 和 $b$,输出是 $a \times b$。如果 $a$ 的跟单是“入口每推1厘米,$a$ 偏 $da$”,$b$ 的跟单是“入口每推1厘米,$b$ 偏 $db$”,那么输出值的偏移量按乘法法则就是 $a \cdot db + b \cdot da$。本质上,每一段都在做同一件事:用局部导数乘以前驱传来的灵敏度,再按节点规则相加。

这个机制在数学上有一个非常漂亮的载体——对偶数。对偶数写成 $a + b\varepsilon$ 的形式,其中 $a$ 是普通值,$b$ 是导数,$\varepsilon$ 是一个特殊记号,满足 $\varepsilon^2 = 0$。你只需要把普通运算的规则原样搬到对偶数上,导数就会像变魔术一样自动出现。

(a+bε)⋅(c+dε)=ac+(ad+bc)ε(a + b\varepsilon) \cdot (c + d\varepsilon) = ac + (ad + bc)\varepsilon

1. 值相乘:普通部分 $a \times c$ 作为结果的值,对应包裹在新位置的坐标。

a⋅ca \cdot c

2. 交叉项:$a \cdot d\varepsilon + b \cdot c\varepsilon$ 是导数部分的贡献,来自“左值变动×右值”和“右值变动×左值”两条路径。这正是乘法法则 $f'g + fg'$。

(ad+bc)ε(ad + bc)\varepsilon

3. 高阶项消失:$b\varepsilon \cdot d\varepsilon = bd \cdot \varepsilon^2 = 0$,因为 $\varepsilon^2 = 0$。这保证导数是精确的一阶结果,不含近似项。

bdε2=0bd\varepsilon^2 = 0

正因 $\varepsilon^2 = 0$,对偶数能在一次运算中同时携带“位置”与“灵敏度”,且不会有噪声。可以说,跟单不是额外派的人工,而是包裹自带的一张“芯片”。

前向反向对比

现在请出另一种求导思路——反向模式。如果说前向模式是“跟单随包裹走”,反向模式就是“事后追责专员”:货物在出口出了偏差,专员倒着走回流水线,逐段询问“你在哪一步受到过影响”。反向模式从输出出发,把误差信号(梯度)沿计算图倒推回每个输入。

两种模式各有代价。前向模式每播一次只服务“一个输入方向”:想求 $m$ 个输入各自的导数,就要播 $m$ 次。反向模式每播一次只服务“一个输出方向”:想求 $n$ 个输出对输入的完整导数,就要播 $n$ 次。于是有了著名的取舍法则:

Tforward=m⋅O(∣E∣),Tbackward=n⋅O(∣E∣)T_{\text{forward}} = m \cdot O(|E|), \qquad T_{\text{backward}} = n \cdot O(|E|)

1. 边数成本:$O(|E|)$ 表示一次传播的成本约等于计算图的边数,即传送带段数。

O(∣E∣)O(|E|)

2. 输入维数:$m$ 是输入变量个数。前向模式需要 $m$ 次遍历,每次对应对一个输入方向的种子。

m⋅O(∣E∣)m \cdot O(|E|)

3. 输出维数:$n$ 是输出变量个数。反向模式需要 $n$ 次遍历,每次对应一个输出的梯度回传。

n⋅O(∣E∣)n \cdot O(|E|)

所以训练神经网络时,参数 $m$ 动辄上亿,而损失函数只有一个输出($n=1$),反向模式完胜;反过来,当你要算“少数几个关键输入对成百上千个输出的影响”,前向模式反而更划算。跟单和追责,各有各的主场。

雅可比矩阵

现实中一个流水线往往有多条输入线、多个出货口。主管想系统性地回答:每个入口推一厘米,每个出口各偏多少?把答案排成一张表——行是出口,列是入口——就得到了雅可比矩阵。

前向模式天然是“填列”高手:播一次种(把某个入口的种子设为1,其余输入为0),跟单会传到所有出口,于是雅可比矩阵的一整列全部填好。重复 $m$ 次,矩阵就完整了。反向模式则相反,一次回传填一行(某个出口对所有输入的偏导)。这就是“前向填列、反向填行”的直觉记忆。

J∗,i=[∂f1∂xi∂f2∂xi⋮∂fn∂xi]J_{\ast, i} = \begin{bmatrix} \dfrac{\partial f_1}{\partial x_i} \\ \dfrac{\partial f_2}{\partial x_i} \\ \vdots \\ \dfrac{\partial f_n}{\partial x_i} \end{bmatrix}

1. 第 $i$ 个输入:$x_i$ 是播种对象,种子导数设为1,代表“让这个入口以单位速度变化”。

xix_i

2. 所有输出求偏导:$f_1, f_2, \ldots, f_n$ 是 $n$ 个出口的取值函数,跟单把灵敏度传到每一个出口。

∂fk∂xi,k=1,…,n\frac{\partial f_k}{\partial x_i}, \quad k = 1, \ldots, n

3. 列向量:把它们纵向排列就是矩阵第 $i$ 列。$m$ 次传播后,$m$ 列拼成完整雅可比矩阵。

[∂f1∂xi⋮∂fn∂xi]\begin{bmatrix} \dfrac{\partial f_1}{\partial x_i} \\ \vdots \\ \dfrac{\partial f_n}{\partial x_i} \end{bmatrix}

如果雅可比矩阵是稀疏的——大部分入口对大部分出口没有影响——还可以结合图结构跳过无关路径。选对填表方式,比埋头硬算重要得多。

敏感性分析

分拣主管最关心风险管理:如果某个入口的推力波动了,哪些出货口的配送时效会大受影响?这本质上是敏感性分析——用导数衡量输出对输入的响应程度。由于通常只有少数几个关键参数(如温度、湿度、机器速度),却有大量监控指标,这正是前向模式的高光舞台:播种少量输入,一口气读出所有输出端的灵敏度。

直接读导数还不够直观,因为量纲不同:“温度每升1度,产出下降3件”和“速度每加1档,产出上升200件”很难直接比较。工程上常用弹性系数做归一化:

S=xy⋅∂y∂xS = \frac{x}{y} \cdot \frac{\partial y}{\partial x}

1. 原始灵敏度:$\dfrac{\partial y}{\partial x}$ 是输出对输入的绝对变化率,也就是跟单上的原始数字。

∂y∂x\frac{\partial y}{\partial x}

2. 放大效应:乘上 $x$,强调取值较大的参数即便导数不大,也可能带来更大的绝对波动。

x⋅∂y∂xx \cdot \frac{\partial y}{\partial x}

3. 归一化:除以 $y$,得到“输入变动1%,输出变动百分之几”,使不同量纲的参数可以直接排序。

xy⋅∂y∂x\frac{x}{y} \cdot \frac{\partial y}{\partial x}

把各参数的弹性系数排序,主管就能把有限的检修资源投给影响最大的环节。跟单不只是给工程师看的,更是给决策者看的报表。

工程实现

如何把“贴跟单”变成自动化的流水线?答案是对操作符重载:把浮点数替换成对偶数类型 Dual,加减乘除等运算符在内部同时更新值部分和导数部分。业务代码几乎不用改,只是把变量类型换一下,前面写的所有公式便自动生效。

在AI编译器和科学计算框架中,前向模式通常作为计算图的一种 切线模式 实现:对算子做 JVP(Jacobian-vector product,雅可比向量积)变换,把一个“扰动方向”从输入传到输出。编译器会做常量折叠和内联优化——跟单数字是0的变量在编译期就被剔除,减少运行时开销。

∂y∂x=∂fk∂vk−1⋅∂vk−1∂vk−2⋯∂v1∂x\frac{\partial y}{\partial x} = \frac{\partial f_k}{\partial v_{k-1}} \cdot \frac{\partial v_{k-1}}{\partial v_{k-2}} \cdots \frac{\partial v_1}{\partial x}

1. 路径展开:$v_1 \to v_2 \to \cdots \to v_k$ 是计算图上从输入到输出的一条路径。

v1,v2,…,vkv_1, v_2, \ldots, v_k

2. 逐段局部导数:每个 $\dfrac{\partial v_i}{\partial v_{i-1}}$ 是段内算子对输入的偏导,由重载运算符自动算出。

∂vi∂vi−1\frac{\partial v_i}{\partial v_{i-1}}

3. 连乘:所有局部导数连乘成总导数,这就是跟单一路累乘到底的数学形态。

∏i=1k∂vi∂vi−1\prod_{i=1}^{k} \frac{\partial v_i}{\partial v_{i-1}}

流水线一旦装上“自动贴单机”,工程师只需关心业务逻辑,求导变成数据类型的天然属性。这正是前向模式工程化的魅力:把数学藏进类型系统,让复杂机制对用户隐身。

AI 应用场景

金融衍生品风险因子敏感性分析

阶段:模型风险评估与特征敏感性分析

解决的问题:期权组合往往有成百上千个盯市输出(不同到期日、行权价的合约价值),但风险因子只有少数几个(标的价、波动率、利率)。传统方法用有限差分逐个扰动参数,慢且有截断误差;用前向模式对每个风险因子播种一次,就能同时得到所有合约的敏感度(Greeks),精确且快。

具体案例:某量化团队每天收盘后需要计算 200 个期权合约对“标的资产价格”和“隐含波动率”的 Delta、Vega。用前向模式实现后,原本 400 次差分计算缩减为 2 次前向传播,且结果精确到机器精度。

机器人动力学参数辨识

阶段:物理仿真与参数估计

解决的问题:机器人关节力矩方程的输出是多个关节力矩(高维输出),需要辨识的物理参数(质量、质心、惯性张量)并不多(低维输入)。前向模式一次传播填一列雅可比,正好高效计算“参数→力矩”的敏感度矩阵。

具体案例:某仿人机器人团队要标定机械臂三个连杆的质量。他们将动力学方程接入对偶数类型,用前向模式在 5 秒内算完 6 组运动轨迹下的完整雅可比矩阵,再配合最小二乘完成参数辨识。

AI编译器中的求导模式选择

阶段:编译优化与算子融合

解决的问题:现代AI框架支持混合自动微分——编译器分析计算图的输入、输出维度,自动选择前向或反向模式。前向模式特别适合处理“多个小输出依赖少输入”的子图,如损失函数前的正则项、模型内部的雅可比向量积。

具体案例:某训练框架在计算 NTK(神经正切核)相关指标时,需要频繁计算“单输入→多隐藏层输出”的导数。编译器识别到该子图输入维度为1,自动切换为前向模式,训练加速约 30%。

Python 演示

python64 行
class Dual:    """对偶数:值为 value,导数为 derivative。"""     def __init__(self, value=0.0, derivative=1.0):        self.value = value        self.derivative = derivative     def __add__(self, other):        if isinstance(other, Dual):            return Dual(self.value + other.value,                        self.derivative + other.derivative)        return Dual(self.value + other, self.derivative)     def __radd__(self, other):        return self.__add__(other)     def __sub__(self, other):        if isinstance(other, Dual):            return Dual(self.value - other.value,                        self.derivative - other.derivative)        return Dual(self.value - other, self.derivative)     def __mul__(self, other):        if isinstance(other, Dual):            return Dual(self.value * other.value,                        self.derivative * other.value +                        self.value * other.derivative)        return Dual(self.value * other, self.derivative * other)     def __rmul__(self, other):        return self.__mul__(other)     def __pow__(self, n):        return Dual(self.value ** n,                    n * self.value ** (n - 1) * self.derivative)  def f(x):    """示例函数:f(x) = (x + 2)^2 * 3 - 5,导数应为 6*(x+2)。"""    return (x + 2) ** 2 * 3 - 5  def f_vec(x0, x1):    """向量函数:f = [x0^2 + 3*x1, x0*x1]。"""    return [x0 * x0 + 3 * x1, x0 * x1]  if __name__ == "__main__":    x = Dual(2.0, 1.0)  # 种子:对 x 求导    y = f(x)    print("f(2) =", y.value)    print("f'(2) =", y.derivative)  # 应为 24     # 计算雅可比矩阵第 1 列:对 x0 求偏导    a = Dual(2.0, 1.0)    b = Dual(1.0, 0.0)    out = f_vec(a, b)    print("Jacobian 第1列:", [o.derivative for o in out])     # 第 2 列:对 x1 求偏导    a = Dual(2.0, 0.0)    b = Dual(1.0, 1.0)    out = f_vec(a, b)    print("Jacobian 第2列:", [o.derivative for o in out])
目的:用约 60 行实现一个微型前向模式自动微分库,展示“值和导数同步传播”的全部核心机制。
  1. class Dual:定义对偶数类型,每个数自带 value 和 derivative 两个字段,相当于“包裹 + 跟单”。
  2. __add__重载加法:值相加,导数也相加(和的导数等于导数之和)。
  3. __mul__乘法法则:f'g + fg',对应跟单在两个输入相乘时的交叉更新规则。
  4. __pow__幂运算 x^n 的导数为 n*x^(n-1),自动乘上已有的导数。
  5. Dual(2.0, 1.0)播种:把输入值设为2,种子导数设为1,表示“就对这个变量求导”。
  6. y.derivative取最终跟单数字,即想要的导数值。

常见误区

误区“前向模式不就是神经网络里的 forward pass 吗?训练时先正向算出 loss,再反向传播梯度。”初学者常把两者的“方向”混为一谈。

正解前向传播(forward pass)只计算函数值,不包含任何求导;而前向模式自动微分在计算值的同时,用对偶数同步计算导数。反向传播是反向模式自动微分,和前向模式是两种求导策略,不是“前向”与“反向”在神经网络训练中的对应关系。

为何常见:两者都含“前向”二字,且深度学习教程中“正向传播+反向传播”的配对深入人心。

误区“反向传播是自动微分的黄金标准,前向模式只是教学玩具,实际用不上。”

正解复杂度取决于输入数 $m$ 和输出数 $n$。前向成本 $O(m)$,反向成本 $O(n)$。当输入远少于输出时(如单参数对上千指标的敏感性分析),前向模式更快更省内存;现代框架甚至混合使用两种模式。

为何常见:深度学习里参数极多、损失是标量,反向模式占绝对主导,让人误以为它处处最优。

误区“前向模式就是 `(f(x+h)-f(x))/h` 那种数值近似吧?反正都是往前算一步。”

正解数值差分有截断误差和舍入误差,步长 $h$ 选不好结果就废了。前向模式基于对偶数代数,$\varepsilon^2 = 0$ 保证结果精确到机器浮点精度,与步长无关。

为何常见:两者都“从输入往输出走”且形式上很像“切线”,容易混淆。

误区“前向模式一次只能算一个导数,多个输入就要跑很多次,太鸡肋了。”

正解种子可以是一个向量,不限于单位基向量。把种子设成任意方向 $v$,一次前向模式计算的就是雅可比向量积 $Jv$,这在优化和科学计算中非常有用;计算完整雅可比时,也只需 $m$ 次(输入维度)而非逐元素次数。

为何常见:教材多用单变量例子,容易让人把“种子为1”误当成唯一用法。

误区“既然训练用的是反向传播,那前向模式跟深度学习八竿子打不着。”

正解深度学习框架内部大量用到前向模式:二阶导(Hessian-vector product)、NTK 计算、正则化项梯度、对输入扰动敏感的对抗样本分析等,都需要把前向模式作为基础算子嵌入编译流程。AI编译器工程师必须同时精通两者。

为何常见:应用层用户只开关自动微分,看不到编译器内部的混合求导策略。

面试题

Q1. 前向模式自动微分最核心的特征是?

单选题 · easy

  • A.从输出向输入反向追溯梯度
  • B.从输入到输出同步算值和导数← 正确答案
  • C.用差分近似代替精确导数计算
  • D.只计算函数值不计算导数信息

答案:B。前向模式沿着计算方向从输入到输出流动,每个节点同时更新值和导数。A 是反向模式;C 是数值差分;D 只是普通前向传播,三者都不是前向模式的定义。

Q2. 对偶数 \(a + b\varepsilon\) 中,\(\varepsilon\) 的关键性质是?

单选题 · easy

  • A.数值上等同于一个无穷小量
  • B.它的平方严格等于零← 正确答案
  • C.它的数值等于一
  • D.它表示一个随机噪声

答案:B。对偶数的定义就是 \(\varepsilon^2 = 0\),这使得二阶及以上项自动消失,导数精确出现。无穷小量属于非标准分析,数值为1或随机噪声都与对偶数无关。

Q3. 用前向模式求 \(f(x) = x^2 + 3x\) 在 \(x=2\) 处的导数,将 \(x\) 播种为 Dual(2, 1),最终导数项的值为?

单选题 · mid

  • A.数值为 5
  • B.数值为 7← 正确答案
  • C.数值为 8
  • D.数值为 10

答案:B。按对偶数法则:\(x^2\) 在 \(x=2\) 的导数为 \(2 \times 2 \times 1 = 4\);\(3x\) 的导数为 \(3 \times 1 = 3\);相加得 7。这也等于解析结果 \(f'(2) = 2 \times 2 + 3 = 7\)。

Q4. 完整计算一个 5 输入、100 输出的雅可比矩阵,前向模式大约需要多少次传播?

单选题 · mid

  • A.大约 5 次← 正确答案
  • B.大约 100 次
  • C.大约 105 次
  • D.大约 500 次

答案:A。前向模式每次播种一个输入方向,填雅可比矩阵的一列。5 个输入需 5 次传播;反向模式每次回传一个输出,才需要 100 次。这正是“输入少输出多选前向”的典型场景。

Q5. 反向模式自动微分的计算成本主要取决于什么?

单选题 · mid

  • A.输入变量的个数
  • B.输出变量的个数← 正确答案
  • C.计算图的深度
  • D.计算图的宽度

答案:B。反向模式从每个输出回传一次,成本正比于输出数 \(n\)。输入数决定前向模式成本,深度和宽度影响单次传播开销但不决定模式选择。

Q6. 用前向模式在 \(x=2\) 处求 \(y = (x+2)^2 \cdot 3 - 5\) 的导数,种子 \(x'=1\),最终导数是多少?

单选题 · hard

  • A.结果为 12
  • B.结果为 18
  • C.结果为 24← 正确答案
  • D.结果为 43

答案:C。逐段跟单:\(v_1 = x+2\) 处 \(v_1' = 1\);\(v_2 = v_1^2\) 处 \(v_2' = 2 \times 4 \times 1 = 8\);\(v_3 = 3v_2\) 处 \(v_3' = 24\);\(y = v_3 - 5\) 导数不变仍为 24。解析式 \(y' = 6(x+2)\) 在 \(x=2\) 处同样得 24。

Q7. 关于前向模式和反向模式的复杂度对比,正确的说法是?

单选题 · hard

  • A.前向模式随输出维度线性增长
  • B.前向模式随输入维度线性增长← 正确答案
  • C.反向模式随输入维度线性增长
  • D.前向模式复杂度与边数无关

答案:B。前向模式每播一次针对一个输入方向,\(m\) 个输入需 \(m\) 次遍历,复杂度 \(O(m \cdot |E|)\);反向模式 \(O(n \cdot |E|)\),随输出维度增长。两者都与边数线性相关。

Q8. 以下哪些属于前向模式的优势场景?

多选题 · mid

  • A.输入维度远小于输出维度← 正确答案
  • B.输出维度远小于输入维度
  • C.对少量关键参数做敏感度分析← 正确答案
  • D.用反向传播训练大型神经网络

答案:AC。前向模式成本正比于输入数,输入少输出多时效率高;敏感度分析正是“少量参数、大量指标”。B 和 D 是反向模式的经典主场,选它们会南辕北辙。

Q9. 在前向模式中,把某个输入变量 \(x\) 的种子导数设为 1,表示?

单选题 · easy

  • A.让 \(x\) 的取值固定不变
  • B.忽略 \(x\) 对输出的影响
  • C.对 \(x\) 求偏导并追踪其影响← 正确答案
  • D.把 \(x\) 变成常量处理

答案:C。种子为 1 意味着“让 \(x\) 以单位速度变化,其他输入静止”,于是所有输出端跟单累加出的导数正是对 \(x\) 的偏导。种子为 0 才是忽略该输入。

Q10. 关于前向模式与反向模式的混用,下列说法正确的是?

多选题 · hard

  • A.两种模式可作用于同一计算图的不同部分← 正确答案
  • B.现代框架按输入输出维度自动选择模式← 正确答案
  • C.反向模式效率永远高于前向模式
  • D.混合策略用于高阶导可减少计算量← 正确答案

答案:ABD。混合自动微分(如前向套反向求二阶导)是成熟技术;编译器确实会按 \(m\) 与 \(n\) 的比例自动切换。C 错在“永远”——输入远少于输出时前向模式更高效。