张量流中每个示例的未聚合梯度/梯度

Unaggregated gradients / gradients per example in tensorflow

在 tensorflow 中的 mnist 上给出一个简单的小批量梯度下降问题(就像这个tutorial),我如何单独检索批处理中每个示例的梯度。

tf.gradients() 似乎 return 对批处理中所有示例的梯度进行平均。有没有办法在聚合之前检索梯度?

编辑:这个答案的第一步是弄清楚 tensorflow 在哪个点对批处理中的示例的梯度进行平均。我认为这发生在 _AggregatedGrads,但事实并非如此。有什么想法吗?

tf.gradients returns 相对于损失的梯度。这意味着如果您的损失是每个示例损失的总和,那么梯度也是每个示例损失梯度的总和。

总结是含蓄的。例如,如果您想最小化 Wx-y 误差的平方范数之和,则 W 的梯度为 2(WX-Y)X' 其中 X 是一批观察值, Y 是一批标签。您永远不会显式地形成稍后总结的 "per-example" 渐变,因此移除渐变管道中的某些阶段并不是一件简单的事情。

获得 k 每个示例损失梯度的简单方法是使用大小为 1 的批次并进行 k 遍。 Ian Goodfellow wrote up 如何在一次传递中获得所有 k 梯度,为此你需要明确指定梯度而不是依赖 tf.gradients 方法

在修改了一段时间后,部分回答我自己的问题。通过执行以下操作,似乎可以在批量处理每个示例的同时操作梯度:

  • 创建一个 tf.gradients() 的副本,它接受额外的 tensor/placeholder 以及特定于示例的因素
  • 创建 _AggregatedGrads() 的副本并添加使用特定示例因子的自定义聚合方法
  • 调用您的自定义 tf.gradients 函数并将您的损失作为切片列表给出:

custagg_gradients( ys=[cross_entropy[i] for i in xrange(batch_size)],<br> xs=variables.trainable_variables(), aggregation_method=自定义, gradient_factors=gradient_factors )

但这可能与对每个示例进行单独传递具有相同的复杂性,我需要检查梯度是否正确:-)。

聚合前检索梯度的一种方法是使用 grads_ys 参数。在这里可以找到很好的讨论:

Use of grads_ys parameter in tf.gradients - TensorFlow

编辑:

我最近没有经常使用 Tensorflow,但这里有一个未解决的问题,跟踪计算未聚合梯度的最佳方法:

https://github.com/tensorflow/tensorflow/issues/675

有很多用户(包括我自己)提供的样例代码方案,大家可以根据自己的需要尝试。