☰
UniTS 精度验证踩坑实录:数据划分步长取错致 MSE 偏差 70% 的完整排查指南
2026/10/20 4:01:44 网站建设 项目流程
  • 深度学习
  • 人工智能

【免费下载链接】UniTS

项目地址:https://ai.gitcode.com/Ascend-SACT/Units
点击查看免费下载

本文为 UniTS 精度验证新手总结一次真实踩坑案例:在 ETTh1 数据集上做长期预测推理时,MSE 结果比论文基准高出 70% 以上。最终定位根因是滑动窗口的数据划分步长与目标序列切片方式理解错误。文章还原完整的排查流程,并给出可复用的检查清单,帮你在昇腾 NPU / GPU 上复现官方精度时少走弯路。

一、问题现象:MSE 偏差 70% 意味着什么

项目自带的精度验证脚本在accuracy-eval/infer/目录。最初运行时,ETTh1 p96 的评测结果如下(见 etth1_full_evaluation.json):

预测长度实测 MSE论文基准 MSE偏差
960.7090.376约 +88%
1920.7240.424约 +71%
3360.7320.452约 +62%

偏差远超 5% 的合理容差,但模型能跑通、权重也能正常加载——这正是最迷惑的地方:程序不报错,只是数字不对。这种"静默错误"必须靠对齐官方实现来排查。

二、根因定位:凭直觉推导数据划分逻辑

错误来自两处对参数含义的误解(seq_len=96、label_len=48、pred_len=96的标准配置下):

  • 误用 label_len 偏移:错误地认为目标序列就是test_y = data[s_end - label_len : s_end - label_len + pred_len],导致test_y覆盖了输入序列的中间部分,而不是真正要预测的未来区间;
  • 步长取错:滑动窗口采样时使用了pred_len作为步长(或样本数量不足),漏掉了大量有效样本。

官方实现中label_len是为 decoder 准备的(包含输入序列尾部),真正的评测只看最后pred_len步。这个逻辑必须从源码确认,不能靠直觉。

三、对照源码:正确的数据划分方式

打开官方数据加载器 data_loader.py,Dataset_ETT_hour的样本构建逻辑如下:

s_begin = index s_end = s_begin + self.seq_len r_begin = s_end - self.label_len r_end = r_begin + self.label_len + self.pred_len # 关键:label_len + pred_len seq_x = self.data_x[s_begin:s_end] # 长度 96 seq_y = self.data_y[r_begin:r_end] # 长度 48+96=144

注意r_end是label_len + pred_len之和。而官方评测代码 exp_sup.py 的test_long_term_forecast中,最终只取后 96 步参与计算:

outputs = outputs[:, -pred_len:, f_dim:] batch_y = batch_y[:, -pred_len:, f_dim:]

所以等效的正确切片是:test_y = data[s_end : s_end + pred_len],步长必须为 1,覆盖全部样本。修正前后对比详见 data_provider_comparison.md。

四、验证结果:从偏差 70% 收敛到 0.7%

修正后,用官方 data_provider 做对照实验,结果(见 GUIDE.md):

方法MSE相对论文偏差结论
凭直觉推导(错误)0.6770%+❌
参考源码修正0.3890.7%✅
官方 data_provider 验证0.38860.7%✅

三套权重(x32 / x64 / x128)× 四个预测长度的完整对齐结果见 THREE_WEIGHTS_ALIGNMENT_REPORT.md,其中 x128 预训练权重 4/4 全部达标。推荐用官方验证脚本一键复核:

export UNITS_ROOT=/path/to/UniTS python accuracy-eval/infer/eval_with_official_data_provider.py

五、新手排查清单:MSE 偏差过大如何系统排查

把这次经验浓缩成 5 步流程,按顺序执行基本能覆盖 90% 的精度偏差问题:

  1. 先查源码 data_provider:定位数据集对应的Dataset_*类,读__read_data__(看数据划分边界,如 ETTh1 的border1s/border2s)和__getitem__(看样本构建);
  2. 确认窗口参数语义:label_len不是"目标长度",seq_y长度 =label_len + pred_len,评测只取最后pred_len步;
  3. 核对样本数量:ETTh1 p96 测试集应为2785个样本(步长=1),数量明显偏少说明步长取错;
  4. 校验模型配置与权重匹配:d_model、e_layers、prompt_num等必须与权重一致(如 x64 监督权重需d_model=64, e_layers=3, prompt_num=10),可用torch.load检查权重张量维度;
  5. 官方 data_provider 交叉验证:自定义加载逻辑与官方实现跑出的 MSE 必须一致,偏差 <5% 才算通过。

任务级配置(seq_len/label_len/pred_len)可在 multi_task.yaml 的LTF_ETTh1_p96等条目中确认,评测脚本入口见 etth1_full_eval.py,完整使用指导见 GUIDE.md。

六、关键教训总结

  • 🔍不要凭直觉推导数据划分逻辑,第一动作永远是打开__getitem__;
  • 📏步长=1 是默认假设,除非源码明确写了其他步长;
  • 🧮理解参数真实作用,label_len服务于 decoder 输入而非评测目标;
  • ✅必须做对照实验,修正后与官方 data_provider 结果一致才算闭环。

完整教训记录见 LESSON_LEARNED.md。照这份清单走一遍,你的 UniTS 精度验证也能稳定对齐论文基准。

  • 深度学习
  • 人工智能

【免费下载链接】UniTS

项目地址:https://ai.gitcode.com/Ascend-SACT/Units
点击查看免费下载
上一篇:slate-v2 公共 API 审计方法论:以 use-selected.spec.tsx 行为例的逐行收尾实践
下一篇:Kubernetes SIG Node 2023 年度报告深度解读:DRA 加速、Pod 生命周期特性与 v1.27–v1.29 KEP 全景

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询