MINI-TABPFN COURSE · LESSON 08

第 8 课讲义:评测与架构改造——怎样知道模型真的学到了跨任务预测?

这是一节可直接阅读、实现和验收的课程单元。页面正文由 canonical Markdown lesson source 投影生成。

第 08 / 08 课course-v0.5 / owner-review完整讲义 + 动手验收包
课程讲义 · 基础知识层canonical source: course/lectures/08-evaluation-architecture.md · 先建立概念、符号、公式与边界,再进入工程实现。

讲义定位

最后一课不是“跑一个 benchmark 表格然后宣布完成”,而是建立一套能区分不同能力的评测协议:固定任务 内预测、held-out task 泛化、OOD prior、概率质量、资源成本和架构改造必须分别说明。

本讲义把前七课的对象串成一份可审计报告,并说明一次架构改造如何通过 hypothesis、ablation、指标和 失败解释进入课程证据。结业时应该能说清楚“证明了什么、没有证明什么”。

Mini 简化:评测在课程 synthetic prior 与固定 protocol 上进行。官方 TabPFN-3 报告 TabArena / TALENT / TabSTAR 等公开基准与 Thinking 模式;课程不复现官方 Elo、胜率或 benchmark 数字,也不把课程分数 写成官方性能声明。

1. 学习目标与先修知识

学完后你应该能够:

  1. 以 task/episode 为评测单位,而不是只按 row 随机切分;
  2. 设计统一的 baseline comparison protocol;
  3. 报告分类、回归、概率和资源指标;
  4. 区分 fixed-task、held-out-task 和 OOD-prior 结果,并写出各自支持的陈述;
  5. 用 ablation 评估一次明确的架构改造;
  6. 写出一份不夸大因果、机制或泛化能力的 final report,并衔接第 1–7 课的验收门。

先修:第 7 课的 prior / seed / checkpoint;第 5–6 课的 leakage 与 head 语义;第 3–4 课的 inducing / row token 形状契约。

2. 从第 1–7 课到结业叙事

结业报告应按计算图回顾证据链,而不是只贴最终 accuracy:

课次对象结业时必须还能回答
01episode / leakagequery label 为何只进 loss?
02–03attention / inducing\(N\to K\to N\) 省了哪张 score matrix?
04row token\(D_{\mathrm{row}}\) 从哪里来?
05ICL mask四块可见性各允许什么?
06headsretrieval softmax 轴;回归输出语义
07prior trainingouter loop 与 OOD 轴改了什么?
08eval / variant数字挂在哪个 split 与 claim 上?

可选论文扩展(本课可讨论、不强制实现):row-chunking、KV cache、MQA、Thinking / test-time compute。 若做,须标为“对齐官方推理优化叙事的可选实验”,不得改写为课程默认能力。

3. 评测单位必须是 task

一份预测结果至少需要这些标识:

run_id, split, task_id, episode_id, task_kind,
n_context, n_query, n_features, prior_version, seed

计算平均指标时,先明确是在 row 上平均还是在 task 上平均:

  • row-weighted metric:query 多的 task 权重更大;
  • task-weighted metric:先对每个 task 求指标,再对 task 平均。

若目标是跨任务泛化,通常需要 task-weighted 视角(canon §3.9)。若第 \(t\) 个 task 的指标为 \(m_t\):

\[\overline{m}_{\mathrm{task}} =\frac{1}{T}\sum_{t=1}^{T}m_t\]

不要把所有 query rows 合并后只报一个 micro average 掩盖 task failure。

4. 三种 split 与它们支持的陈述(claim 边界)

Split测试对象可以支持的陈述不能支持的陈述
fixed-task同一任务的新 row任务内预测能力跨任务算法、零样本任务泛化
held-out-task新 task 的 context/query(prior 内)在指定 prior 内的跨任务适应证据任意真实数据上的普遍优势
OOD-priorprior 某些维度变化的新 task已声明分布外轴的鲁棒性未测试轴上的外推、因果识别

“zero-shot”必须写清楚 zero 的是哪一种 update:若模型使用 context 做 forward adaptation,它是 zero-gradient-update 的 task adaptation,而不是完全不读取 context。

