我理解为什么 tf.abs 原则上是不可微分的(在 0 处不连续),但同样适用于 tf.nn.relu,如果这个函数梯度在 0 处简单地设置为 0。为什么不应用相同的逻辑到 tf.abs?每当我尝试在我的自定义损失实现中使用它时,TF 都会抛出关于丢失渐变的错误。
为什么 tf.abs 在 Tensorflow 中不可微分?
人工智能
张量流
反向传播
雷路
坡度
2021-10-27 06:18:26
2个回答
按照惯例,激活被视为在零处可微分(例如在 [1] 中)。因此,TensorFlow 对tf.nn.relu
. 当然,正如您所发现的,在同样的情况下,我们将绝对值函数的梯度视为零通常是不正确的;明确选择使用这个技巧是有道理的,因为它可能不是代码作者的一般意图。
在某种程度上,这与显式优于隐式的 Python 哲学兼容。如果你的意思是使用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;