1

我想计算神经网络输出相对于输入的梯度。我有以下张量:

Input: (num_timesteps, features)

Output: (num_timesteps, 1)

对于从输入到整个输出向量的梯度,我可以使用以下内容:

tf.gradients(Output, Input)

因为我想计算每个时间样本的梯度,所以我想计算

tf.gradients(Output[i], Input)

对于每个i.

最好的方法是什么?

4

1 回答 1

1

首先,我想你的意思是Output 相对于的梯度Input

现在,这两个调用的结果:

  • dO = tf.gradients(Output, Input)
  • dO_i = tf.gradients(Output[i], Input)(对于任何有效的i

将是一个具有单个元素的列表 - 一个与具有相同形状的张量Input,即一个[num_timesteps, features]矩阵。此外,如果你对所有矩阵求和dO_i(全部有效i)正是矩阵dO

考虑到这一点,回到你的问题。在许多情况下,来自 的各个行Input是独立的,这意味着Output[i]仅根据其他输入计算Input[i]并且不知道其他输入(典型情况:没有 batchnorm 的批处理)。如果这是您的情况,那么dO将立即为您提供所有单独的组件dO_i

这是因为每个dO_i矩阵看起来像这样:

[[  0.   0.   0.]
 [  0.   0.   0.]
 ...
 [  0.   0.   0.]
 [ xxx  xxx  xxx]     <- i-th row
 [  0.   0.   0.]
 ...
 [  0.   0.   0.]]

所有行都将是0,除了i-th 。所以只要计算一个矩阵dO,你就可以很容易地得到每一个dO_i. 这是非常有效的。

但是,如果这不是您的情况并且全部Output[i]取决于所有输入,则无法dO_i仅从总和中提取个人。除了分别计算每个梯度之外,您别无选择:只需迭代i并执行tf.gradients

于 2017-10-17T14:11:15.700 回答