Claim ledger(结业必填):每一条定量结论旁写 supports / does-not-support / not-yet-verified, 并指向具体 split、seed 与 checkpoint。

5. Baseline comparison protocol

至少需要:

  1. 一个 per-task MLP 或重新拟合 baseline;
  2. 一个简单的 KNN/检索 baseline(适用于相应 task);
  3. 一个 Mini-TabPFN backbone + head;
  4. 如可行,加入一个固定数据集模型,作为 split 语义对照。

比较时固定:

  • task sampler 与 split;
  • \(N_c,N_q,P\) 与 feature width 分布;
  • target normalization;
  • train budget、early stopping 与 seed 数量;
  • 后处理、class mapping 与 missing handling。

否则“模型 A 胜过模型 B”可能只是输入、训练或预处理不同。课程结果不得直接与官方 TabArena Elo 并列写成同一结论。

6. 指标分层

分类

accuracy / balanced accuracy     类别判断
NLL / logloss                    概率质量
calibration / ECE                置信度可靠性

回归

MAE / RMSE       点预测误差
NLL              分布预测质量(若 head 定义了 likelihood)
coverage         预测区间覆盖率
interval width   区间宽度
pinball loss     quantile 质量

系统成本

parameters, peak memory, wall-clock, tokens, attention score size

成本不是附属信息。Inducing encoder 的意义就包含计算/表达折衷;只看 accuracy 会漏掉设计目标。

7. Zero-shot report 的最小结构

一份可复盘的报告至少包含:

  1. task prior 与版本(含第 7 课官方维对照);
  2. train/validation/test task 数量和 split 规则;
  3. context/query/feature 的分布;
  4. 模型输入契约和是否使用 context labels;
  5. baseline 与训练预算;
  6. 主要指标及 task-level aggregation;
  7. seed 数量、均值和不确定性摘要;
  8. 失败 task、异常 mask 和 OOD 结果;
  9. 资源成本;
  10. 尚未验证的能力与 claim ledger。

只贴一张 mean accuracy 表不能替代这份 protocol。

8. 架构改造必须先写 hypothesis

一次改造的格式应是:

Hypothesis:
  某个明确的输入/计算瓶颈导致某种 task 上的误差。

Change:
  只修改一个模块或一条信息路径。

Prediction:
  若 hypothesis 成立,哪个 split/metric 会改善,哪个不应改善?

例如第二轮 column-row interaction:先声明它要补回“列上下文更新后,row aggregation 之前缺少一次 跨轴交互”的可能瓶颈;再比较 baseline、一次 interaction 和两次 interaction,而不是直接挑最好层数。

标准路线(单变量):

\[\begin{aligned} \text{baseline:}\quad& \text{CellEmbed}\to\text{ColumnEncoder}\to\text{RowAggregator}\to\text{ICL}\to\text{Head},\\ \text{variant:}\quad& \text{CellEmbed}\to\text{ColumnEncoder}\to\text{RowAggregator} \to\bigl[\text{broadcast(row state)}+\text{gated cell update}\bigr]\\ &\to\text{ColumnEncoder-2}\to\text{RowAggregator-2}\to\text{ICL}\to\text{Head}. \end{aligned}\]

最小 gated update:

