# 进展报告:BabyLM Challenge 2026 Strict-Small > **日期**:2026-03-23 > **当前阶段**:代码开发完成,组件验证通过,准备上传 HuggingFace 并开始正式实验 --- ## 一、项目总览 参加 BabyLM Challenge 2026 Strict-Small 赛道(训练数据 ≤ 10M 词),目标是训练一个小型语言模型(~30M 参数)在多项语言评测任务上取得最佳成绩。 **评测任务**:BLiMP(语法)、EWoK(世界知识)、Entity Tracking(实体追踪)、GLUE(语言理解,需微调)、WUG(形态学)、COMPS(概念属性)、AoA(词汇习得)、Reading Time(阅读时间) **2025 Strict-Small 排行榜**(我们的目标赛道): | 模型 | TextAvg | BLiMP | GLUE | EWoK | |------|:-------:|:-----:|:----:|:----:| | amlm_hd_fail(冠军) | **45.4** | 59.0 | 57.7 | 56.0 | | MoEP(亚军) | 44.5 | 60.8 | 64.2 | 50.2 | | Baseline GPT-BERT | 41.2 | 71.7 | 65.1 | 49.5 | | Baseline GPT-2 | 37.4 | 66.4 | 55.9 | 49.9 | --- ## 二、项目结构 ``` BabyLM_Challenge/ ├── experiments.csv # 384 个实验配置 ├── requirements.txt # Python 依赖 ├── scripts/ │ ├── 01_data/ # 数据处理 pipeline (Stage 1-9) │ ├── 02_model/ # 分词器训练 (BPE / Morfessor) │ ├── 03_training/ # 训练框架 │ │ ├── config.py # 配置系统 (YAML + CLI override) │ │ ├── data.py # 数据加载、3种掩码策略、逐句/拼接模式 │ │ ├── train.py # 训练循环 + 自动评测 (fast/full) │ │ ├── evaluate.py # 评测包装 (zero-shot + GLUE微调 + AoA) │ │ ├── utils.py # 5种优化器、调度器、checkpoint │ │ ├── hf_export/ # HuggingFace 模型导出 (5种架构) │ │ ├── models/ # 7种模型架构 │ │ │ ├── gpt2.py # D0 基线 │ │ │ ├── gpt_bert.py # D1 双目标混合 │ │ │ ├── modern_bert.py # D2 现代双向 │ │ │ ├── xlstm.py # D3 矩阵记忆 │ │ │ ├── rtd.py # D4 替换Token检测 │ │ │ ├── moe.py # D5 MoE稀疏专家 (可叠加) │ │ │ ├── attn_res.py # D6 注意力残差 (可叠加) │ │ │ ├── embeddings.py # C0标准 / C1 N-hot │ │ │ └── distillation.py # 知识蒸馏 │ │ └── configs/exp_A.yaml # 基线YAML配置 │ └── tools/ # 实验管理工具 │ ├── generate_experiments.py # 生成 experiments.csv │ ├── run_experiments.py # 批量运行 (CSV→YAML→训练→评测→结果) │ ├── collect_results.py # 结果汇总 │ ├── smoke_test.py # 冒烟测试 (44个代码路径) │ └── verify_components.py # 组件验证 (32项逐个验证) ├── notes/ │ ├── encyclopedia.md # 改进点百科 (所有优化维度详解) │ ├── experiment_plan.md # 实验计划 (384个实验, 22阶段) │ ├── experiment_log.md # 实验结果记录 │ ├── progress_report.md # 本文件 │ ├── ref_datasets.md # 数据集详细信息 │ ├── ref_leaderboard_2025.md # 2025排行榜数据 │ └── babylm_leaderboard_2025.csv # 原始排行榜CSV ├── data/ # 训练数据 (14个源, 119M词原始) │ ├── raw_files/ # 原始数据文件 │ ├── 1_noise_filtered/ ~ 7_eval_sentences/ # 处理流水线各阶段 │ ├── 8_sample_B/train.txt # 策略B采样 (9.99M词) ✅ │ └── 8_sample_C/train.txt # 策略C采样 (9.99M词) ✅ ├── models/ │ ├── tokenizer/ # BPE 8K 分词器 ✅ │ ├── tokenizer_morfessor/ # Morfessor+BPE 分词器 ✅ │ └── qwen3.5-9b/ # Qwen模型 (Paraphrase生成用, 18GB, 不上传) ├── evaluation-pipeline-2025/ # 官方评测pipeline ├── 2025_papers/ # 参考论文PDF ├── checkpoints/ # 训练checkpoint (空) └── experiment_results/ # 实验结果 (空) ``` --- ## 三、已实现的全部功能 ### 编号规则:每个维度 X0 = 基线(不优化的默认选择) ### B: 分词器 | 编号 | 方法 | 状态 | 配置 | |:----:|------|:----:|------| | B0 | BPE 8K(基线) | ✅ | `tokenizer: bpe` | | B1 | Morfessor+BPE | ✅ | `tokenizer: morfessor_bpe` | | B2 | 词表大小 (4K/8K/16K) | ✅ | 需重新训练分词器 | ### C: 嵌入策略 | 编号 | 方法 | 状态 | 配置 | |:----:|------|:----:|------| | C0 | 标准嵌入(基线) | ✅ | `embedding.type: standard` | | C1 | N-hot 形态嵌入 | ✅ | `embedding.type: nhot` | | C2 | FastText 初始化 | ✅ 代码 | `embedding.init: fasttext`(需先训练FastText模型) | ### D: 模型架构 | 编号 | 方法 | 状态 | 验证 | 配置 | |:----:|------|:----:|:----:|------| | D0 | GPT-2(基线) | ✅ | loss=5.31 | `arch: gpt2, objective: clm` | | D1 | GPT-BERT | ✅ | loss=5.74 | `arch: gpt_bert, objective: gpt_bert` | | D2 | ModernBERT | ✅ | loss=3.33 | `arch: modernized_bert, objective: mlm` | | D3 | xLSTM | ✅ | loss=4.54 | `arch: xlstm, objective: clm` | | D4 | RTD/ELECTRA | ✅ | loss=3.99 | `arch: rtd, objective: rtd` | | D5 | MoE(可叠加) | ✅ | loss=5.79 | `use_moe: true` | | D6 | AttnRes(可叠加) | ✅ | loss=5.74 | `use_attn_res: true` | ### E: 训练目标与掩码 | 编号 | 方法 | 状态 | 验证 | 配置 | |:----:|------|:----:|:----:|------| | E0 | 标准均匀掩码(基线) | ✅ | loss=5.74 | `masking.type: standard` | | E1 | AMLM 自适应掩码 | ✅ | loss=5.75 | `masking.type: amlm` | | E2 | 掩码率衰减 | ✅ | — | `mask_ratio: 0.30, mask_ratio_end: 0.15` | | E3 | 频率感知掩码 | ✅ | loss=5.74 | `masking.type: frequency` | | E4 | MNTP:CLM 比例 | ✅ | — | `training.mntp_ratio: 15` | | E5 | 反向课程 MTP | ✅ | — | `training.use_mtp: true` | ### F: 优化器 | 编号 | 方法 | 状态 | 验证 | 配置 | 注意事项 | |:----:|------|:----:|:----:|------|---------| | F0 | Adam(基线) | ✅ | loss=6.90 | `optimizer.type: adam` | 收敛慢 | | F1 | AdamW | ✅ | loss=5.74 | `optimizer.type: adamw` | **推荐默认** | | F2 | LAMB | ✅ | loss=5.74 | `optimizer.type: lamb` | **fp16下lr≤0.005** | | F3 | FORGETTER | ✅ | loss=5.78 | `optimizer.forgetter: true` | 需 wd=1.0 | | F4 | Muon | ✅ | loss=5.69 | `optimizer.type: muon` | 慢2.5x,loss最低 | ### G: 超参数与训练方式 | 编号 | 方法 | 状态 | 配置 | |:----:|------|:----:|------| | G1-G5 | lr/batch/wd/dropout/seqlen | ✅ | YAML 配置 | | G6 | 逐句模式 | ✅ | `data.packing: sentence`(较慢) | ### H: 训练技巧 | 编号 | 方法 | 状态 | |:----:|------|:----:| | H1 | Checkpoint 选择 | ✅ 每epoch保存 | | H2 | Checkpoint 平均 | ✅ `checkpoint.averaging: true` | | H3 | 知识蒸馏 | ✅ 代码完整(需下载teacher模型) | ### 评测集成 | 模式 | 内容 | 时间 | |------|------|------| | fast | Zero-shot: BLiMP, EWoK, ET, WUG, Reading | ~15分钟 | | **full** | Zero-shot + GLUE微调(7子任务) + AoA | ~60-90分钟 | --- ## 四、验证结果 ### 组件验证(32 项,每项 3 epoch) | 组 | 通过 | 失败 | 已知问题 | |----|:----:|:----:|---------| | 架构 (11项) | 11 | 0 | — | | 嵌入 (2项) | 2 | 0 | — | | 分词 (2项) | 2 | 0 | — | | 掩码 (3项) | 3 | 0 | — | | 优化器 (11项) | 8 | 3 | LAMB+fp16+lr>0.005=NAN(已修复默认LR) | | 超参 (1项) | 0 | 1 | sentence模式数据加载慢(需增大timeout) | | 组合 (2项) | 2 | 0 | — | ### 第一个完整实验 GPT-BERT + AdamW + lr=5e-4 + 10 epoch + fast eval: | 指标 | 我们 | 2025基线 | |------|:----:|:--------:| | BLiMP | **75.37** | 71.7 | | BLiMP Supp | 60.40 | 63.2 | | EWoK | 49.18 | 49.5 | | Entity Tracking | **42.29** | 34.6 | | Avg Zero-Shot | **56.81** | — | --- ## 五、已知问题 | 问题 | 状态 | 解决方案 | |------|:----:|---------| | LAMB+fp16+lr>0.005=NAN | ✅ 已修复 | 默认LR改为0.005 | | G6 sentence模式慢 | 已知 | 增大timeout或优化数据加载 | | FastText模型未训练 | 待做 | `python scripts/02_model/train_fasttext.py` | | KD teacher模型未下载 | 待做 | 下载Qwen teacher | | 数据增强脚本未写 | 待做 | Variation Sets/RecombiText/CD/MATTR/信息密集合成 | --- ## 六、下一步工作 ### 立即要做 1. **上传项目到 HuggingFace**(排除 qwen3.5-9b 模型) 2. **开始正式实验 Phase 1-5**: - P1: 5种架构对比 - P2: 核心特性消融 (AMLM/N-hot/FORGETTER/MoE/AttnRes) - P3: LR sweep - P4: 正则化 sweep - P5: 特性组合 ### 后续阶段 - P6-P11: 掩码调参、batch size、优化器、架构修改、分词×嵌入 - P12: 数据集构建方式 (13种) - P13-P21: 跨架构验证 → 最终候选 → 提交 - 数据增强脚本开发 --- ## 七、如何运行 ### 环境安装 ```bash pip install -r requirements.txt pip install muon-optimizer torch-optimizer morfessor ``` ### 单个实验 ```bash python -m scripts.03_training.train --config scripts/03_training/configs/exp_A.yaml python -m scripts.03_training.train --config xxx.yaml --eval-mode fast # 快速评测 python -m scripts.03_training.train --config xxx.yaml --skip-eval # 跳过评测 ``` ### 批量实验 ```bash python scripts/tools/run_experiments.py --phase 1 --list # 查看 python scripts/tools/run_experiments.py --phase 1 # 运行 python scripts/tools/run_experiments.py --phase 1 --resume # 断点续跑 python scripts/tools/collect_results.py --phase 1 # 查看结果 ``` ### 组件验证 ```bash python scripts/tools/verify_components.py --group arch # 验证架构 python scripts/tools/verify_components.py --resume # 跑全部(跳过已通过) ``` --- ## 八、关键配置速查 ```yaml model: arch: gpt2 # gpt2(D0) | gpt_bert(D1) | modernized_bert(D2) | xlstm(D3) | rtd(D4) use_moe: false # D5 MoE use_attn_res: false # D6 AttnRes data: tokenizer: bpe # bpe(B0) | morfessor_bpe(B1) packing: concat # concat | sentence(G6) embedding: type: standard # standard(C0) | nhot(C1) init: random # random | fasttext(C2) training: objective: gpt_bert # gpt_bert | clm | mlm | rtd learning_rate: 0.0005 # AdamW推荐; LAMB需≤0.005(fp16) use_mtp: false # E5 反向课程MTP masking: type: standard # standard(E0) | amlm(E1) | frequency(E3) optimizer: type: adamw # adam(F0) | adamw(F1) | lamb(F2) | muon(F4) forgetter: false # F3 FORGETTER ```