张量流是否使用自动或符号渐变?
tensorflow
6
0

我无法找到一个清晰的陈述,说明tensorflow是使用自动还是符号微分。

我浏览了tensorflow 论文 ,他们提到了自动渐变,但是还不清楚它们是否仅表示符号渐变,因为他们还提到了它具有这种功能。

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

Afaik符号微分意味着使用数学的符号方程式(即,符号数学方程式输入,方程式的导数输出)。自动微分基于计算功能(反过来又分解为基本运算,例如加/减和乘/除)来计算导数。

由于TensorFlow会根据运算的计算图进行微分,因此我直觉地说这是自动微分(我不知道这里有其他合适的技术;我认为TensorFlow可能会将计算图转换为数学方程式,然后对其进行解析以计算该方程式的导数是不可能的。作者在TensorFlow 白皮书中说了“符号区分”-但是,如果您要问数学家,我认为这可能是类似于“ Tensor”的误称,而不是“(多维)数据数组”。

收藏
评论

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

TensorFlow使用反向模式自动分化为它的gradients操作和有限差分方法用于测试,像梯度操作的检查有效性这里

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

您可以在此处查看实现的核心。

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

这是一个例子

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

这是你得到的图

在此处输入图片说明

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

收藏
评论

TF使用自动微分,尤其是反向模式自动微分。


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

  1. 数值微分
  2. 象征差异
  3. 自动区分

数值微分依赖于导数的定义: 在此处输入图片说明 ,在其中放置了一个非常小的h并在两个位置评估函数。这是最基本的公式,在实践中,人们使用其他公式给出的估计误差较小。如果您不知道函数并且只能对其进行采样,则这种计算导数的方法最适合。此外,对于高调功能,它需要大量的计算。

符号微分操纵数学表达式。如果您曾经使用过matlab或mathematica,那么您会看到类似这样的内容 在此处输入图片说明

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

自动差异处理计算机程序块。区分符具有获取程序每个元素的派生规则(当您在核心TF中定义任何op时,需要为此op 注册一个渐变 )。它还使用链规则将复杂的表达式分解为更简单的表达式。这是一个很好的示例,并带有一些解释,它如何在实际TF程序中工作


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

符号差异导致代码效率低下(除非仔细完成),并且面临着将计算机程序转换为单个表达式的困难

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号