Skip to content

算法Algorithm

Hessian–向量积

Hessian-vector product · HVP · Forward-over-reverse differentiation

对反向梯度程序再作一次前向方向微分,逐槽累加 Hessian–向量积,并核对共享节点、成本和二阶光滑性边界。

形式陈述 ​

设标量函数 f:Rn→R 由一个有限、局部稳定的计算图给出,图中各原语在当前原值的邻域内为 C2。给定求值点 x 和固定方向 v,本页算法返回

Hf(x)v=D(∇f)(x)[v].

这里的Hessian是梯度映射的 Jacobian。可以先用反向自动微分计算梯度,再对整个反向程序作前向方向微分,称为 forward-over-reverse。需要的是矩阵对一个方向的作用,不必先列出 n2 个二阶偏导。

状态与局部规则 ​

输入节点 zj=xj,其余节点按拓扑顺序求值:

zi=ϕi(zp(i,1),…,zp(i,ki)),p(i,r)<i,n<i≤n+T.

令最后一个节点为标量输出 f=zn+T。p(i,r) 是第 r 个操作数槽;同一节点可以占多个槽,平方 u⋅u 就有两个槽。对形式参数求偏导后代入原值,记

ci,r=∂rϕi,c˙i,r=∑s=1ki∂rs2ϕiz˙p(i,s).

每个节点保存原值 zi、切向量 z˙i、伴随量 z¯i 和伴随量的方向导数 z¯˙i。后两者含义不同:z¯i 是目标对节点的敏感度,z¯˙i 是该敏感度随输入方向 v 的变化率。

  1. 正向原值与切向量。 置 z˙j=vj,依次计算 zi 及z˙i=∑rci,rz˙p(i,r).保存反向所需原值、切向量和图结构。
  2. 输出种子。 全部 z¯i,z¯˙i 初始化为零,再置 f¯=1。输出种子与输入点无关,所以 f¯˙=0。
  3. 逆序二阶传播。 对 i=n+T,…,n+1,逐槽执行z¯p(i,r)+=z¯ici,r,z¯˙p(i,r)+=z¯˙ici,r+z¯ic˙i,r.一个节点的所有消费者贡献先汇总,再向父节点传播。重复槽也分别累加。
  4. 返回。 返回输入处的 (x¯,x¯˙),分别是 ∇f(x) 与 Hf(x)v。遍历有限图后终止;若原语离开定义域、二阶规则不存在或运算出现非有限值,应返回失败状态,而非把一个任意数值当作 Hessian 作用。

正确性:微分反向程序的每一步 ​

考虑输入路径 x(t)=x+tv。局部稳定性使小 t 下使用同一张图,C2 假设保证其原值和一阶局部导数可沿路径求导。正向归纳给出

z˙i=ddtzi(x(t))|t=0,c˙i,r=ddtci,r(x(t))|t=0.

在每个 x(t) 上,普通反向传播都返回 x¯(t)=∇f(x(t))。它初始化的常数种子导数为零。若在某条逆序指令之前,所有保存的 z¯˙ 都是对应 z¯(t) 的导数,那么对指令

z¯p←z¯p+z¯ici,r

求导,由乘积法则恰得

z¯˙p←z¯˙p+z¯˙ici,r+z¯ic˙i,r.

因此逐条指令归纳保持这一含义,最终

x¯˙=ddt∇f(x+tv)|t=0=Hf(x)v.

证明微分的是整个累加程序,包括旧值 z¯p,所以共享消费者和重复操作数槽不会漏项。只微分局部乘子 ci,r、漏掉 z¯˙ici,r,通常会得到错误结果。

直觉

一阶反向传播把“目标对各节点有多敏感”送回来;二阶传播同时追踪“这些敏感度沿指定方向如何改变”。每条边有两个变化来源:下游送来的伴随量在变,这给出 z¯˙ici,r;边上的局部导数在变,这给出 z¯ic˙i,r。两项共同构成乘积法则。

方向 v 在输入处只选一次。中间节点携带的 z˙i 已经把该方向传到局部原语,反向时无需把 v 再当成新的可变参数求导。输入维数可以很大,但一个方向始终只增加常数份节点状态。

例子与边界

共享节点和平方的两个槽 ​

沿用自动微分页的程序

u=xy,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=xy 中,

x¯˙=2⋅3+13⋅(−1)=−7,y¯˙=2⋅2+13⋅1=17.

其中来自 b 的 x¯=1 是常数,方向导数为零。独立展开 f=x2y2+xy+x,可得

Hf(2,3)=(1825258),Hf(2,3)(1−1)=(−717).

这同时核对了传播结果和平方的重复槽。vTHfv=−24 还说明此点存在负曲率;算法返回 Hessian 的作用,不附带正定保证。

光滑性、执行迹和精度 ​

若使用 ReLU 等分段线性原语,避开切换面的固定区域内可以应用相应二阶规则;在不可微点,框架选定的一阶约定再求导并不自动构成经典 Hessian。含分支或循环的程序同样需要邻域内稳定的有限执行迹,仅在当前点运行成功不够。

“精确 Hessian–向量积”通常指精确实数算术下无差分截断误差的恒等式。浮点执行仍有舍入、溢出和相消;二阶局部导数甚至可能比一阶量更大。也不能把近似或错误的自定义一阶反向规则当作真实梯度再求导,便宣称得到原函数的 Hessian。

推论与应用

成本与完整矩阵的区别 ​

若每个原语的元数有统一常数上界,且原值、全部局部一阶及二阶导数都可用有界工作算出,则每个槽只处理常数次。一次方向传播连同原值求值、初始化和输出的时间为 O(T+n),朴素保存全部四类节点状态的存储也为 O(T+n)。局部小原语的二阶表可显式求出;这里避免的是整个输入空间的 n×n Hessian。

若把大矩阵乘法或线性求解封装成一个原语,应计入它及其导数规则的实际成本,不能将一次函数调用计作常数。逐个输入坐标取 v=ej 可以获得 Hessian 各列;连续执行 n 次的时间为 O(nT+n2),写出完整矩阵本身就需 n2 个数。只需少数方向时,形成所有列通常是多余工作。

二阶优化的算子接口 ​

共轭梯度法每步只调用矩阵乘向量。若当前实 Hessian 正定,就可用本页算法提供 Newton 系统 Hfp=−∇f 的矩阵作用,而不形成稠密 Hessian。本例的 Hessian 不定,不能直接套用普通 CG 的正定收敛定理;需要另行规定曲率处理或选择适合不定系统的求解方法。

大型原语也可以有自己的导数接口。线性求解的离散伴随把一次可逆求解的反向传播化为转置方程,其数学对象是精确方程解。若进一步组合求导,仍须核对该接口的光滑性和数值求解精度;把未收敛迭代直接声明为精确求解,会改变本页证明所依赖的局部规则。

参考资料
关系图谱10 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组