Sal*_*ali 37
TF使用自动区分,更具体地说是反向模式自动区分.
有三种流行的方法来计算衍生物:
数值微分依赖于衍生物的定义:
,你h在两个地方放一个非常小的评估函数.这是最基本的公式,在实践中人们使用其他公式,这些公式给出较小的估计误差.这种计算导数的方法主要适用于您不了解函数并且只能对其进行采样的情况.此外,它需要大量的计算才能实现高调功能.
符号微分操纵数学表达式.如果您曾经使用过matlab或mathematica,那么您会看到类似这样的东西

这里对于每个数学表达式,他们知道衍生物并使用各种规则(产品规则,链规则)来计算得到的导数.然后,他们简化结束表达式以获得结果表达式.
自动微分操纵计算机程序块.微分器具有获取程序的每个元素的导数的规则(当您在核心TF中定义任何操作时,您需要为此操作注册梯度).它还使用链规则将复杂表达式分解为更简单的表达式.这是一个很好的例子,它如何在真正的TF程序中有一些解释.
您可能认为自动微分与符号微分相同(在一个地方它们在数学表达式上运行,在另一个地方运行在计算机程序上).是的,它们有时非常相似.但是对于控制流语句(`if,while,loops),结果可能非常不同:
符号差异会导致代码效率低下(除非经过仔细研究),并且面临将计算机程序转换为单个表达式的难度
Yar*_*tov 26
通过"自动区分",您可能会想到"通过有限差分进行区分",其中您近似f(x)为α的导数[f(x+e)-f(x-e)]/(2e).然而,自动微分是不同的,并且有限差分方法是"数值微分"的一个例子.
TensorFlow使用反向模式自动微分对其gradients操作和有限差分方法进行测试,以检查梯度操作的有效性,如此处所示.
有限差分方法对于高维问题是不实用的,而反向模式自动微分为您提供"多 - > 1"函数的导数,其成本与计算原始函数的成本大致相同
您可以在此处查看实施的核心.
差分方法的实现在某种意义上是符号的,即gradients操作采用计算图并产生可以反馈到"梯度"操作的计算图以获得更高级别的导数.
这是一个例子
tf.reset_default_graph()
x = tf.Variable(0.)
y = tf.square(x)
z = tf.gradients([y], [x])
Run Code Online (Sandbox Code Playgroud)
这是你得到的图表
还有,因为相同的图形代码会为高维工作的一些额外的运营商x,但问题是,你同时看到x^2并2*x在同一张图上.
| 归档时间: |
|
| 查看次数: |
17606 次 |
| 最近记录: |