6A. 预训练目标(此前缺失的一环)
#6A.1 问题:我们此前没有预训练目标,只有探针任务
| 项 | 实测 |
|---|---|
| 目标函数 | 延迟匹配二分类,交叉熵,只在最后一个时间刻 |
| 单试次信息量 | 7.3 bit |
| 数据 | data\ 仅 1.4 KB(任务每次现场随机生成,不存数据) |
| 规模 | 1,874 参数,16 单元 |
"7.3 bit 一个试次"是问题的实质。 我们把 6000 万 bit 反复用来学一个 7.3 bit 的问题 —— 而任务要求的能力只有"记住一项、比一下"。 这是探针,不是预训练。
#6A.2 目标:自回归的序列到序列预测,损失在每个时间刻
这一条同时修掉 exp13(§6.13)暴露的两个问题:
| 问题 | 这个目标怎么修 |
|---|---|
| 状态"只在最后一刻被需要" | 每刻都要输出 → 状态必须全程携带信息 |
| 状态没有表达通道 | 输出是序列 → 状态有了必须表达的东西 |
#6A.3 为什么用算术作预训练场
| 理由 | 说明 |
|---|---|
| 答案可验证 | 生成即标注,不需要人工 |
| 数据无限且免费 | 1~3 位混合三则 ≈ 300 万题;1~4 位 ≈ 4 亿题 |
| 难度可调 | 位数、运算、是否进位 |
| 需要的能力正好是对话体需要的 | 记住操作数→记住你说的话;进位→持有约束;逐位输出→逐字说话 |
诚实边界:算术预训练建成并验证机制,不产生对话能力。 语言层仍走 §4 的解耦方案(本机小 LLM 当"发声器官")。
#6A.4 屏幕格式("接地"的落点)
PROJECT.md 需求 4:符号接地 —— 词义锚定在感觉运动经验上。 所以不喂字符 ID,而是把字符渲染成点阵,喂像素。
屏幕 2 行 × 128 px(8 字符位/行,16×16 px/字符)
通道 0 = 输入行,通道 1 = 输出行 + 光标
帧维度 2 × 32 × 128 = 8192 位
光标 该字符位左侧的竖条 —— "位置"的感觉运动锚点时间结构(一个试次):
读入段 逐字符出现(不是一次给整题!),光标右移
静默段 ★ 屏幕清空 —— 题目只能存在于状态里
写出段 每刻输出一个字符,写进去、光标右移(自回归)"静默段清屏"是刻意的设计:如果题目一直留在屏幕上,模型可以直接"看" 而不需要记住 —— 那就不需要持续状态,整个架构的前提落空。
字符集:" 0123456789+-*="(15 类,含空白)
实测:最小汉明距离 9(+ vs -),中位 28 → ✔ 可分
(对照:991 个常用汉字最小距离 2,己/已)
扰动策略:只做平移。实测依据:平移±1 → 98.2%; 平移+膨胀 → 95.8%;平移+腐蚀 → 0.2%。 腐蚀会抹掉 1~2 像素宽的笔画,字就不是那个字了 —— 是禁区。
#6A.5 五级台阶(每级有事先定死的判据)
| 台阶 | 任务 | 判据 | 为什么在这一级 |
|---|---|---|---|
| 1. 感知 | 单字符位图 → 识别 | 未见字符 + 平移扰动 ≥95%(15 类,随机 6.7%) | 认不了符号后面全废;这一步不需要状态 |
| 2. 保持 | 给一个符号 → 延迟 → 输出它 | 未见延迟 ≥90% | 把"记忆跨度"变成输出要求而非分类 |
| 3. 多位保持 | 给多位数字 → 延迟 → 逐位输出 | 3 位 ≥90% | ★ 顺序输出第一课:必须按序吐出 |
| 4. 变换 | 给 a op b → 输出结果 | 1 位三则 ≥95%;3 位加减 ≥80% | 引入"对记忆内容做操作" |
| 5. 组合 | 混合长度/运算,未见组合 | 未见组合 ≥70% | 泛化,而不是记住题型 |
台阶 1 是关键前提,而且我们从没做过 —— exp03 只做到 53.6%(但那是在做 600 类汉字)。
#6A.6 已实现
core/tasks/arithmetic.py —— 数据管线,自检全通过:
屏幕 2 行 × 128px 字符集 ' 0123456789+-*='(15 类)
300 个试次:算式正确性 / 静默段两行全空 / 仅写出段监督 / 监督刻数一致
-> 异常 0 处 ✔
200 个试次 × 2 行,静默段字形非空: 0 ✔ 无泄漏
-> 负向验证(手动写入字符后报出): ✔ 报出
自回归结构正确 ✔关键检查方法:泄漏检查用解码回字符(row_content),
而不是"数像素" —— 后者会把光标误判成泄漏(假警报,已踩过)。
可视化:experiments/viz_arith_samples.py → results/arith_samples.png
#6A.7 与"训练规模"的关系(§4)
算术预训练不解决通用对话的数据问题(那需要 1.4 万亿 tokens,不可达)。 它解决的是:建成并验证"持续状态 + 顺序输出 + 多步信用分配"这三个机制。 机制成立之后再谈语言层 —— 而语言层走 §4 的解耦方案,不靠我们从头训。