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



我正在阅读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)。

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

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

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

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

来自维基百科:

"可微分编程

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

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

相关内容

  • 没有找到相关文章

最新更新