截断浮点数/双精度数以实现可重复性

数据挖掘 深度学习 交叉验证 实验 奥克 有限精度
2022-03-05 07:25:41

我将机器学习模型(通常是 GPU)部署到各种环境中。我工作在 ML 研发和 devops 的边缘,所以我对可重复性非常感兴趣,让我发疯的一件事是当模型输出相似但不是逐字节相同的值时,会使任何基于哈希的自动化测试感到沮丧. 例如,这是来自相同样本、推理模型、代码、容器映像等的分数,但一个在 Titan 上,一个在 RTX 2080 上。

Titan X  = 0.9887396097183228
RTX 2080 = 0.9887396693229675

这是 6.0e-08 或大约 60 ppb 的相对误差。显然,这是“相同的数字”,完全在 IEEE 754 和 GPU 处理的怪异范围内。

我想截断我的算法的输出,因为这简化了自动化测试的工作,但问题就变成了,如何四舍五入来实现这一点,以及多少精度?听起来很简单,但以这个注释为例numpy.around

由于 IEEE 浮点标准 [R9] 中小数部分的不精确表示以及按 10 的幂缩放时引入的错误,结果也可能令人惊讶。

百万分之一(通常为 0.0-1.0 置信值)似乎是合理的,但我不确定这种方法是否存在任何微妙的问题。

1个回答

我不是这方面的专家,但据我所知,测试相等模浮点不精确度的正确方法是比较两个值的差异,而不是:

trunc(a) == trunc(b) 

一个人会这样做:

abs(a-b) <= epsilon

其中epsilon是表示可接受差异的常数,例如当然,这需要读取两个值并计算差异,而不是简单地将一个与另一个进行比较。106