- 深度学习
- 人工智能
【免费下载链接】UniTS
本文为 UniTS 精度验证新手总结一次真实踩坑案例:在 ETTh1 数据集上做长期预测推理时,MSE 结果比论文基准高出 70% 以上。最终定位根因是滑动窗口的数据划分步长与目标序列切片方式理解错误。文章还原完整的排查流程,并给出可复用的检查清单,帮你在昇腾 NPU / GPU 上复现官方精度时少走弯路。
一、问题现象:MSE 偏差 70% 意味着什么
项目自带的精度验证脚本在accuracy-eval/infer/目录。最初运行时,ETTh1 p96 的评测结果如下(见 etth1_full_evaluation.json):
| 预测长度 | 实测 MSE | 论文基准 MSE | 偏差 |
|---|---|---|---|
| 96 | 0.709 | 0.376 | 约 +88% |
| 192 | 0.724 | 0.424 | 约 +71% |
| 336 | 0.732 | 0.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.67 | 70%+ | ❌ |
| 参考源码修正 | 0.389 | 0.7% | ✅ |
| 官方 data_provider 验证 | 0.3886 | 0.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% 的精度偏差问题:
- 先查源码 data_provider:定位数据集对应的
Dataset_*类,读__read_data__(看数据划分边界,如 ETTh1 的border1s/border2s)和__getitem__(看样本构建); - 确认窗口参数语义:
label_len不是"目标长度",seq_y长度 =label_len + pred_len,评测只取最后pred_len步; - 核对样本数量:ETTh1 p96 测试集应为2785个样本(步长=1),数量明显偏少说明步长取错;
- 校验模型配置与权重匹配:
d_model、e_layers、prompt_num等必须与权重一致(如 x64 监督权重需d_model=64, e_layers=3, prompt_num=10),可用torch.load检查权重张量维度; - 官方 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
相关推荐
数据验证不踩坑:Great Expectations自定义配置实战指南
数据验证不踩坑:Great Expectations自定义配置实战指南 你是否还在为数据质量问题头疼?每次数据异常都要熬夜排查?本文将带你用Great Expe
数据质检数据工程数据分析终极VGGT数据集实战指南:从零基础到精通的完整教程
终极VGGT数据集实战指南:从零基础到精通的完整教程 VGGT(Visual Geometry Grounded Transformer)是一个强大的视觉几何T
人工智能计算机视觉深度学习基础模型微调CANN/ge模型输入维度获取API
aclmdlGetInputDims<a name="ZH CN_TOPIC_0000001312641477" </a 产品支持情况<a name="sect
人工智能深度学习模型编译模型优化编译器Ascend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考