符号微分和自动微分的区别?
Difference between symbolic differentiation and automatic differentiation?
我似乎无法理解其中的区别。对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?
有3种流行的计算导数的方法:
- 数值微分
- 符号微分
- 自动微分
Numerical differentiation relies on the definition of the derivative: ,你把一个非常小的 h
和 evaluate 函数放在两个地方。这是最基本的公式,在实践中人们使用其他公式来给出更小的估计误差。如果您不知道您的函数并且只能对其进行采样,则这种计算导数的方法最适用。此外,它需要大量计算才能实现高亮度功能。
Symbolic differentiation manipulates mathematical expressions. If you ever used matlab or mathematica, then you saw something like this
在这里,对于每个数学表达式,他们都知道导数,并使用各种规则(乘积法则、链式法则)来计算结果导数。然后他们简化结束表达式以获得结果表达式。
Automatic differentiation manipulates blocks of computer programs. A differentiator has the rules for taking the derivative of each element of a program (when you define any op in core TF, you need to register a gradient for this op). It also uses chain rule to break complex expressions into simpler ones. Here is a .
您可能认为自动微分与符号微分相同(在一个地方它们对数学表达式进行操作,在另一个地方对计算机程序进行操作)。是的,它们有时非常相似。但对于控制流语句(`if、while、循环),结果可能非常 different:
symbolic differentiation leads to inefficient code (unless carefully
done) and faces the difficulty of converting a computer program into a
single expression
人们普遍认为,自动微分和符号微分是不同的。然而,事实并非如此。正向模式自动微分和符号微分实际上是等价的。请看这个 paper.
简而言之,它们都是将链式法则从输入变量应用到表达式图的输出变量。人们常说,符号微分对数学表达式进行运算,自动微分对计算机程序进行运算。最后其实都是用表情图表示的
另一方面,自动微分也提供了更多的模式。例如,当将链式法则从输出变量应用到输入变量时,这称为反向模式自动微分。
"For me it looks like both just go through an expression and apply the chain rule. What am I missing?"
您缺少的是 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 处的导数。
我似乎无法理解其中的区别。对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?
有3种流行的计算导数的方法:
- 数值微分
- 符号微分
- 自动微分
Numerical differentiation relies on the definition of the derivative: h
和 evaluate 函数放在两个地方。这是最基本的公式,在实践中人们使用其他公式来给出更小的估计误差。如果您不知道您的函数并且只能对其进行采样,则这种计算导数的方法最适用。此外,它需要大量计算才能实现高亮度功能。
Symbolic differentiation manipulates mathematical expressions. If you ever used matlab or mathematica, then you saw something like this
在这里,对于每个数学表达式,他们都知道导数,并使用各种规则(乘积法则、链式法则)来计算结果导数。然后他们简化结束表达式以获得结果表达式。
Automatic differentiation manipulates blocks of computer programs. A differentiator has the rules for taking the derivative of each element of a program (when you define any op in core TF, you need to register a gradient for this op). It also uses chain rule to break complex expressions into simpler ones. Here is a
您可能认为自动微分与符号微分相同(在一个地方它们对数学表达式进行操作,在另一个地方对计算机程序进行操作)。是的,它们有时非常相似。但对于控制流语句(`if、while、循环),结果可能非常 different:
symbolic differentiation leads to inefficient code (unless carefully done) and faces the difficulty of converting a computer program into a single expression
人们普遍认为,自动微分和符号微分是不同的。然而,事实并非如此。正向模式自动微分和符号微分实际上是等价的。请看这个 paper.
简而言之,它们都是将链式法则从输入变量应用到表达式图的输出变量。人们常说,符号微分对数学表达式进行运算,自动微分对计算机程序进行运算。最后其实都是用表情图表示的
另一方面,自动微分也提供了更多的模式。例如,当将链式法则从输出变量应用到输入变量时,这称为反向模式自动微分。
"For me it looks like both just go through an expression and apply the chain rule. What am I missing?"
您缺少的是 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 处的导数。