当我注意到减去一个轴平均值的梯度为零时,我正在观察梯度。我认为这是非常违反直觉的,因为梯度 = 0 通常意味着函数是常数。谁能直观地解释一下为什么这里的梯度为零?
import tensorflow as tf
o1 = tf.random.normal((3, 3, 3, 3))
with tf.GradientTape() as tape:
tape.watch(o1)
o2 = o1-tf.reduce_mean(o1, 1, keepdims=True)
d = tape.gradient(o2, o1)
tf.print(tf.reduce_max(tf.abs(d)))
输出我0
最佳答案
问题是,tape.gradient
在传递张量时,将首先计算张量的总和,然后计算结果标量的梯度。也就是说,tape.gradient
仅计算标量函数的梯度。
现在,由于您减去了 o1
的平均值,因此输出的平均值(以及总和)将始终为 0。o1
如何变化并不重要> 改变时,你总是减去平均值,因此输出永远不会从 0 开始改变,因此你得到的梯度为 0。
注意:GradientTape
有 jacobian
function它计算完整的雅可比矩阵并且不需要标量输出。
关于python - Tensorflow:x - reduce_mean(x) 的梯度为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73631817/