代码之家  ›  专栏  ›  技术社区  ›  yoki

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

  •  1
  • yoki  · 技术社区  · 6 年前

    计算输出层尺寸的导数 N W.R.T尺寸输入 M ,我们需要一个雅可比矩阵 M x N 是的。为了使用链式规则计算从损失到输入的完整梯度,我们需要在内存中存储大量这样的雅可比矩阵。

    我假设tensorflow并不是为图的每一步计算一个完整的jacobian矩阵,而是做一些更有效的事情。它是怎么做到的?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   rvinas    5 年前

    tensorflow使用自动微分来有效地计算梯度。具体地说,它定义了一个计算图,其中节点是操作,每个有向边表示子节点相对于其父节点的偏导数。运算的全导数 F型 关于 然后由所有路径值的和给出 F型 ,其中每个路径值是边上操作的偏导数的乘积。

    更具体地说,tensorflow使用反向微分,它包括一个向前的过程来计算计算图中每个节点的值,一个向后的过程来计算函数的偏导数。 F型 我们正在对图中的每个节点进行区分。我们需要对函数的每个维度重复反向过程 F型 因此计算复杂度为O( 尺寸(F) )*O型( F型 ),其中 尺寸(F) 是函数的输出维数 F型 是的。

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

    你可能会发现 this 资源有用。