TF 2.0 中的 tf.GradientTape 是否等同于 tf.gradients?

Is tf.GradientTape in TF 2.0 equivalent to tf.gradients?

我正在将我的训练循环迁移到 Tensorflow 2.0 API. In eager execution mode, tf.GradientTape replaces tf.gradients。问题是,它们是否具有相同的功能? 具体来说:

请在下面找到回复。

  1. 关于Output Gradientsgrad_ys:是的,可以认为它们是一样的。

详细说明:在Github -> imperative_grad.py中提到了关于Output Gradients的信息,如下所示。

output_gradients: if not None, a list of gradient provided for each Target, or None if we are to use the target's computed downstream gradient,

有关 grad_ys 的信息在 TF Site 中提到,如下所示:

grad_ys: is a list of tensors of the same length as ys that holds the initial gradients for each y in ys. When grad_ys is None, we fill in a tensor of '1's of the shape of y for each y in ys. A user can provide their own initial grad_ys to compute the derivatives using a different initial gradient for each y (e.g., if one wanted to weight the gradient differently for each value in each y).

根据上面的解释,以及下面的代码,在本书的第 394 页中提到,Hands on ML using Scikit-Learn & Tensorflow, 我们可以得出结论 Theta 的初始值可以是一个随机值,我们可以使用参数 output_gradientsgrad_ys.

传递它
theta = tf.Variable(tf.random_uniform([n + 1, 1], -1.0, 1.0), name="theta")
gradients = tf.gradients(mse, [theta])[0]
training_op = tf.assign(theta, theta - learning_rate * gradients)
  1. 关于 colocate_gradients_with_ops:是的,Eager Execution 不需要它,因为它与图形的控制流上下文相关。

详细解释:colocate_gradients_with_ops指向下面Github -> ops.py. Control flow Context is related to the concept of Context, which is related to Graphs, as explained in TF Site -> Graphs

中提到的代码
 def _colocate_with_for_gradient(self, op, gradient_uid,
                                  ignore_existing=False):
    with self.colocate_with(op, ignore_existing):
      if gradient_uid is not None and self._control_flow_context is not None:
        self._control_flow_context.EnterGradientColocation(op, gradient_uid)
        try:
          yield
        finally:
          self._control_flow_context.ExitGradientColocation(op, gradient_uid)
      else:
        yield
  1. 关于aggregation_method:这个参数的等价物已经在2.0中实现,命名为_aggregate_grads,如Github link

    [=62所示=]
  2. 关于 gate_gradients:Eager 不需要,因为这也与 Graph Context 相关。

详细说明:如下面代码所示Github -> gradients_utils.py,如果gate_gradientsTrue,则使用函数 _colocate_with_for_gradient,它又取决于图的控制流上下文。

if gate_gradients and len([x for x in in_grads
                                         if x is not None]) > 1:
                with ops.device(None):
                  with ops._colocate_with_for_gradient(  # pylint: disable=protected-access
                      None,
                      gradient_uid,
                      ignore_existing=True):
                    in_grads = control_flow_ops.tuple(in_grads)
  1. 关于jacobian:是的,它们是一样的。