4

我正在阅读Baydin 等人的《机器学习中的自动微分:一项调查》,2018 年( Arxiv ),其中区分了符号微分自动微分 (AD)。然后它说:

AD 不是符号区分。符号微分是[符号]表达式的自动操作。

AD 可以被认为是对计算机程序执行非标准解释,其中这种解释涉及通过计算各种导数来增加标准计算。

评估痕迹构成了 AD 技术的基础。[计算图 (Bauer, 1974)在评估跟踪中可视化(输入、工作、输出)变量的依赖关系。]

然后继续描述如何用 AD 计算导数(在前向或后向模式下)。该描述基本上是在转换评估跟踪/计算图。

Autograd、Chainer 和 PyTorch 提供通用反向模式 AD。

它还讨论了 Theano、TensorFlow 等,但它基本上比较了定义运行/静态计算图(Theano,TF)与运行定义/动态计算图(PyTorch,TF Eager)。(在我的理解中,这与如何执行 AD 的问题是正交的,或者主要只是改变了 AD 的实施方式,但不是 AD 的概念。)

Theano 是一个计算图优化器和编译器 [...],它目前以高度优化的符号微分形式处理导数。结果可以解释为符号微分和反向模式 AD 的混合,但 Theano 没有使用我们在本文中描述的通用反向累加。(与作者的个人交流。)

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

我不完全理解 Theano 是如何不使用通用反向累积的。

此外,鉴于此定义,我不明白符号差异与 AD 有何不同。

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

相关的也是可微分编程

由功能块组装而成的可微有向图

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

反向传播(BP)

得到的算法本质上等效于在反向模式AD下转换由目标函数组成的网络评估函数,正如我们将看到的,这实际上是对反向传播思想的推广。

我看不出反向模式 AD 比反向传播更通用。是吗?如何?

Schmidhuber,神经网络中的深度学习:概述,2014 年(第 5.5 节)()指出:

BP也被称为自动微分的反向模式(Griewank,2012)

4

1 回答 1

3

这是一个很好的问题,它解决了 AD 的一些基本差异,以及 PyTorch 和 TensorFlow 等大型 ML 库之间的一些基本设计差异。特别是,我认为理解定义运行和定义运行 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 处的导数,而不是导数的符号表达式。

定义并运行/静态计算图和定义运行/动态计算图之间的区别?

正如您所指出的,TF1 和 Theano 是定义并运行的,而 Pytorch、Autograd 和 TF2 是定义运行的。有什么区别?

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

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

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

Theano 和 TF1 不提供通用 AD,因为它们不允许控制流。其实 TF1 也有,只是一团糟

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

来自维基百科

“可微分编程是一种编程范式,其中程序可以在整个过程中进行微分,通常是通过自动微分。”

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

于 2020-01-27T08:08:31.253 回答