计算图 vs(计算机代数)符号表达式

Computational graph vs (computer algebra) symbolic expression

我正在阅读 Baydin et al, Automatic Differentiation in Machine Learning: a Survey, 2018 (Arxiv),它区分了 符号微分 自动微分 (AD)。然后它说:

AD Is Not Symbolic Differentiation. Symbolic differentiation is the automatic manipulation of [symbolic] expressions.

AD can be thought of as performing a non-standard interpretation of a computer program where this interpretation involves augmenting the standard computation with the calculation of various derivatives.

Evaluation traces form the basis of the AD techniques. [A computational graph (Bauer, 1974) visualizes dependency relations of (input, working, output) variables in evaluation traces.]

然后继续描述如何用 AD 计算导数(在正向或反向模式下)。描述基本上是在改造评估轨迹/计算图。

Autograd, Chainer, and PyTorch provide general-purpose reverse mode AD.

也讨论了Theano、TensorFlow等,但基本上是比较define-and-运行 / static computational graph (Theano, TF) vs define-by-运行 / dynamic computational graph (PyTorch, TF Eager)。 (在我的理解中,这与 AD 的执行方式问题是正交的,或者主要只是改变 AD 的实现方式,而不是 AD 的概念。)

Theano is a computational graph optimizer and compiler [...] and it currently handles derivatives in a highly optimized form of symbolic differentiation. The result can be interpreted as a hybrid of symbolic differentiation and reverse mode AD, but Theano does not use the general-purpose reverse accumulation as we describe in this paper. (Personal communication with the authors.)

我不确定作者是否暗示 Theano/TF 不提供通用反向模式 AD(我的理解是错误的)。

不太明白Theano怎么不用通用的反向累加

此外,根据这个定义,我不明白符号微分与 AD 有何不同。

或者:符号表达式与计算图有何不同?

相关的还有微分编程

differentiable directed graphs assembled from functional blocks

我再次看不出与计算图的区别。

反向传播(BP)

The resulting algorithm is essentially equivalent to transforming the network evaluation function composed with the objective function under reverse mode AD, which, as we shall see, actually generalizes the backpropagation idea.

我看不出反向模式 AD 比反向传播更通用。是吗?怎么样?

Schmidhuber, Deep Learning in Neural Networks: An Overview, 2014 (section 5.5) (also) 状态:

BP is also known as the reverse mode of automatic differentiation (Griewank, 2012).

这是一个很好的问题,它涉及到 AD 中的一些基本差异以及 PyTorch 和 TensorFlow 等大型 ML 库之间的一些基本设计差异。特别是,我认为理解 define-by-运行 和 define-and-运行 AD 之间的区别是令人困惑的,需要一些时间来理解。

反向传播与反向模式 AD?

你可以看到一个堆栈溢出问题,以及我的回答。基本上,区别在于您是想要标量值函数 R^n -> R 的梯度还是向量值函数 R^n -> R^m 的向量-雅可比积。反向传播假定您需要标量损失函数的梯度,并且是机器学习社区中最常用于谈论神经网络训练的术语。

因此,反向模式 AD 比反向传播更通用。

符号微分与AD有何不同?

符号微分作用于代表输入的符号,而 AD 计算给定输入的导数的数值。

例如:假设我有函数 y = x^2。如果我要计算 y 的符号导数,我会得到值 2x 作为符号导数。现在,对于 x 的任何值,我立即知道该 x 处的导数的值。但是如果我要执行自动微分,我会先设置 x 的值,比如 x=5,我的 AD 工具会告诉我导数是 2*5,但它不知道 x=4 处的导数因为它只计算 x=5 处的导数,而不是导数的符号表达式。

define-and-运行/静态计算图和define-by-运行/动态计算图的区别?

正如您所指出的,TF1 和 Theano 是 define-and-运行,而 Pytorch、Autograd 和 TF2 是 define-by-运行。有什么区别?

在TensorFlow 1中,你告诉TensorFlow你要做什么,然后TensorFlow准备通过构建静态计算图对一些数据进行这些计算,最后你接收到数据并进行计算。所以第 1 步是告诉 TensorFlow 你要做什么,第 2 步是在 TensorFlow 获得一些数据后执行该计算。

在 Autograd 中,您无需在执行之前告诉它您将要做什么。 Autograd 与 TF1 不同,它会在收到数据后找出您要对数据执行的操作。如果它接收到一个向量,它不知道要对该向量执行什么计算,因为它没有提前的静态计算图。它 "builds the graph" 通过在代码执行时记录对每个变量的操作,然后在计算结束时,您会得到一个已执行操作的列表,您可以向后遍历这些操作。这使您可以轻松地包含控制流,如 if 语句。在 define-and-运行 框架中处理控制流要困难得多。

为什么Theano和TF1不提供通用的反向模式AD?

Theano 和 TF1 不提供通用 AD,因为它们不允许控制流。实际上,TF1 做到了,但它是 a mess

可微编程和计算图的区别?

来自 Wikipedia

"Differentiable programming is a programming paradigm in which the programs can be differentiated throughout, usually via automatic differentiation."

所以可微编程是设计程序的范式。另一方面,计算图是 AD 领域中用于理解可微计算机程序执行的计算的抽象。一种是编程范式,一种是编程抽象。