#124831·tensorflow

tf.nn.selu 在负浮点64 输入时在接近零点处返回错误的二阶导数

作者: ALinrunrun创建于 2026年8月6日更新于 2026年9月17日
标签stat:awaiting responsetype:bugcomp:core2.21.0

QQ 问题类型

错误

你用"天花夜"复制了虫子吗?

来源

来源

QQ TensorFlow 版本 (简体中文)

tf 2.21.0 电话

自定义代码

OS平台和发行

Linux Ubuntu 22.04 (英语).

移动设备

无回复( N)

Python 版本

Python 3.11 (英语).

QQ 巴泽尔版本

无回复( N)

GCC/汇编版

无回复( N)

• CUDA/CDNN版本

无回复( N)

QQ GPU 模型和内存

无回复( N)

目前的行为?

tf.nn.selu 返回一个小负浮64输入的第二个不正确的衍生物。

对SELU来说,负分行是缩放的ELU分行. 在x < 0'左右,第二个衍生物应当是有限度的和非零的。 在x = -1e-300'时,高精度分析参考值约为`1.7580993408473768'。

然而,TensorFlow在此输入时自动返回"0.0"的第二个衍生出. 同行自定义后端,如JAX和PyTorch计算出预期的有限值,因此这似乎是更高级的后向通关问题,而不是浮点64的限制.

期望的行为?

tf.nn.selu' at x = -1e-300'的第二个衍生物应接近1.7580993408473768',而不是0.0'。

· 独立代码以复制问题

贝壳 导入 Os os.environ.setdefault ("CUDA VISIBLE DEVICES","-1") (中文(简体) ). os.environ.setdefault ("TF CPP MIN LOG LEVEL","3") 互联网档案馆的存檔,存档日期2011-12-21.

导入以 tf 为单位的分数

x= -1e-300 (单位:千美元) 真相 = 1.7580993408473768

v = tf. 变相(x, dtype=tf.float64)

以 tf. Gradient Tape () 作为磁带2 : Tf.Gradient Tape () 作为磁带1 : y = tf.nn.selu(五) g1 = 磁带1. 渐变(y, v) g2 = 磁带2. 梯度( g1, v)

实际数=(g2) rel err = abs( 事实 - 真相) / abs( 真相)

打印(f"x:{x!r}) 打印(f) 第一种衍生词 : {float(g1)!r}" 打印(f) 秒衍生出 : {actual!r}" print(f)"预期的第二个衍生词 : { truth!r}") 打印( f) 相对错误 : {rel err: 3e}' )

如果rel err > 1e-6: print ("BUG REPRODUCED: tf.nn.selu 二等衍生物对负浮64输入错误近于零"). 其他情况: 打印(“ 未复制” )


QQ 相关日志输出

贝壳
tf: d^2 selu (-1e-300) = 0.0 真理= 1.758099340843768 rel err= 1.000e+00 错误

内容来源: tensorflow/tensorflow