tf.nn.selu 在负浮点64 输入时在接近零点处返回错误的二阶导数
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