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

为何PyTorch中mse_loss计算结果与手动直接计算相差2倍?

为什么torch.nn.functional.mse_loss的计算结果和手动计算的均方误差有差异?

你会发现torch.nn.functional.mse_loss(x1,x2)的结果和手动计算的MSE不一致,甚至是手动结果除以维度数(比如示例中是2)的结果,核心原因是两者的计算逻辑不同:

测试代码

import torch
import numpy as np

# x1为预测的2D坐标,x2为真实坐标
x1 = torch.rand(10,2)
x2 = torch.rand(10,2)

mse_torch = torch.nn.functional.mse_loss(x1,x2)
print(mse_torch) # 示例输出:0.1557

mse_direct = torch.nn.functional.pairwise_distance(x1,x2).square().mean()
print(mse_direct) # 示例输出:0.3314

mse_manual = 0
for i in range(len(x1)) :
    mse_manual += np.square(np.linalg.norm(x1[i]-x2[i])) / len(x1)
print(mse_manual) # 示例输出:0.3314 

差异原因

  • torch的mse_loss逻辑:对张量中所有元素的平方差求平均。比如示例中(10,2)的张量,会计算10×2=20个元素的平方差,再取这20个值的平均值。
  • 手动计算的逻辑:先对每个样本计算坐标的L2范数平方(即该样本两个维度的平方差之和),再对所有样本(共10个)的结果求平均。

用单个样本举例:假设x1=[a,b],x2=[c,d]

  • mse_loss计算的是 [(a-c)² + (b-d)²] / 2
  • 手动计算的是 [(a-c)² + (b-d)²] / 1(再对所有样本平均)

所以两者的结果比值恰好等于样本的维度数(示例中是2),和你观察到的现象一致。

让mse_loss和手动计算结果一致的方法

如果想让mse_loss输出和手动计算相同的结果,可以先对平方差求和,再除以样本数量:

mse_torch_adjusted = torch.nn.functional.mse_loss(x1, x2, reduction='sum') / len(x1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:49:58