【问题标题】:Does tensorflow use automatic or symbolic gradients?tensorflow 使用自动渐变还是符号渐变?
【发布时间】:2016-07-22 01:47:46
【问题描述】:

我一直没能找到一个明确的说法来说明 tensorflow 是使用自动微分还是符号微分。

我浏览了 tensorflow paper,他们提到了自动渐变,但不清楚它们是否只是象征性渐变,因为他们还提到它具有这种能力。

【问题讨论】:

  • 它使用称为反向模式自动微分的技术
  • 我也是这么说的,你有来源吗??
  • 源码在tensorflow/python/ops/gradients.py,主要是“gradients()”函数

标签: math tensorflow


【解决方案1】:

TF 使用自动微分,更具体地说是反向模式自动微分。


有3种流行的计算导数的方法:

  1. 数值微分
  2. 符号分化
  3. 自动微分

Numerical differentiation 依赖于导数的定义:,您在其中放置了一个非常小的 h 并在两个地方评估函数。这是最基本的公式,在实践中人们使用其他公式可以提供较小的估计误差。如果您不知道函数并且只能对其进行采样,则这种计算导数的方法最适合。高亮度函数也需要大量计算。

Symbolic differentiation 操作数学表达式。如果你曾经使用过 matlab 或 mathematica,那么你 saw something like this

对于每个数学表达式,他们都知道导数,并使用各种规则(乘积规则、链式规则)来计算结果导数。然后他们简化结束表达式以获得结果表达式。

Automatic differentiation 操作计算机程序块。微分器具有获取程序每个元素的导数的规则(当您在核心 TF 中定义任何操作时,您需要为该操作使用register a gradient)。它还使用链式规则将复杂的表达式分解为更简单的表达式。这是good example how it works in real TF programs with some explanation


您可能认为自动微分与符号微分相同(在一个地方它们对数学表达式进行操作,在另一个地方对计算机程序进行操作)。是的,它们有时非常相似。但是对于控制流语句(`if、while、loops),结果可能非常different

符号区分会导致代码效率低下(除非仔细 完成)并面临将计算机程序转换为 单个表达式

【讨论】:

  • 为什么符号微分会导致代码效率低?
  • 例如,尽管您的符号计算可能严重依赖于您之前计算的数量,但重复使用它们并在每次出现等式时再次调用它们是不够聪明的。就像 csc(x) 或 cos(x-7) 一样,我们已经从上面的前向计算中得到了。
  • 分享自动微分背后的逻辑可能会很有用,而不是说它与其他两个不同。
【解决方案2】:

通过“自动微分”,您可能会想到“通过有限差分进行微分”,您可以将f(x) 的导数近似为[f(x+e)-f(x-e)]/(2e)。但自动微分不同,有限差分法就是“数值微分”的一个例子。

TensorFlow 对其gradients 运算使用反向模式自动微分,并使用有限差分法来检查梯度运算的有效性,例如here

有限差分法对于高维问题不实用,而反向模式自动微分以与计算原始函数大致相同的成本为您提供“多->1”函数的导数

可以看到实现的核心here

微分方法的实现在某种意义上是象征性的,gradients 运算采用计算图并生成计算图,该计算图可以反馈到“梯度”运算中以获得更高级别的导数。

这是一个例子

tf.reset_default_graph()
x = tf.Variable(0.)
y = tf.square(x)
z = tf.gradients([y], [x])

这是你得到的图表

还有一些额外的运算符,因为相同的图形代码适用于更高维度的x,但重点是您在同一个图形中看到了x^22*x

【讨论】:

  • 自动微分不是使用有限差分的微分......它是链式法则的应用。
  • 有一个“方形”运算,即您的 x^2。 x*2 使用mul op 完成
  • “自动微分不是符号微分,也不是数值微分(有限差分法)。” en.wikipedia.org/wiki/Automatic_differentiation
  • 您的实施链接不再有效。如果有人可以更新它以链接到包含此代码的特定修订版,那将会很有帮助。
  • 自动微分不是有限差分。非常有帮助。它是什么?你最好阅读en.wikipedia.org/wiki/Automatic_differentiation
【解决方案3】:

Afaik 符号微分意味着使用数学符号方程(即符号数学方程输入,方程导出)。自动微分基于计算函数计算导数(这些函数又被分解为基本运算,例如加法/减法和乘法/除法)。

由于 TensorFlow 基于运算的计算图进行微分,我直观地说它是自动微分(我不知道这里有任何其他合适的技术;我认为 TensorFlow 正在转换计算的可能性将图形转换为数学方程,然后对其进行解析以计算该方程的导数,这是不可能的)。尽管作者在 TensorFlow whitepaper 中说“符号微分”——但是,如果您问数学家,我认为这可能是类似于“张量”而不是“(多维)数据数组”的误称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2020-01-05
    • 1970-01-01
    • 2016-04-21
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多