ArchitectureIQ 项目全面 Review
日期:2026-07-18 · 快照:30 environments / 3 families / 10,000 rows / 5 seeds · SHA256:2b172e0c…40b38ba
1. 造题流程(spec → code → run → GT → question)
1.1 三阶段流水线
Stage 1: create-dataset → dataset_spec.json + synthesize.py → 执行 synthesize() → 材料化数据
Stage 2: generate-candidates → candidate_spec.json → model.py/loss.py/optimizer.py/train.py → 执行 train_and_eval() → results/summary.json
Stage 3: generate-question → 从候选池找显著子集 → question.json + prompt.txt
1.2 核心不变量
Ground truth 必须来自执行生成的代码,不能从并行逻辑重算。
prompt 展示的代码必须与执行的代码完全一致。_sync_candidate_files() 在 GT 运行前和 prompt 提取前重新渲染 .py 文件。
1.3 数据集族
| Family | Selection Metric | Losses | 模型类型 |
| univariate_regression | test_mse | mse, mse_l2, mse_l1 | mlp |
| multivariate_regression | test_mse | mse, mse_l2, mse_l1 | mlp |
| bigram_lm | test_ce | cross_entropy, ce_l2, ce_l1 | mlp, transformer_lm |
1.4 候选配置空间
| 轴 | 可选值 |
| Optimizer | SGD, Adam, AdamW, RMSprop, Adagrad |
| Learning rate | grid 采样 |
| Model depth/width | grid 采样(mlp: depth 1-6, width 16-256; transformer: d_model 16-64, layers 1-5) |
| Budget | training_steps × batch_size = total_samples_seen |
| Seeds | 每个候选训练 5 个 seed,取 mean + std |
1.5 题目生成逻辑
- 从候选池(candidate set)加载所有候选的
summary.json
- 穷举 C(pool, 3) 或随机采样,对每个三元组调用
validate_significance
- 通过的三元组成为"题",winner = argmin(mean_metric)
- shuffle 选项顺序,记录 correct_letter
- 渲染 prompt.txt:包含 dataset 描述 + 候选代码片段(不含 GT)
2. 显著性检验规范
定义在 src/architecture_iq/significance/validator.py,三个 profile 默认值相同:
| 条件 | 默认值 | 语义 | 来源 |
gap_min | 0.05 | best 与 second 候选的 mean_{metric} 绝对差 | profile.significance.gap_min |
win_rate_min | 0.7 | 5 seed 里 winner 一致率(≥4/5) | profile.significance.win_rate_min |
use_non_overlap | True | winner+std < runner_up−std(1 个 std,非 2 sigma) | profile.significance.use_non_overlap |
三个条件全部通过才算一题有效。在 152,592 个穷举三元组中,只有 87,837 个(57.6%)通过。其余 42.4% 是 GT 跨 seed 分不开的噪声题。
3. 评测协议
3.1 三选一 accuracy
对每个 environment 内的全部行穷举 C(n,3) 三元组。对每个三元组,模型预测 3 个候选的 loss,选 argmin 作为预测 winner,与真实 winner 比较。
| n_rows | C(n,3) |
| 33 | 5,456 |
| 34 | 5,984 |
| 67 | 47,905 |
3.2 三层指标体系
| 指标 | 含义 | 使用场景 |
| all 三元组 | 全部 C(n,3),含噪声题 | 旧 metric(不准确) |
| gap≥0.05 | best-vs-second raw loss 差≥0.05 | 中间过滤,缺 win_rate 和 non_overlap |
| 完整显著通过 | gap + win_rate + non_overlap 全过 | 正确主指标 |
3.3 专家模型(Expert)setting(本次实验)
| 项 | 值 |
| 协议 | dataset_pooled_id(每 dataset 一个模型) |
| 模型数 | 15 |
| 每模型 train rows | 600(部分 300) |
| 每模型 locked validation | 66–67 |
| 目标 | log(mean_loss),mean 跨 5 seed |
| 随机基线 | 33.33% |
4. 实验结果总表
最优 meta-model
82.11%
共享 ExtraTrees(9k rows, 1 model)
专家模型(Expert) 最优
78.33%
per-dataset XGBoost
4.1 回归方法(预测 log loss → argmin)
| 模型 | 专家模型 Expert (15模型) | Shared (1模型) | 差 | train sig | val sig | gap |
| Compact Ridge | 45.16% | 43.55% | −1.6 | — | — | — |
| Full Ridge | 53.99% | 55.27% | +1.3 | 55.65% | 54.68% | 1.0pp |
| Full OLS | 55.15% | — | — | — | — | — |
| Compact Poly Ridge | 60.63% | — | — | — | — | — |
| MLP | 52.44% | 60.31% | +7.9 | 72.12% | 61.01% | 11.1pp |
| Random Forest | 75.35% | 78.60% | +3.3 | 85.64% | 78.16% | 7.5pp |
| ExtraTrees | 77.78% | 82.11% | +4.3 | 93.75% | 82.80% | 11.0pp |
| XGBoost | 78.33% | 70.80% | −7.5 | 74.49% | 70.77% | 3.7pp |
gap = train_sig − val_sig(过拟合程度)。XGBoost 几乎不过拟合但欠拟合(depth=3);ExtraTrees 过拟合 11pp 但 val 仍最高。
4.2 直接预测 winner(pairwise 分类 + 投票)
| 分类器 | per-dataset | global shared |
| Logistic | 68.22% | 62.98% |
| GradientBoosting Clf | 74.85% | 64.92% |
| MLP Clf | 71.07% | 72.31% |
| ExtraTrees Clf | 77.85% | 61.59% |
| RandomForest Clf | 77.00% | 56.62% |
per-dataset ExtraTrees Clf 77.85%,接近回归 ExtraTrees 77.78%,但未超过共享回归 82.11%。
4.3 在原 60 题上的性能
| 方法 | 60题正确率 | 说明 |
| 共享 ExtraTrees(本次) | 43/60 = 71.7% | 30 环境宽协议,60 题来自 3 个环境 |
| GPT-5.6-SOL blind | 25/60 = 41.7% | 纯 agent,无 meta-model |
| 随机 | 20/60 = 33.3% | — |
4.4 模型参数量对比
| 模型 | 结构 | 有效参数量 | 训练样本 | 特征维度 |
| ExtraTrees | 300 棵 depth-16 | 713,068 nodes | 9,000 | 122 |
| Random Forest | 300 棵 depth-12 | 275,808 nodes | 9,000 | 122 |
| XGBoost | 400 棵 depth-3 | ~9,600 leaves | 9,000 | 122 |
| MLP | 122→128→64→1 | 24,065 weights | 9,000 | 122 |
| Full Ridge | 线性 | 122 coeff | 9,000 | 122 |
5. 推论
推论 1:旧 63.50% 是错误的 metric + 不够好的 setting 的组合。
- metric 错误:没做显著性筛选,42% 噪声题拉低 ~9pp
- setting 不够好:15 个独立模型各 600 行,共享后 +4pp
- 修正后:78.33% → 82.11%
推论 2:setting→loss 映射是高度非线性的。
线性模型(OLS/Ridge)只有 45–61%,远低于树模型 75–82%。Compact Polynomial Ridge(60.63%)是线性族里最好的,但仍远不够。
推论 3:共享样本有帮助,但取决于模型族。
ExtraTrees +4.3pp,RF +3.3pp,MLP +7.9pp,但 XGBoost −7.5pp。浅树 XGBoost 的固定配置在 122 维特征上不如 per-dataset grid 搜索。
推论 4:直接预测 winner 不一定优于回归。
per-dataset ExtraTrees Clf 77.85% ≈ 回归 ExtraTrees 77.78%,但不如共享回归 82.11%。MLP 分类器(72.31%)明显优于 MLP 回归器(60.31%),说明直接预测 winner 对 MLP 更合适。但 pairwise 差值特征破坏了树模型在 global setting 下的原生判别能力(56–62%)。
推论 5:Phase-A 90% 不能直接与 Full-30 82% 比较。
cv_champion 90% 是在 3 环境、每环境 900 train / 100 val 的窄协议上训练,60 题恰好来自这 3 个环境(in-distribution)。Full-30 的 82.11% 是在 30 环境的 locked validation 上,其中包含 27 个更难的环境。共享 ExtraTrees 在这 60 题上只有 71.7%,因为它在更宽的配置空间上训练。
推论 6:ExtraTrees 有过拟合但 val 仍最高。
train 93.75% → val 82.80%,gap 11pp。XGBoost 几乎不过拟合(gap 3.7pp)但 train 只有 74.49%(欠拟合)。最佳平衡点可能在两者之间——更深的 XGBoost 或更正则化的 ExtraTrees。
推论 7:82.11% 不是数学上限。
Oracle = 100%,随机 = 33.33%。82.11% 是"当前已测模型集合 + 当前特征表示 + 当前显著性筛选"的经验结果。未来改进方向:更好的特征工程、更合理的超参搜索、ensemble。
6. 未解决问题与下一步
问题 1:Phase-A vs Full-30 的 gap 不可解释。
从 90%(Phase-A 3 环境)到 82%(Full-30 30 环境)的下降涉及多个同时变化的因素(环境数、采样宽度、loss 轴、GT seeds)。没有逐项消融,不能归因给单一因素。
问题 2:60 题是选择过的外部集。
54/60(cv_champion)和 82.11%(Full-30 validation)不可直接横比。前者是 in-distribution 选择过的题,后者是全宽随机穷举三元组。
问题 3:MLP 的默认配置不理想。
MLP train 72.12% 且 val 61.01%,gap 11.1pp。可能的改进:(a) 用 learned embedding 替代 one-hot;(b) 更大网络 +更强正则;(c) 直接预测 winner 的 MLP 分类器(72.31%,已好于回归 60.31%)。
问题 4:per-dataset 模型没有做显著性筛选后的 train-val 对比。
目前 train-val gap 只对 shared 模型做了。per-dataset 模型可能过拟合更严重(每模型只有 600 行)。
问题 5:特征工程是否充分?
当前特征是 setting 的 one-hot + 数值。没有交互特征(如 lr×depth、budget×model_type)、没有 dataset 的统计特征(如 input_dim、domain_size)。Compact Polynomial Ridge 60.63% 说明二阶交互有帮助但不够。
建议的下一步实验
- 调 XGBoost 深度:depth 3→5/6,看是否从欠拟合进入最优点
- ExtraTrees 正则化:减 max_features 到 0.5 或加 max_depth 限制,降低过拟合
- 交互特征:在 feature encoder 里加 lr×optimizer_type、depth×width、budget×model_type 交互项
- Ensemble:ExtraTrees + XGBoost 的预测平均或 stacking
- per-dataset 显著性 train-val:确认 per-dataset 模型的过拟合程度
- 在 60 题上评测 per-dataset 模型:看 Phase-A 3 环境的 per-dataset 模型在 60 题上是否接近 90%
7. 产物索引
| 产物 | 路径 |
| 最终结果 JSON | artifacts/wide_v2_full30_meta_model_final_summary.json |
| 专家模型 Expert 回归 + 显著性筛选 | artifacts/wide_v2_full30_significant_recheck_dataset_pooled.json |
| 共享回归 + 显著性筛选 | artifacts/wide_v2_full30_significant_recheck_global.json |
| OLS + 显著性筛选 | artifacts/wide_v2_full30_significant_recheck_ols.json |
| Winner 分类 per-dataset(fast) | data/meta_model_studies/wide_v2_full30_winner_clf_fast/ |
| Winner 分类 per-dataset(trees) | data/meta_model_studies/wide_v2_full30_winner_clf_trees/ |
| Winner 分类 global(fast) | data/meta_model_studies/wide_v2_full30_winner_clf_global/ |
| Winner 分类 global(trees) | data/meta_model_studies/wide_v2_full30_winner_clf_global_trees/ |
| 显著性筛选脚本 | tools/meta_model_study/significant_recheck.py |
| Winner 分类脚本 | tools/meta_model_study/winner_classification.py |
| Train-val 对比报告 | docs/0718_train_val_comparison.html |
| 本报告 | docs/0718_project_review.html |
冻结快照 SHA256: 2b172e0c…40b38ba · 30 environments / 10,000 rows / 5 seeds · 所有 GT 来自执行候选代码,未重算。