【问题标题】:Difference between symbolic differentiation and automatic differentiation?符号微分和自动微分的区别?
【发布时间】:2017-09-13 07:09:00
【问题描述】:

我似乎无法理解其中的区别。对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?

【问题讨论】:

  • 您在查看具有一个变量或多个变量的基本方程吗?我也会给出答案,但我对自动微分的了解不如符号数学。如果我有时间,我可能会对此进行更多研究并发布答案。

标签: symbolic-math automatic-differentiation


【解决方案1】:

有3种流行的计算导数的方法:

  1. 数值微分
  2. 符号分化
  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

符号区分会导致代码效率低下(除非仔细 完成)并面临将计算机程序转换为 单个表达式

【讨论】:

  • 请您解释一下_'对于控制流语句(`if, while, loops)的结果可能会有很大的不同'?
【解决方案2】:

自动分化和符号分化是不同的,这是一个普遍的说法。然而,事实并非如此。正向模式自动微分和符号微分实际上是等价的。请看这个paper

简而言之,它们都将链式规则从输入变量应用到表达式图的输出变量。人们常说,符号微分作用于数学表达式,而自动微分作用于计算机程序。最后,它们实际上都表示为表达式图。

另一方面,自动微分也提供了更多的模式。例如,将输出变量的链式规则应用到输入变量时,这称为反向模式自动微分。

【讨论】:

  • 这篇论文极具误导性,如果结论是正确的,那么它们只是在非常人为的意义上是正确的。我同意正向模式 AD 和符号微分是“算法上等价的”,但它们实际上绝不是等价的。对于试图理解 AD 和符号分化之间区别的人来说,此评论令人困惑。
  • 许多作者声称 AD 和 SD 从根本上不同,但没有表现出任何差异。它们不仅在“算法上等价”,而且在数值和计算上也是等价的。事实上,许多首次描述 AD 的作者已经承认了这种等价性,包括 Griewank (2019) “关于“自动”、“符号”和“分析”区分之间的区别仍然存在混淆。在我的书中,它们都是同样,”和 Elliott (2018),“AD 由编译器执行的 SD。”
  • 你写了这篇论文(实际上是预印本)。作为一个局外人,您似乎不适合将其推荐为客观来源。
  • @NickMcGreivy 怎么样?
  • @user76284 好问题。不同之处在于算法微分操纵数学表达式,而正向模式 AD 操纵数字。每个都用作表达式图,但关键区别(问题所要求的)是数字与表达式。
【解决方案3】:

“对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?”

您缺少的是 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 的导数。

【讨论】:

  • 不幸的是,这个答案是不正确的。它没有描述符号和算法/自动微分之间的区别。它描述了静态(define-and-run)和动态(define-by-run)AD 之间的区别。两者都是两个 AD 实现。第一种通常由源代码转换执行,后者使用运算符重载。请参阅,例如,wikipedia 或此 paper(第 18 页)。
  • 这个答案的开头句是正确的。 AD 使用基于双数的数值。但是,这种分类具有误导性。正如@Soeren 解释的那样,这是动态广告和静态广告之间的区别。例如,Tensorflow 梯度磁带实现了动态 AD(define-by-run)。这就是为什么要计算观察变量所需的磁带的变量梯度。 AD 不等同于 SD,但它找到导数的方式类似地通过分解方程。在 AD 中,方程被分解成图形,而在 SD 中则以符号块的形式。
  • @Willysatrionugroho 静态 AD 构建原始函数图,然后通过该图传递数字来计算值和导数。符号微分创建链式表达式以获得导数的符号表示,但从不传递数字。第 1 段描述了符号差异,因为创建了显式表达式。第二段描述了 AD,因为数字是通过原语传递的,但从不计算完整的表达式。原语是通过静态图链接还是从解释器动态链接,这并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
相关资源
最近更新 更多