python - Tensorflow:x - reduce_mean(x) 的梯度为 0

标签 python tensorflow derivative

当我注意到减去一个轴平均值的梯度为零时,我正在观察梯度。我认为这是非常违反直觉的,因为梯度 = 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。

注意:GradientTapejacobian function它计算完整的雅可比矩阵并且不需要标量输出。

关于python - Tensorflow:x - reduce_mean(x) 的梯度为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73631817/

相关文章:

python - tf.random.categorical 给出奇怪的结果

python - ValueError : Error when checking target: expected dense_19 to have 3 dimensions, 但得到形状为 (5, 3) 的数组

python - "synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,))/' (1,)在TensorFlow中输入'."问题

matlab - 在Matlab中将导数值保存在ode45中

python - 测试套件的 Pytest 排序

python - 无法从 Django Rest API 获取图像

python - 如何从 tkinter OptionMenu 获取列表变量?

python - 使用 lambda 函数计算所有行中填充了除 NULL 之外的值的字段的数量

matlab - 样条插值及其(精确)导数

optimization - 如何为 Gekko Python 提供目标函数的一阶和二阶导数?