我想计算神经网络输出相对于输入的梯度。我有以下张量:
Input: (num_timesteps, features)
Output: (num_timesteps, 1)
对于从输入到整个输出向量的梯度,我可以使用以下内容:
tf.gradients(Output, Input)
因为我想计算每个时间样本的梯度,所以我想计算
tf.gradients(Output[i], Input)
对于每个i
.
最好的方法是什么?
我想计算神经网络输出相对于输入的梯度。我有以下张量:
Input: (num_timesteps, features)
Output: (num_timesteps, 1)
对于从输入到整个输出向量的梯度,我可以使用以下内容:
tf.gradients(Output, Input)
因为我想计算每个时间样本的梯度,所以我想计算
tf.gradients(Output[i], Input)
对于每个i
.
最好的方法是什么?
首先,我想你的意思是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
。