【发布时间】:2017-09-13 07:09:00
【问题描述】:
我似乎无法理解其中的区别。对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?
【问题讨论】:
-
您在查看具有一个变量或多个变量的基本方程吗?我也会给出答案,但我对自动微分的了解不如符号数学。如果我有时间,我可能会对此进行更多研究并发布答案。
标签: symbolic-math automatic-differentiation
我似乎无法理解其中的区别。对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?
【问题讨论】:
标签: symbolic-math automatic-differentiation
有3种流行的计算导数的方法:
Numerical differentiation 依赖于导数的定义:,您可以在其中放置一个非常小的 h 并在两个地方评估函数。这是最基本的公式,在实践中人们使用其他公式可以提供较小的估计误差。如果您不知道函数并且只能对其进行采样,则这种计算导数的方法最适用。高亮度函数也需要大量计算。
Symbolic differentiation 操作数学表达式。如果你曾经使用过 matlab 或 mathematica,那么你 saw something like this
对于每个数学表达式,他们都知道导数,并使用各种规则(乘积规则、链式规则)来计算结果导数。然后他们简化结束表达式以获得结果表达式。
Automatic differentiation 操作计算机程序块。微分器具有获取程序每个元素的导数的规则(当您在核心 TF 中定义任何操作时,您需要为该操作使用register a gradient)。它还使用链式规则将复杂的表达式分解为更简单的表达式。这是good example how it works in real TF programs with some explanation。
您可能认为自动微分与符号微分相同(在一个地方它们对数学表达式进行操作,在另一个地方对计算机程序进行操作)。是的,它们有时非常相似。但是对于控制流语句(`if、while、loops),结果可能非常different:
符号区分会导致代码效率低下(除非仔细 完成)并面临将计算机程序转换为 单个表达式
【讨论】:
自动分化和符号分化是不同的,这是一个普遍的说法。然而,事实并非如此。正向模式自动微分和符号微分实际上是等价的。请看这个paper。
简而言之,它们都将链式规则从输入变量应用到表达式图的输出变量。人们常说,符号微分作用于数学表达式,而自动微分作用于计算机程序。最后,它们实际上都表示为表达式图。
另一方面,自动微分也提供了更多的模式。例如,将输出变量的链式规则应用到输入变量时,这称为反向模式自动微分。
【讨论】:
“对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?”
您缺少的是 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 的导数。
【讨论】: