2D张量与转置相乘未得到对称张量,该现象是否符合预期?
张量转置相乘后不满足
allclose的原因 这是浮点数精度误差导致的预期现象,并非代码逻辑错误,核心原因如下:
浮点数的有限精度限制:无论是CPU还是GPU默认使用的
float32浮点数,都只有有限的有效位数。矩阵乘法包含大量乘法与累加运算,每一步都会引入微小的舍入误差。计算s = n @ n.T时的误差分布,和直接取s.T的误差分布无法完全对称,最终导致两个张量的对应元素存在极小差异。验证对称性的合理方式:不要仅依赖
torch.allclose的默认阈值,可通过计算两个张量差值的最大绝对值,判断是否在浮点数精度允许的范围内:print((s - s.T).abs().max())输出结果通常在
1e-5到1e-7量级(对应float32的精度),说明矩阵本质上是对称的,只是存在数值误差。调整
allclose的阈值:如果一定要用torch.allclose验证,可以放宽相对误差(rtol)和绝对误差(atol)的阈值,适配浮点数的精度:print(torch.allclose(s, s.T, rtol=1e-5, atol=1e-8))此时通常会返回
True。
从数学理论上,n @ n.T确实是对称矩阵,但实际数值计算中,浮点数的精度限制会导致无法做到完全精确的对称,这是数值计算中的常见现象。
内容的提问来源于stack exchange,提问作者Al Wonder
相关产品推荐
相关产品推荐

