You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何TensorFlow中x - reduce_mean(x)的梯度为0?求直观解释

为什么x - reduce_mean(x, axis)的梯度为0?

你观察到的现象完全正确——执行x - tf.reduce_mean(x, axis=1)后,对输入x求梯度的结果全为0。这看似反直觉,但核心原因在于TensorFlow梯度计算的默认逻辑和这个操作的数学性质:

1. TensorFlow梯度的默认计算逻辑

tape.gradient(y, x)默认计算的是输出张量y所有元素的总和对输入x的梯度,而非y每个元素单独对x的梯度(后者需要用tape.jacobian计算雅可比矩阵)。

2. 操作x - reduce_mean(x, axis)的总和是常数

拿你的例子来说,设输入o1沿axis=1的均值为m,则o2 = o1 - m。计算o2的总和:

  • sum(o2) = sum(o1) - sum(m)
  • 而sum(m)本质就是sum(o1)(沿axis=1求均值后再求和,等价于直接对原张量求和)
  • 因此sum(o2) = sum(o1) - sum(o1) = 0,是一个与o1无关的常数。

常数对任何变量的偏导数都是0,所以tape.gradient(o2, o1)返回的梯度自然全为0。

3. 不是操作本身是常数,而是总和是常数

要注意:o2本身并不是常数张量——改变o1的元素值,o2的元素也会跟着变。但无论o1怎么变,o2的元素总和永远是0,这才是梯度为0的关键。

如果想看o2每个元素对o1的梯度关系,把代码里的tape.gradient换成tape.jacobian,就能得到非零的雅可比矩阵,比如某一位置的偏导数会是(n-1)/n或-1/n(n是axis=1的维度大小)。

内容的提问来源于stack exchange,提问作者Philipp123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:55:14