gpt4 book ai didi

python - 循环和内置函数之间的数值不一致

转载 作者:行者123 更新时间:2023-12-04 01:01:12 25 4
gpt4 key购买 nike

我正在尝试计算一组随机数的总和。但是,当我一次执行一个元素时,结果与使用内置函数时的结果似乎不一致。此外,当我降低数据精度时,误差似乎会增加。

import torch
columns = 43*22
rows = 44
torch.manual_seed(0)
array = torch.rand([rows,columns], dtype = torch.float64)
array_sum = 0
for i in range(rows):
for j in range(columns):
array_sum += array[i, j]

torch.abs(array_sum - array.sum())
结果是:
tensor(3.6380e-10, dtype=torch.float64)
使用 dtype = torch.float32 结果:
tensor(0.1426)
使用 dtype = torch.float16 结果(大吼大叫!):
tensor(18784., dtype=torch.float16)
我很难相信从来没有人问过这件事。然而,我还没有在 SO 中找到类似的问题。
任何人都可以帮我找到一些解释或这个错误的来源吗?

最佳答案

第一个错误是这样的:
您应该将求和线更改为

array_sum += float(array[i, j])
对于 float64,这不会导致任何问题,对于其他值,这是一个问题,下面将进行解释。
首先:在进行浮点运算时,您应该始终记住由于舍入错误而导致的小错误。最简单的查看方法是在 python shell 中:
>>> .1+.1+.1-.3
5.551115123125783e-17
但是你如何考虑这些错误呢?
将 n 个正整数相加到总 tot 时,分析相当简单,规则是:
error(tot) < tot * n * machine_epsilon
其中因子 n 通常是一个粗略的高估,而 machine_epsilon 取决于浮点数的类型(表示大小)。
大约是:
float64: 2*10^-16
float32: 1*10^-7
float16: 1*10^-3
并且人们通常会期望大约在合理因数 tot*machine_epsilon 内的误差。
对于我使用 float16 的测试,我们得到(总是 +-40000 变量总和为 +- 20000):
error(float64) = 3*10^-10 ≈ 80* 20000 * 2*10^-16
error(float32) = 1*10^-1 ≈ 50* 20000 * 1*10^-7
这是可以接受的。
然后浮点数16还有一个问题。有机器epsilon = 1e-4 可以看到问题
>>> ar = torch.ones([1], dtype=float16)
>>> ar
tensor([2048.], dtype=torch.float16)
>>> ar[0] += .5
>>> ar
tensor([2048.], dtype=torch.float16)
这里的问题是,当达到值 2048 时,该值不够精确,无法添加 1 或更小的值。更具体地说:使用 float16,您可以“表示”值 2048,也可以表示值 2050,但两者之间没有任何内容,因为它对于该精度而言位太少。通过将总和保存在 float64 变量中,您可以克服这个问题。解决这个问题,我们得到了 float16:
error(float16) = 16  ≈ 8* 20000 * 1*10^-4
这很大,但作为相对于 float16 中表示的 20000 的值是可以接受的。
如果您问自己,这两种方法中哪一种是“正确的”,那么答案是否定的,两者都不是,它们都是具有相同精度的近似值,但误差不同。
但正如您可能猜到的那样,使用 sum() 方法更快、更好、更可靠。

关于python - 循环和内置函数之间的数值不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68162677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com