形式陈述
设标量函数 f : R n → R 由一个有限、局部稳定的计算图给出,图中各原语在当前原值的邻域内为 C 2 。给定求值点 x 和固定方向 v ,本页算法返回
H f ( x ) v = D ( ∇ f ) ( x ) [ v ] . 这里的Hessian 理路 Hessian 矩阵 Hessian matrix · Hessian 标量函数二阶 Fréchet 导数在坐标中的矩阵表示,用于描述局部曲率与二次近似。 是梯度映射的 Jacobian。可以先用反向自动微分 理路 自动微分 Automatic differentiation · Algorithmic differentiation 在有限计算图上逐槽传播切向量与累加伴随量,以线性于程序长度的工作计算一个 Jacobian 向量积或转置向量积。 计算梯度,再对整个反向程序作前向方向微分,称为 forward-over-reverse。需要的是矩阵对一个方向的作用,不必先列出 n 2 个二阶偏导。
状态与局部规则
输入节点 z j = x j ,其余节点按拓扑顺序求值:
z i = ϕ i ( z p ( i , 1 ) , … , z p ( i , k i ) ) , p ( i , r ) < i , n < i ≤ n + T . 令最后一个节点为标量输出 f = z n + T 。p ( i , r ) 是第 r 个操作数槽;同一节点可以占多个槽,平方 u ⋅ u 就有两个槽。对形式参数求偏导后代入原值,记
c i , r = ∂ r ϕ i , c ˙ i , r = ∑ s = 1 k i ∂ r s 2 ϕ i z ˙ p ( i , s ) . 每个节点保存原值 z i 、切向量 z ˙ i 、伴随量 z ¯ i 和伴随量的方向导数 z ¯ ˙ i 。后两者含义不同:z ¯ i 是目标对节点的敏感度,z ¯ ˙ i 是该敏感度随输入方向 v 的变化率。
正向原值与切向量。 置 z ˙ j = v j ,依次计算 z i 及z ˙ i = ∑ r c i , r z ˙ p ( i , r ) . 保存反向所需原值、切向量和图结构。
输出种子。 全部 z ¯ i , z ¯ ˙ i 初始化为零,再置 f ¯ = 1 。输出种子与输入点无关,所以 f ¯ ˙ = 0 。
逆序二阶传播。 对 i = n + T , … , n + 1 ,逐槽执行z ¯ p ( i , r ) + = z ¯ i c i , r , z ¯ ˙ p ( i , r ) + = z ¯ ˙ i c i , r + z ¯ i c ˙ i , r . 一个节点的所有消费者贡献先汇总,再向父节点传播。重复槽也分别累加。
返回。 返回输入处的 ( x ¯ , x ¯ ˙ ) ,分别是 ∇ f ( x ) 与 H f ( x ) v 。遍历有限图后终止;若原语离开定义域、二阶规则不存在或运算出现非有限值,应返回失败状态,而非把一个任意数值当作 Hessian 作用。
正确性:微分反向程序的每一步
考虑输入路径 x ( t ) = x + t v 。局部稳定性使小 t 下使用同一张图,C 2 假设保证其原值和一阶局部导数可沿路径求导。正向归纳给出
z ˙ i = d d t z i ( x ( t ) ) | t = 0 , c ˙ i , r = d d t c i , r ( x ( t ) ) | t = 0 . 在每个 x ( t ) 上,普通反向传播都返回 x ¯ ( t ) = ∇ f ( x ( t ) ) 。它初始化的常数种子导数为零。若在某条逆序指令之前,所有保存的 z ¯ ˙ 都是对应 z ¯ ( t ) 的导数,那么对指令
z ¯ p ← z ¯ p + z ¯ i c i , r 求导,由乘积法则恰得
z ¯ ˙ p ← z ¯ ˙ p + z ¯ ˙ i c i , r + z ¯ i c ˙ i , r . 因此逐条指令归纳保持这一含义,最终
x ¯ ˙ = d d t ∇ f ( x + t v ) | t = 0 = H f ( x ) v . 证明微分的是整个累加程序,包括旧值 z ¯ p ,所以共享消费者和重复操作数槽不会漏项。只微分局部乘子 c i , r 、漏掉 z ¯ ˙ i c i , r ,通常会得到错误结果。
直觉
一阶反向传播把“目标对各节点有多敏感”送回来;二阶传播同时追踪“这些敏感度沿指定方向如何改变”。每条边有两个变化来源:下游送来的伴随量在变,这给出 z ¯ ˙ i c i , r ;边上的局部导数在变,这给出 z ¯ i c ˙ i , r 。两项共同构成乘积法则。
方向 v 在输入处只选一次。中间节点携带的 z ˙ i 已经把该方向传到局部原语,反向时无需把 v 再当成新的可变参数求导。输入维数可以很大,但一个方向始终只增加常数份节点状态。
例子与边界
共享节点和平方的两个槽
沿用自动微分页的程序
u = x y , a = u ⋅ u , b = u + x , f = a + b , 取 ( x , y ) = ( 2 , 3 ) 、v = ( 1 , − 1 ) 。完成两次遍历后的账本为:
节点
z
z ˙
z ¯
z ¯ ˙
x
2
1
40
− 7
y
3
− 1
26
17
u
6
1
13
2
a
36
12
1
0
b
8
2
1
0
f
44
14
1
0
反向处理 f 与加法节点 b 时,局部偏导均为常数,因此不会产生二阶局部项。在 a = u ⋅ u 中,两个槽的局部导数都等于另一个槽的原值 u = 6 ,方向导数都为 u ˙ = 1 。每个槽向 u ¯ 加 6 、向 u ¯ ˙ 加 1 ,加上 b 的一阶贡献,得到 u ¯ = 13 , u ¯ ˙ = 2 。
最后在 u = x y 中,
x ¯ ˙ = 2 ⋅ 3 + 13 ⋅ ( − 1 ) = − 7 , y ¯ ˙ = 2 ⋅ 2 + 13 ⋅ 1 = 17. 其中来自 b 的 x ¯ = 1 是常数,方向导数为零。独立展开 f = x 2 y 2 + x y + x ,可得
H f ( 2 , 3 ) = ( 18 25 25 8 ) , H f ( 2 , 3 ) ( 1 − 1 ) = ( − 7 17 ) . 这同时核对了传播结果和平方的重复槽。v T H f v = − 24 还说明此点存在负曲率;算法返回 Hessian 的作用,不附带正定保证。
光滑性、执行迹和精度
若使用 ReLU 等分段线性原语,避开切换面的固定区域内可以应用相应二阶规则;在不可微点,框架选定的一阶约定再求导并不自动构成经典 Hessian。含分支或循环的程序同样需要邻域内稳定的有限执行迹,仅在当前点运行成功不够。
“精确 Hessian–向量积”通常指精确实数算术下无差分截断误差的恒等式。浮点执行仍有舍入、溢出和相消;二阶局部导数甚至可能比一阶量更大。也不能把近似或错误的自定义一阶反向规则当作真实梯度再求导,便宣称得到原函数的 Hessian。
推论与应用
成本与完整矩阵的区别
若每个原语的元数有统一常数上界,且原值、全部局部一阶及二阶导数都可用有界工作算出,则每个槽只处理常数次。一次方向传播连同原值求值、初始化和输出的时间为 O ( T + n ) ,朴素保存全部四类节点状态的存储也为 O ( T + n ) 。局部小原语的二阶表可显式求出;这里避免的是整个输入空间的 n × n Hessian。
若把大矩阵乘法或线性求解封装成一个原语,应计入它及其导数规则的实际成本,不能将一次函数调用计作常数。逐个输入坐标取 v = e j 可以获得 Hessian 各列;连续执行 n 次的时间为 O ( n T + n 2 ) ,写出完整矩阵本身就需 n 2 个数。只需少数方向时,形成所有列通常是多余工作。
二阶优化的算子接口
共轭梯度法 理路 共轭梯度法 Conjugate gradient method · CG method 在 Hermitian 正定系统的 Krylov 子空间中最小化能量误差,以三项递推获得共轭方向和短存储迭代。 每步只调用矩阵乘向量。若当前实 Hessian 正定,就可用本页算法提供 Newton 系统 H f p = − ∇ f 的矩阵作用,而不形成稠密 Hessian。本例的 Hessian 不定,不能直接套用普通 CG 的正定收敛定理。Steihaug 截断 CG 理路 Steihaug 截断共轭梯度 Steihaug–Toint truncated CG · Truncated conjugate gradient trust-region method 只用对称矩阵的向量积沿 CG 路径降低二次模型,并在负曲率、信赖边界或小模型残差处给出不同退出状态。 只调用 H v ,沿当前搜索方向在非正曲率或半径越界时截到球面,给出可供信赖域外层检验的模型步。
大型原语也可以有自己的导数接口。线性求解的离散伴随 理路 线性求解的离散伴随 Linear solve adjoint · Discrete adjoint of a linear system · Implicit differentiation of a linear solve 从参数化线性方程推导切向与转置伴随求解,复用LU因子计算标量目标梯度,并区分精确解导数与有限迭代程序导数。 把一次可逆求解的反向传播化为转置方程,其数学对象是精确方程解。若进一步组合求导,仍须核对该接口的光滑性和数值求解精度;把未收敛迭代直接声明为精确求解,会改变本页证明所依赖的局部规则。
参考资料