P0 预训练后的第一次直接提问:失败比成功更有信息
这篇记录一个应该被正面保存的负结果。
我们刚完成了 TreeHeap 的 P0 原始中文文本预训练:不使用问答标签、不使用翻译对、不读取旧 checkpoint,只做最普通的自监督任务:
前 64 个中文 BPE token
-> TreeHeap encoder
-> 预测后续 32 个 BPE token
训练集来自新闻、百科和网页文本的混合。它的目标是先让模型从大量原始文字中学习语言分布;它不是一个已训练好的聊天模型。
1. 已经跑通了什么
本次主运行使用约 16,000 个 BPE 词表、192 维状态、12,785,921 个可训练参数,在 io 的 RTX 3090 上训练 50,000 step。
| 指标 | 开始 | 结束 |
|---|---|---|
| 验证 NLL | 9.658 | 5.519 |
| 验证 PPL | 15,626 | 249.4 |
| 训练时间 | - | 48.0 分钟 |
NLL 是模型对正确后续 token 的负对数概率,越小越好;PPL 是同一件事的指数形式,越小越好。这里的下降说明梯度确实从真实中文语料中更新了参数,模型比初始随机参数更会预测留出文本。
这支持的只是下面这个很小但真实的结论:
原始中文文本
-> TreeHeap 编码器与 decoder
-> 交叉熵梯度
-> 更低的留出续写损失
它不自动推出“模型理解世界”。
2. 直接问它:地球为什么是圆的?
为了避免只看数字,我们直接加载训练完成的 checkpoint,以 greedy decoding(每一步总选概率最大的 token)做了两次 CLI 测试。
输入:地球为什么是圆的?
输出:圆圆圆圆圆圆圆圆圆圆圆圆圆圆圆圆……
输入:问:地球为什么是圆的?答:
输出::圆圆::圆圆::圆圆::圆圆:圆圆圆……
这不是一个不够漂亮的答案,而是生成退化:模型把输入里显眼的“圆”当成局部最高概率 token,并在每一步再次选择它,形成循环。
正确答案至少需要表达类似关系:地球足够大,重力会把物质拉向中心,长期达到近似球形的平衡。当前模型没有给出这些关系。
3. 为什么它在 WMT 上看起来比这里顺一些?
此前的 WMT 英译中实验里,TreeHeap 有时能输出看似完整的中文句子。这不和本次失败矛盾。
翻译是强条件任务:
英文源句 + 对齐的中文目标
decoder 在每一步可以读取英文叶子、内部子堆和 root;训练还会用正确中文前缀进行 teacher forcing。因此它只需在一个受源句限制的候选空间中选下一个中文 token。
本次提问却要求模型:
短问题
-> 从参数中取出有关重力与球形的知识
-> 组织成解释
-> 连续生成多个正确 token
而 P0 训练见到的是固定形态的 64 token 上下文 -> 32 token 后续,不是 问题 -> 答案。问题本身也远短于训练上下文。这既是任务格式变化,也是能力要求的大幅提升。
更重要的是,WMT 的数值本身也不强:TreeHeap 的 token-BLEU4 为 1.48,落后于 flat GRU 的 2.87。因此“看起来像中文”只能说明有表面语言信号,不能说明它已经可靠翻译,更不能说明它有问答能力。
4. 这次失败定位了什么
失败不是“GPU 没有训练”或“梯度没有写入参数”。验证 NLL 的大幅下降排除了这两种最初级的故障。
它暴露的是更靠后的三个缺口:
- 训练规模与语料覆盖不足。 5 万步、1,279 万参数的模型只能开始拟合局部文字分布,远不足以储存和组织通用事实。
- 生成策略过于脆弱。 greedy decoding 很容易被一个局部高概率 token 锁死。采样、温度、重复惩罚可以诊断这一点,但它们不能凭空补出知识。
- 没有问答格式和证据读取训练。 P0 应先提供语言与统计基础;后续 QA 阶段才应训练
question + context -> answer,并检验 decoder 是否能读到支持答案的子堆。
5. ARA 状态
S3-P0-WORLD-OBS-C01
-> supported feasibility only
当前证据支持:TreeHeap P0 管线可以在真实中文语料上优化留出续写损失。
当前证据不支持:
TreeHeap 已形成世界模型
TreeHeap 可以回答开放问题
TreeHeap 已学会可靠的中文生成
TreeHeap 相比 flat sequence 有结构优势
下一步应先在完全相同的 P0 数据、词表、切分、参数量附近补齐 flat_seq 和 BoW 基线。只有先回答“TreeHeap 是否比非结构模型多学到了什么”,才值得继续扩大训练或进入 QA。
6. 可复查证据
训练证据:
ara/s3-generation/evidence/s3_p0_world_observation_main/
脚本:
ara/s3-generation/src/s3_treeheap_p0_pretrain.py
checkpoint:
checkpoint.pt
负结果不是航行失败的终点。它把“模型还不会什么”变成了可复查的事实,也防止我们把损失下降误读成理解已经出现。