前向自动微分

前向自动微分既不是数值微分,也不是符号微分,但在某些方面,它是他们的爱情结晶。它依赖对偶数。对偶数是奇怪但迷人的,是 a + b\epsilon 形式的数,这里ab是实数,\epsilon 是无穷小的数,满足 \epsilon ^ 2 = 0,但 \epsilon \ne 0。你可以认为对偶数 42 + 24\epsilon 类似于有着无穷个 0 的 42.0000⋯000024(但当然这是简化后的,仅仅给你对偶数什么的想法)。一个对偶数在内存中表示为一个浮点数对,例如,42 + 24\epsilon 表示为(42.0, 24.0)

对偶数可相加、相乘、等等操作,正如公式 D-3 所示。

E_D-3

最重要的,可证明h(a + bϵ) = h(a) + b × h'(a)ϵ,所以计算一次h(a + ϵ)就得到了两个值h(a)h'(a)。图 D-2 展示了前向自动微分如何计算 f(x,y)=x^2y + y + 2 关于x,在 x=3, y=4 处的导数。我们所要做的一切只是计算 f(3+\epsilon, 4);它将输出一个对偶数,其第一部分等于 f(3, 4),第二部分等于 f^{'}(3, 4) = \frac{\partial f}{\partial x} (3,4)

D-2

为了计算 \frac{\partial f}{\partial y} (3,4) 我们不得不再遍历一遍计算图,但这次前馈的值为 x=3, y = 4 + \epsilon

所以前向自动微分比数值微分准确得多,但它遭受同样的缺陷:如果有 1000 个参数,那为了计算所有的偏导数,得历经计算图 1000 次。这正是反向自动微分耀眼的地方:计算所有的偏导数,它只需要遍历计算图 2 次。