我似乎无法理解其中的差异。对我而言,看起来两者都只是通过表达式并应用链规则。我错过了什么?
答案 0 :(得分:14)
有三种流行的方法来计算衍生物:
Numerical differentiation依赖于派生词的定义:,您可以在两个地方放置一个非常小的h
和评估函数。这是最基本的公式,在实践中人们使用其他公式,这些公式给出较小的估计误差。这种计算导数的方法主要适用于您不了解函数并且只能对其进行采样的情况。此外,它需要大量的计算才能实现高调功能。
Symbolic differentiation操纵数学表达式。如果你曾经使用过matlab或mathematica,那么你saw something like this
这里对于每个数学表达式,他们知道衍生物并使用各种规则(产品规则,链规则)来计算得到的导数。然后,他们简化结束表达式以获得结果表达式。
Automatic differentiation操纵计算机程序块。区分器具有获取程序的每个元素的导数的规则(当您在核心TF中定义任何op时,对于此op,您需要register a gradient)。它还使用链规则将复杂表达式分解为更简单的表达式。这是good example how it works in real TF programs with some explanation。
您可能认为自动微分与符号差异相同(在一个地方他们对数学表达进行操作,在另一个地方对计算机程序进行操作)。是的,它们有时非常相似。但是对于控制流语句(`if,while,loops),结果可能非常different:
符号差异导致代码效率低下(除非仔细 完成)并面临将计算机程序转换为计算机程序的难度 单一表达
答案 1 :(得分:2)
“对我来说,似乎两者都只是通过表达式并应用链式规则。我想念什么?”
您所缺少的是 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的导数。
答案 2 :(得分:0)
一个普遍的主张是,自动区分和符号区分是不同的。但是,事实并非如此。前向模式自动区分和符号区分实际上是等效的。请参阅此paper。
简而言之,它们都将链式规则从输入变量应用于表达式图的输出变量。人们常说,符号微分对数学表达式起作用,而对计算机程序则自动进行微分。最后,它们实际上都表示为表达图。
另一方面,自动微分也提供了更多模式。例如,将输出变量的链式规则应用于输入变量时,这称为反向模式自动微分。