我似乎无法理解其中的区别。对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?
3 回答
有 3 种流行的方法来计算导数:
- 数值微分
- 符号分化
- 自动微分
数值微分依赖于导数的定义:,您h
在两个地方放置一个非常小的和评估函数。这是最基本的公式,在实践中人们使用其他公式可以提供较小的估计误差。如果您不知道函数并且只能对其进行采样,则这种计算导数的方法最适用。此外,它需要大量计算才能实现高亮度功能。
符号微分操纵数学表达式。如果您曾经使用过 matlab 或 mathematica,那么您会看到类似这样的内容
在这里,对于每个数学表达式,他们都知道导数并使用各种规则(乘积规则、链式规则)来计算结果导数。然后他们简化结束表达式以获得结果表达式。
自动微分操纵计算机程序块。微分器具有获取程序每个元素的导数的规则(当您在核心 TF 中定义任何操作时,您需要为该操作注册一个梯度)。它还使用链式规则将复杂的表达式分解为更简单的表达式。这是一个很好的例子,它在实际的 TF 程序中是如何工作的,并附有一些解释。
您可能认为自动微分与符号微分相同(在一个地方它们对数学表达式进行操作,在另一个地方对计算机程序进行操作)。是的,它们有时非常相似。但对于控制流语句(`if、while、loops),结果可能会大不相同:
符号微分导致代码效率低下(除非仔细完成)并面临将计算机程序转换为单个表达式的困难
人们普遍认为,自动分化和符号分化是不同的。然而,事实并非如此。正向模式自动微分和符号微分实际上是等价的。请看这篇论文。
简而言之,它们都将输入变量的链式规则应用于表达式图的输出变量。人们常说,符号微分作用于数学表达式,而自动微分作用于计算机程序。最后,它们实际上都表示为表达式图。
另一方面,自动微分也提供了更多的模式。例如,当将输出变量的链式规则应用于输入变量时,这称为反向模式自动微分。
“对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?”
您缺少的是AD 与数值一起使用,而符号微分与代表这些值的符号一起使用。让我们看一个简单的例子来充实这一点。
假设我想计算表达式 y = x^2 的导数。
如果我在做符号微分,我会从符号 x 开始,然后将它平方得到 y = x^2,然后我会使用链式法则知道导数 dy/dx = 2x。现在,如果我想要 x=5 的导数,我可以将它代入我的表达式,并得到导数。但由于我有导数的表达式,我可以插入任何 x 值并计算导数,而无需重复链式法则计算。
如果我要进行自动微分,我将从值 x = 5 开始,然后计算 y = 5^2 = 25,并将导数计算为 dy/dx = 2*5 = 10。我会计算值和导数。但是,我对 x=4 处的导数的值一无所知。我必须用 x=4 重复这个过程才能得到 x=4 的导数。