\[g=\sigma\!\left(W_g\,[\,h_{\mathrm{cell}}\,;\, \operatorname{broadcast}(h_{\mathrm{row}})\,]\right), \qquad h'_{\mathrm{cell},p}=h_{\mathrm{cell},p}+g\,W_r h_{\mathrm{row}}\]

只允许改变这一处;\(d_{\mathrm{cell}}\)、\(n_{\mathrm{cls}}\)、optimizer、prior、训练 steps 和评测 tasks 保持不变。

9. Ablation matrix

一个最小矩阵可以是:

VariantColumn encoderRow aggregatorRow ICL预期作用
Ainducedmeanonbaseline
BinducedCLSonaggregation change
Cinduced + second interactionCLSonproposed change
Dno column contextCLSoncolumn-context ablation
EinducedCLSno label injectiontask-evidence ablation

每个 variant 应在同一 task split、同一预算和同一随机协议下运行。结果既要记录 improvement,也要记录 计算成本、失败 task 和是否改变了 invariance/leakage 性质。

10. “学到了算法”需要什么证据

这句话至少需要多层证据共同支持:

  • held-out tasks 上 query prediction 不依赖固定表 ID;
  • context ablation 会改变合理的 task-conditioned behavior;
  • query label intervention 不改变 prediction;
  • row/column permutation 行为符合声明的性质;
  • OOD prior 有明确、可重复的结果;
  • baseline 对照与多个 seed 不支持偶然性解释。

即使这些都通过,也应使用“在指定 synthetic prior 和 protocol 下表现出跨任务预测证据”,而不是无限泛化 成“理解了所有表格”或“恢复了真实生成机制”。

11. 失败解释比最好数字更重要

最终报告应保留失败样本,例如:

  • context 太少时 class mass 退化;
  • missing pattern 改变后 calibration 变差;
  • OOD feature width 超出训练范围后 representation collapse;
  • quantile crossing 增加;
  • induced \(K\) 太小时性能下降但内存节省明显。

失败解释帮助我们知道模型的能力边界,也为下一轮架构改造提供 hypothesis。

12. 知识检查与口试问题

  1. 为什么 row split 不能替代 task split?
  2. 一个概率更好的模型是否一定 accuracy 更高?
  3. 为什么 ablation 必须固定 task sampler 和预算?
  4. 怎样证明改造改善的是 column-row interaction,而不是参数量增加?
  5. 哪些证据可以支持“跨任务预测”,哪些不能支持 causal claim?
  6. 如果 OOD 失败,应该先改 prior、模型、head 还是 evaluation?你需要什么实验才能判断?
  7. 你的 report 里哪一条数字绝不能写成官方 TabArena 结论?

13. 最终提交目录

experiments/final/
├── protocol.md
├── config.yaml
├── checkpoints/
├── metrics/
│   ├── iid_task.csv
│   ├── heldout_task.csv
│   └── ood_prior.csv
├── figures/
│   ├── attention_audit.png
│   ├── scaling_curve.png
│   └── ablation.png
├── failure_cases.md
├── claim_ledger.md
└── report.md

每个数字都应该能追溯到 config、seed、checkpoint 和 task split。没有 provenance 的漂亮图表只能算草稿。

14. 课程结业边界

课程完成可以表述为:学习者实现了一个受 TabPFN-3 启发、可训练、可审计、可改造的 Mini-TabPFN,并在 指定 synthetic prior 和 evaluation protocol 下留下了 prediction、ablation 和 failure evidence。

课程不能据此声称:

  • 复现官方 TabPFN-3 的全部内部 recipe、Thinking 模式或 benchmark;
  • 在真实数据上具有普遍优势或官方 Elo 水平;
  • 由 attention 或 synthetic SCM 自动得到 causal identification;
  • 具有未经专门测试的 intervention、counterfactual 或 persistent Unit 能力。

15. 本课的硬结论

评测不是最后补一张表,而是定义模型能力边界的实验协议。数字必须挂在 task split + protocol + claim ledger 上;否则不能说“学会了算法”。架构改造只有在对照、资源、失败解释和明确的 claim boundary 都齐全时,才算一项可复盘的课程成果。

HAND-ON LAB · 工程实现与验收包

第 8 课:评测与架构改造

项目问题

模型能在训练任务上跑通,还不能证明它学到了跨任务预测算法。最后一课要完成 zero-shot 测试、基线对比 和一次架构改造,并把每一条结论挂到明确的 split 与 claim 边界上。

统一模型

MiniTabPFN
├── CellEmbedder
├── ColumnEncoder
├── RowAggregator
├── ICLTransformer
├── ClassificationHead
└── RegressionHead

衔接第 1–7 课:结业报告应按这条计算图回顾 leakage、inducing、row token、ICL mask、head 语义与 prior/seed;不要只提交最终 accuracy。

评测任务

  • 在未见过的新 classification/regression tasks 上测试;
  • 与 MLP、KNN、XGBoost 做同口径比较;
  • 报告 context size、feature count、task family、seed 和 compute;
  • 分开报告预测指标、运行成本、失败样例和 calibration/interval 行为;
  • 填写 claim ledger:每条结果写 supports / does-not-support / not-yet-verified

架构改造任选其一

  • 增加第二轮 column-row interaction;
  • 加入列名语义;
  • 替换回归头;
  • 改变 inducing points 或 CLS 数量;
  • 加入 categorical embedding 或 missing-value mechanism;
  • 实现 row chunking 或简化 KV cache(标为可选论文扩展,非默认结业能力)。

验证实验

改造必须有 baseline、单变量变化、明确指标和失败解释。不能只展示一个更高分数就写成“架构更好”; 需要说明比较是否同预算、同任务分布和同数据切分。课程数字不得写成官方 TabArena / Elo 结论。

最终交付

代码仓库、可运行训练脚本、分类实验、回归实验、attention 可视化、结构图、实验报告、claim ledger 和架构改进方案。

课程结业标准

学习者能够独立解释 cell token、inducing points、row token、label injection、query readout, 并能把一个论文中的计算对象改成代码、张量检查和实验,而不是只复述术语。

本课的具体教学包

本课不是“跑一下 test set”,而是完成跨任务评测协议、baseline 对照和一项单变量架构改造。推荐流程:

时间内容证据
00:00–00:25task-level split 与 claim ledger写出 train/heldout/OOD
00:25–00:55baseline protocolMLP/KNN/XGBoost 同口径
00:55–01:25Mini-TabPFN zero-shot evaluationfresh task report
01:25–01:40休息查找 leakage/overfit
01:40–02:20一项架构改造单变量 diff + ablation
02:20–02:50失败解释与可视化report figures/tables
02:50–03:00结业 reviewartifact + claim checklist

1. 评测单位必须是 task

最终报告至少拆成三组(canon §3.9):

\[\begin{array}{ll} \text{train-like / fixed-task:}&\text{prior 训练支持的 task family;或同任务新 row}\\ \text{held-out-task:}&\text{新 task seed / 新 task identity,但在 prior 范围内}\\ \text{OOD-prior:}&\text{至少一个未在训练 prior 中出现的 family 组合} \end{array}\]

不能把同一个 task 的 rows 一部分放进 train、一部分放进 test 后称为 zero-shot task evaluation。 每张结果表都要带 task_id/seed、kind、n_context、n_features、prior_split

若第 \(t\) 个 task 指标为 \(m_t\),跨任务汇总优先用:

\[\overline{m}_{\mathrm{task}}=\frac{1}{T}\sum_{t=1}^{T}m_t\]

2. Claim 边界速查

Split可支持不可支持
fixed-task任务内预测跨任务算法
held-out-task指定 prior 内适应任意真实数据优势
OOD-prior已声明轴上的鲁棒性未测轴外推、因果识别

3. Baseline comparison protocol

比较 MLP、KNN、XGBoost 或其他 baseline 时,要声明它们是否在每个 task 内重新 fit:

方法context label 使用query 处理是否每 task fit
Per-task MLPquery forward
KNNcontext distance否(存储 context)
XGBoostquery predict
Mini-TabPFNshared learned algorithm否(只 forward)

baseline 的 compute budget、早停、超参数搜索和 target normalization 都要写入 ledger。不能用为 Mini- TabPFN 调好的预算与 baseline 的默认值直接比较。

4. Zero-shot report 的最小表格

分类报告:

split | task_family | Nc | P | accuracy | NLL | calibration | forward_ms

回归报告:

split | task_family | Nc | P | RMSE | MAE | coverage | interval_width | forward_ms

每个 cell 的汇总要同时提供 task-level mean 和 task-level spread(例如 standard deviation 或 quantile)。 不要把所有 query rows 合并后只报一个 micro average 掩盖 task failure。

5. 选择一项主架构改造:第二轮 column-row interaction

为了让“改造”不是口号,课程提供一条标准路线:

\[\begin{aligned} \text{baseline:}\quad& \text{CellEmbed}\to\text{ColumnEncoder}\to\text{RowAggregator}\to\text{ICL}\to\text{Head},\\ \text{variant:}\quad& \text{CellEmbed}\to\text{ColumnEncoder}\to\text{RowAggregator} \to\bigl[\text{broadcast(row state)}+\text{gated cell update}\bigr]\\ &\to\text{ColumnEncoder-2}\to\text{RowAggregator-2}\to\text{ICL}\to\text{Head}. \end{aligned}\]

最小 gated update:

\[g=\sigma\!\left(W_g\,[\,h_{\mathrm{cell}}\,;\, \operatorname{broadcast}(h_{\mathrm{row}})\,]\right), \qquad h'_{\mathrm{cell},p}=h_{\mathrm{cell},p}+g\,W_r h_{\mathrm{row}}\]

只允许改变这一处;d_celln_cls、optimizer、prior、训练 steps 和评测 tasks 保持不变。若实现 复杂度太高,可把改造替换为“missing-value branch”或“quantile head”,但必须在 report 中说明为何选择。

6. 改造实验的 ablation matrix

至少运行:

\[\begin{array}{ll} A:&\text{baseline, same seed list}\\ B:&\text{variant, same seed list}\\ C:&\text{variant with gate disabled / zero branch} \end{array}\]

记录:

  • held-out/OOD task metrics;
  • train/validation curves;
  • 参数量与显存;
  • 每个 query 的 forward time;
  • 失败 task examples;
  • variant 是否改善所有 task family,还是只改善某一类。

单次 run 的分数上涨不够支持“架构更好”。至少用 3 个 run seeds,或者明确这是 smoke experiment, 并把不确定性写出来。

7. 必做可视化与失败解释

结业报告至少包含:

  1. 完整计算图:cell -> column -> row -> ICL -> head
  2. 一张 attention/readout visualization,标注它是 routing diagnostic;
  3. 一张 train-like vs held-out vs OOD 的结果图;
  4. 一张 baseline/variant metric table;
  5. 两个失败 task 的输入摘要、预测、ground truth 和可能原因;
  6. 一段明确说明哪些结果是作者报告、哪些是课程实验、哪些仍是 not-yet-verified
  7. claim_ledger.md:每条定量结论对应 split / seed / checkpoint。

8. 结业口试问题

学习者应能现场回答:

  • 为什么 query label 只能进 loss,不能进 forward
  • inducing points 减少了哪一张 score matrix,保留了多少输出 token?
  • row token 的 \(D_{\mathrm{row}}\) 从哪里来,改变 CLS 数量会影响什么?
  • classification retrieval 的 softmax 轴分别是什么?
  • synthetic SCM prior 能证明真实数据上的什么,不能证明什么?
  • 你的架构改造改变了哪一个 computation object,代价是什么?
  • 你的哪一条数字绝不能写成官方 TabArena 结论?

答不出时,应把对应 artifact 标成未完成,而不是只以最终 accuracy 作为结业依据。

退出条件与评分

结业必须拥有:

  1. 可重放的分类和回归 evaluation manifest;
  2. task-level held-out/OOD 结果;
  3. 同口径 baseline;
  4. 一项有单变量对照的架构改造;
  5. attention、结构图和失败案例;
  6. README / report 中的 boundary 与 claim ledger;
  7. 明确写出:课程结果 ≠ 官方 TabPFN-3 benchmark / Thinking 能力。

评分建议:评测协议 25%,baseline fairness 20%,zero-shot evidence 25%,架构实验 20%,报告和口试 10%。

最终提交目录

experiments/final/
├── manifest.yaml
├── metrics_classification.csv
├── metrics_regression.csv
├── baseline_vs_variant.csv
├── claim_ledger.md
├── figures/
├── failure_cases/
└── report.md

report.md 的第一段必须写清:这是受 TabPFN-3 启发、可训练、可审计的 Mini-TabPFN,不是官方模型 复现,也不自动携带 causal identification、Unit identity 或 counterfactual ability。

课后作业

把本课的 baseline/variant comparison 复跑一遍,额外加入一个你自己设计的 OOD task family。先写 manifest.yaml 和预期失败解释,再运行实验;如果 OOD 结果没有改善,也要完整提交结果,并在 claim ledger 中标为 does-not-supportnot-yet-verified,而不是删除失败数字。