为什么 tf.abs 在 Tensorflow 中不可微分?

人工智能 张量流 反向传播 雷路 坡度
2021-10-27 06:18:26

我理解为什么 tf.abs 原则上是不可微分的(在 0 处不连续),但同样适用于 tf.nn.relu,如果这个函数梯度在 0 处简单地设置为 0。为什么不应用相同的逻辑到 tf.abs?每当我尝试在我的自定义损失实现中使用它时,TF 都会抛出关于丢失渐变的错误。

2个回答

按照惯例,Re大号ü激活被视为在零处可微分(例如在 [1] 中)。因此,TensorFlow 对tf.nn.relu. 当然,正如您所发现的,在同样的情况下,我们将绝对值函数的梯度视为零通常是不正确的;明确选择使用这个技巧是有道理的,因为它可能不是代码作者的一般意图。

在某种程度上,这与显式优于隐式的 Python 哲学兼容如果你的意思是使用Re大号ütf.nn.relu,如果它适合您的用例,最好使用它。

[1] 维诺德·奈尔和杰弗里·辛顿。整流线性单元改进受限玻尔兹曼机ICML'10 (2010)。网址

创建自定义渐变tf.abs可能会解决问题:

@tf.custom_gradient
def abs_with_grad(x):
  y = tf.abs(x);

  def grad(div): # Derivation intermediate value
    g = 1; # Use 1 to make the chain rule just skip abs
    return div*g;

  return y,grad;