tensorflow如何从输入到损失有效地计算梯度*?

时间:2018-05-21 06:05:06

标签: tensorflow

要计算大小为N的输出图层的导数w.r.t大小为M的输入,我们需要一个大小为M x N的雅可比矩阵。要使用链式规则计算从损失到输入的完整梯度,我们需要将大量此类雅可比行列式存储在内存中。

我认为张量流不会为图的每一步计算完整的雅可比矩阵,但会更有效。它是如何做到的?

由于

1 个答案:

答案 0 :(得分:1)

TensorFlow使用自动微分来有效地计算梯度。具体地说,它定义了一个计算图,其中节点是操作,每个有向边表示子节点相对于其父节点的偏导数。然后,操作 f 相对于 x 的总导数由从 x f <的所有路径值的总和给出/ em>,其中每个路径值是边缘上操作的偏导数的乘积。

更具体地说,TensorFlow使用反向微分,它包括前向传递来计算计算图中每个节点的值,以及后向传递来计算函数 f 的偏导数。区分图中的每个节点。我们需要为函数 f 的每个维重复向后传递,因此计算复杂度为O( dim(f))* O( f ),其中 dim(f)是函数 f 的输出维数。

虽然这种方法是内存密集型的(它需要在运行后向传递之前存储所有节点的值),但它对于机器学习非常有效,我们通常有一个标量目标函数 f (即 dim(f)= 1 )。

您可能会发现thisthis资源很有用。