【问题标题】:Modify gradient in TensorFlow backward pass在 TensorFlow 后向传递中修改梯度
【发布时间】:2018-02-17 22:23:53
【问题描述】:

我正在尝试使用自定义渐变修改 TensorFlow 中所有层的渐变,并保存当前渐变。从概念上讲,第 i 次迭代中单层的计算过程如下:

  1. original_grad = (actual gradient computed by TF)
  2. custom_grad = f(original_grad, stored_grad[i - 1])
  3. stored_grad[i] = original_grad
  4. 使用custom_grad 更新层权重

我对 TF 还很陌生,所以对如何/是否可以实现这一点非常迷茫。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    为了回答您的问题,我们必须看看优化器在您致电optimizer.minimize(loss) 时通常会做什么。

    实际上他们正在执行两个后续操作:compute_gradients()apply_gradients

    来自Tensorflow documentation of tf.train.Optimizer,我们读到:

    调用minimize() 负责计算梯度并将它们应用于变量。

    所以:

    如果你想处理渐变 在应用它们之前,您可以分三步使用优化器:

    1. 使用compute_gradients() 计算梯度。
    2. 根据需要处理渐变。
    3. 使用apply_gradients() 应用处理后的渐变。

    我可以直接从文档中举一个例子,对渐变进行一些修改:

    # Create an optimizer.
    opt = GradientDescentOptimizer(learning_rate=0.1)
    
    # Compute the gradients for a list of variables.
    grads_and_vars = opt.compute_gradients(loss, <list of variables>)
    
    # grads_and_vars is a list of tuples (gradient, variable).  Do whatever you
    # need to the 'gradient' part, for example cap them, etc.
    capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]
    
    # Ask the optimizer to apply the capped gradients.
    opt.apply_gradients(capped_grads_and_vars)
    

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      相关资源
      最近更新 更多