You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何set_printoptions(precision=1)后张量浮点仍波动?两种平均结果不等

张量平均两种实现的浮点精度差异问题

我跟随教程学习张量操作时,教程提到两种实现张量平均的方法:一种是手动循环遍历张量运算,另一种是通过与单位三角矩阵做点积的更优方案(可保留空间信息),教程中torch.allclose(xbow, xbow2)返回True,证明两种方法结果一致。但我复现后该返回值为False,两种方法的张量运算结果存在差异。

经咨询,得知是torch.randn()生成随机张量带来的浮点精度偏差,但不清楚为何教程无此问题。我尝试用set_printoptions(precision=1)限制张量精度,结果仍为False。


复现代码与现象

1. 生成随机张量

torch.manual_seed(1337)
B,T,C = 4,8,2 # batch, time, channels
x = torch.randn(B,T,C)
print(x.shape)
print(x[0]) 

输出:

torch.Size([4, 8, 2])
tensor([[ 0.2, -0.1],
        [-0.4, -0.9],
        [ 0.6,  0.0],
        [ 1.0,  0.1],
        [ 0.4,  1.2],
        [-1.3, -0.5],
        [ 0.2, -0.2],
        [-0.9,  1.5]])

2. 循环实现张量平均

# We want x[b, t] = mean_{i<=t} x[b,i]
xbow = torch.zeros((B,T,C))
for b in range(B):
    for t in range(T):
        xprev = x[b, :t+1] # (t,C)
        xbow[b,t] = torch.mean(xprev, 0)

打印xbow[0]结果:

tensor([[ 0.2, -0.1],
        [-0.1, -0.5],
        [ 0.1, -0.3],
        [ 0.4, -0.2],
        [ 0.4,  0.1],
        [ 0.1, -0.0],
        [ 0.1, -0.1],
        [-0.0,  0.1]])

3. 三角矩阵点积实现张量平均

wei = torch.tril(torch.ones(T,T))
wei = wei / wei.sum(1, keepdim=True)
xbow2 = wei @ x # B(T, T, T) @ (B, T, C ) ----> (B, T, C)

打印xbow2[0]结果:

tensor([[ 0.2, -0.1],
        [-0.1, -0.5],
        [ 0.1, -0.3],
        [ 0.4, -0.2],
        [ 0.4,  0.1],
        [ 0.1, -0.0],
        [ 0.1, -0.1],
        [-0.0,  0.1]])

从打印结果看两者一致,但用xbow == xbow2对比时,能发现部分张量元素不等,torch.allclose(xbow, xbow2)返回False。


疑问与需求

我希望两种计算方法的浮点值完全精确,虽已知可用torch.allclose(xbow,xbow2)判断近似相等,但想了解:

  • 如何保持精度以避免未来信息损失(如图像平均压缩场景)
  • 如何规避此类浮点波动问题

内容的提问来源于stack exchange,提问作者RedSean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:07:18