高斯过程回归中Torch与Numpy实现结果不一致问题排查
问题原因
两个版本结果不一致的核心错误出在核函数的距离计算逻辑上:
- Numpy版本实现的是标准RBF(平方指数)核,计算的是平方欧氏距离代入核公式,RBF核无穷阶可导,对应预测结果非常平滑。
- Torch版本错误使用了
torch.cdist(p=2)返回的未平方的L2范数距离代入指数项,实际实现的是指数核(类OU核),该核仅零阶连续,预测结果会呈现锯齿状的低平滑度表现,和你观察到的现象完全匹配。
修正代码
只需要修改核计算部分,对torch.cdist返回的距离做平方,和Numpy版本的距离计算逻辑对齐即可,其余代码无需改动:
x_all = torch.cat([X, x],0) # 修正:计算平方欧氏距离,匹配RBF核公式 dist_sq = torch.cdist(x_all, x_all, p=2) ** 2 K = sigma_s**2 * torch.exp(-0.5 * dist_sq / length_scale**2)
如果后续要做自动微分优化核参数,也可以用和Numpy逻辑完全一致的广播写法计算平方距离,数值表现完全等价:
# 等价平方距离计算写法,和numpy的dist2计算逻辑逐行对齐 dist_sq = (x_all**2).sum(dim=1, keepdim=True) + (x_all**2).sum(dim=1) - 2 * x_all @ x_all.T
效果对比
- 错误Torch版本(误用指数核)的不平滑结果:

- 修正后Torch版本结果会和Numpy版本完全一致,呈现RBF核的平滑预测效果:

内容的提问来源于stack exchange,提问作者Felix Lu
相关产品推荐
相关产品推荐

