我想计算神经网络输出相对于输入的梯度。我有以下张量:
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。