要计算大小为N
的输出图层的导数w.r.t大小为M
的输入,我们需要一个大小为M x N
的雅可比矩阵。要使用链式规则计算从损失到输入的完整梯度,我们需要将大量此类雅可比行列式存储在内存中。
我认为张量流不会为图的每一步计算完整的雅可比矩阵,但会更有效。它是如何做到的?
由于
答案 0 :(得分:1)
TensorFlow使用自动微分来有效地计算梯度。具体地说,它定义了一个计算图,其中节点是操作,每个有向边表示子节点相对于其父节点的偏导数。然后,操作 f 相对于 x 的总导数由从 x 到 f <的所有路径值的总和给出/ em>,其中每个路径值是边缘上操作的偏导数的乘积。
更具体地说,TensorFlow使用反向微分,它包括前向传递来计算计算图中每个节点的值,以及后向传递来计算函数 f 的偏导数。区分图中的每个节点。我们需要为函数 f 的每个维重复向后传递,因此计算复杂度为O( dim(f))* O( f ),其中 dim(f)是函数 f 的输出维数。
虽然这种方法是内存密集型的(它需要在运行后向传递之前存储所有节点的值),但它对于机器学习非常有效,我们通常有一个标量目标函数 f (即 dim(f)= 1 )。