我正在阅读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领域中使用的抽象,用于理解可微计算机程序执行的计算。一个是编程范式,一个是编程抽象。