10. 路线图
7.5k 字 ·
源文件 PROJECT.md 第 1716 行起 ·
goal discipline ruler ground memory
本路线图于用户确定「在线教学」范式后重写。
范式:用户是老师,Darlin 是学生,对话(屏幕上的文字)是教学的媒介。 LNN 是真正的学习者(有持续状态),预训练 LLM 只负责语言与知识, 而且只在"出题"这一个角色上出场(见 §10.5)。
判据铁律:每一阶段动手之前,判据必须先写进文件(§11.3)。
#总纲(一句话)
先把结论修干净(0)→ 证明它能从后果学(1)→ 建立教学界面并测"教学信号形式"(2) → 让它在有限视野里主动获取信息(3)→ 引入语言(4)→ 长出内心(5) → 可打断(6)→ 与语言耦合(7)。
0 和 1 是地基,2 是教学范式的第一次验证,3 是最大的单点风险,5 才是最终目标。
#与旧阶段 A–E 的对应(保留可追溯性)
| 旧 | 新 |
|---|---|
| 阶段 A 基础机制 | 大部分已完成;剩余并入 第 0 阶段(清债) |
| 阶段 B 内心机制 | rotor 结构已实现 → 并入 第 5 阶段;预训练台阶 → 第 3 阶段 |
| 阶段 C 输出能力 | 并入 第 3 阶段(顺序输出)与 第 6 阶段(L2/L3) |
| 阶段 D 屏幕与接地 | 并入 第 2/3 阶段 |
| 阶段 E 语言层耦合 | 第 4 阶段 + 第 7 阶段 |
#第 0 阶段 · 清债(不改模型,只修正错误结论与度量)
要回答:我们现有的结论里,哪些是可信的?
- 0.1 修 §6.6 的三个缺陷:①它是未训练网络 ②"零输入"实为
enc(0)=b_enc恒定驱动 ③lstm/gru/ssm静默崩溃(只测到 3/6) - 0.2 「有效秩」→(保持力, 活跃度)成对 + 噪声/衰减校准对照
(已实现在
experiments/diag_cell_structure.py的part_f_retention) - 0.3 §6.6 从"未训练"改成"训练后"重跑 ← 判决性
- 0.4
mode="no_gate"A/B(一个词)。判据必须建在训练后的准确率上, 且匹配准确率 + 扫 lr,否则测的是优化难度不是容量 - 0.5 补 §6.13 的 lr 扫描(§11.11 的欠债)
- 0.6
units × lr交叉网格(§7.6 自己写着从未做) - 0.7 文档:§5 新条目 3 条 + §11 新纪律「没有失败模式的实验」
出口判据:6 项全部有数字、有对照、≥3 种子。
★ 本阶段最大的诱惑是跳过去直接做模型。但不做,后面每个测量都可能踩同一个坑。
#第 1 阶段 · 觅食跑通 → 建立「无老师基线」
要回答:它能不能从后果里学到东西?
- 1.1 修
core/envs/forage_agent.py:时序展开 + TBPTT + 回合边界重置 - 区域感知池化(现有编码器把状态条混进了网格区的池化 bin)
- 1.2
foraging.py接上三模态屏幕 + 5 动作(含"不动") - 1.3 重测随机基线(加"不动"后旧的 16.4% 作废)
- 1.4 首次训练:吃到率 > 随机基线,≥3 种子
- 1.5 消融:清零
CH_CURSOR→ 性能应显著下降(证明多模态真被用了) - 1.6 接实时训练 → 写
results/live_train.json
⚠️ 风险:可能像数学线一样学不会。若 3 种子全败,这个负面结论本身有价值。
出口判据:一个可复现的「无老师学习速度」数字 —— 后面一切教学实验的对照基线。
#第 2 阶段 · 教学界面
要回答:有老师,学得更快吗?
- 2.1 web 面板重新定位:监控面板 → 教学界面 (你能输入、延迟低、它能看到、记录教学历史)
- 2.2 教师通道:脚本能往屏幕上注入文字/符号(复用
arithmetic.py字形管线) - 2.3 三条件对照实验
三条件(本阶段核心):
| 条件 | 老师做什么 | 属于 |
|---|---|---|
| A 无老师 | 只有任务后果 | 基线(来自第 1 阶段) |
| B 示范 | 每一步给正确动作 | ❌ 拟合条件 |
| C 评价 | 只在结束说对/错,偶尔纠正 | ✅ 非拟合条件 |
三条指标:学会所需回合数 / 泛化到新符号 / 规则反转后的恢复速度
★ 核心预测(来自我们自己的 exp27:稀疏 1.00/1.50 vs 稠密 0.00/0.50):
B 分布内最快、分布外最差;C 反之。两种结果都有信息量。
#第 3 阶段 · 用电脑:打字(输出)与滚动(输入)
★ 本阶段于用户澄清后重写。 原版整段都在讲「滚动阅读」(输入侧),把打字折叠掉了 —— 那是个缺口。 用户的原始意图是:"让 LNN 学会用键盘打字",而这正是 §7.3 「缺少顺序输出(递归解码)」,文档里写着它"阻塞 L3 与算术任务"。
要回答:它能不能逐字符输出一段符号(打字),以及能不能主动获取信息(滚动)?
#3A · 打字(顺序输出)—— 这是主线,不是附属
为什么它已经有训练场:core/tasks/arithmetic.py 的写出段本身就是打字 ——
每刻输出一个字符、写进屏幕、光标右移,并在下一帧看到自己刚写的东西。
字符集 " 0123456789+-*=" 15 类,自检全通过。
| 台阶 | 任务 | 判据 | 现状 |
|---|---|---|---|
| 3A.1 感知 | 单字符位图 → 识别 | 未见字符 + 平移扰动 ≥95% | 前馈基线已达 100%(exp25) |
| 3A.2 保持 | 给一个符号 → 延迟 → 输出它 | 未见延迟 ≥90% | 循环核跨 12 刻 100%(diag_hold_minimal) |
| 3A.3 多位保持 | 给多位数字 → 延迟 → 逐位输出 | 3 位 ≥90% | ← 打字的第一次完整形态 |
| 3A.4 变换 | 给 a op b → 输出结果 | 1 位三则 ≥95%;3 位加减 ≥80% | 未做 |
| 3A.5 组合 | 混合长度/运算,未见组合 | ≥70% | 未做 |
★ 关键性质(必须保留):
- 自回归:上一刻写出的字符成为下一刻的输入 —— 这是"打字"与"一次分类"的分界
- 看得见自己的输出:用户明确要求过"在它写出时,它应该能看到自己的输出,从而认识数字"
- "不按键"已经可表示:
CHARSET[0] = " "、BLANK = 0。 "要不要打这个字"与觅食里的ACT_STAY(不动)同构 —— 所以"自己决定是否输出"不需要新机制,只需要训练信号里该沉默时有代价
#3B · 滚动(受限视野下主动获取信息)
| 台阶 | 任务 | 输出 | 判据 |
|---|---|---|---|
| 3B.1 翻页 | 内容超过一屏,用上/下/不动三分类翻 | 3 类 | §7.5 原话:"比打字容易(就是三分类)" |
| 3B.2 小窗口滚动 | 目标在窗口外,需滚动才能看到 | 3 类 | 找到目标的成功率 |
| 3B.3 滚动 + 记忆 | 刻数有限,滚回去看不划算 | 3 类 | 与"允许无限滚动"基线比,刻数应更少 |
★ 3.3 的设计要害(必须遵守):
不要强制记忆 —— 那会撞 §6.13 的同时容量墙,而且撞得更狠。 要让记忆"划算" —— 允许滚回去看,但滚动花时间。 于是学习曲线从"盲目乱滚"平滑过渡到"记住位置",没有"一开始就必须会"的悬崖。
★ 生物学依据:人类中央凹只有约 2° 视角的高分辨率,靠眼跳 + 记忆整合阅读。 "小窗口 + 滚动 + 记忆"= 中央凹式阅读器,是 §6A.4"静默段清屏"原则的自然推广。
🔒 阻塞项:若 3.2/3.3 撞同时容量墙,架构问题在这里才真正需要解决(不是现在)。
届时可选:矩阵记忆(DeltaNet 式覆写 > 纯加性 mLSTM)/分区显式双通道/
activity_loss(rotor 缺的那一半)。
⚠️ 单点风险:若同时容量是硬瓶颈,滚动阅读可能整体不成立。
#第 4 阶段 · LLM 进来(只为语言)
要回答:它能不能从语言描述的后果里学?
- 4.1 装
peft+accelerate(纯 pip,几 MB,无风险) - 4.2 试
bitsandbytes;失败则走 llama.cpp + GGUF - 4.3 下模型:
huggingface.co已实测封禁;走hf-mirror.com或modelscope.cn - 4.4 测三件事:推理 tok/s、QLoRA 能否跑、显存峰值
- 4.5 LLM 作为「出题者」接入
4.4 的事先判据(不达标就调整选型):
| 项 | 实测预算 | 判据 |
|---|---|---|
| 3B 推理 BF16 | 5.59 GiB / ~19 tok/s | 对话需 ≥10 tok/s |
| 3B 推理 INT4 | 1.40 GiB / ~74 tok/s | ✅ |
| 全量微调 3B | ≈45 GiB | ❌ 不可能 |
| LoRA(BF16 底座) | ≈8–10 GiB | ❌ 8GB 不够 |
| QLoRA(4bit) | ≈4–6 GiB | ✅ 唯一可行 |
实测依据:
experiments/bench_pretrain_budget.py、probe_llm_env.py(RTX 5060 / 7.93 GiB / 实测显存带宽 278 GB/s)
★ LLM 的角色只能是「出题者」(模式 A):
| 模式 | 判定 |
|---|---|
| A 出题者 | ✅ 干净 |
| B 评价者(LLM-as-reward) | ⚠️ 是"洗过一道"的拟合,偏差会灌进 LNN 的内心 |
| C 示范者 | ❌ 就是拟合陷阱(exp27 实测最差) |
★ LLM 唯一不可替代的贡献是语言 —— 奖励和课程脚本就能给。 词义必须来自后果,不能来自 LLM 的评价。
出口判据:LNN 能对屏幕上渲染出的词做出正确反应,且 换一个没见过的新词表示同一件事 → 学得更快(这才是接地,不是查找表 —— §3 需求4 原判据)。
#第 5 阶段 · 内心(最终目标所在)
要回答:它有没有「不只是输入的函数」的内部状态?
- 5.1
wick快变量:当下情绪(衰减 + 事件驱动) - 5.2
balance中变量:羁绊(跨会话漂移) - 5.3
caliber慢变量:性格(几乎不可逆) - 5.4
activity_loss(rotor缺的那一半)—— 已降级为条件性选项。 理由见 §7.2 修正:延迟期末的内容保持率已是 100%,而activity_loss的作用正是推动状态去动 —— 两者是张力关系,硬加很可能把保持打坏。 优先用 §5.5 之外的显式外生变量(a(t))实现"空闲时有过程", 因为a(t)加在状态外面,不碰保持通路。 只有在显式变量也做不到时才回到activity_loss, 且判据必须含 内容保持率不得下降(不只是准确率) - 5.5
complications情节记忆 - 5.6 内驱力 → 主动发起
★ 每一级的共同判据:消融 —— 固定该变量 → 行为必须显著变化。 ★ 5.4 用 §7.2 原判据:有效秩 ≥4/16、末段每步变化 >1e-3、且任务准确率下降 <10pp。
★ 这一阶段的正当性来自教学范式,不是"文档里列了":
| 变量 | 在教学中它是什么 |
|---|---|
wick | 老师这一刻的赞许/失望 |
balance | 跨会话累积的熟悉与信任 |
caliber | 长期被塑造的稳定倾向 |
complications | "上次你教过我这个" |
| 内驱力 | 学生提问、表示不懂 |
🔒 关键:旧阶段 B 的验收标准 消融验证:固定状态变量 → 行为应显著变化
因为那些变量不存在而根本无法执行。本阶段让这条验收第一次变得可执行。
#第 6 阶段 · 可打断(L1 / L2 / L3)
- 6.1 L1 修复后重跑验证(各条件正例比例:干净 0.484 / 按新 0.500 / 按旧 0.062)
- 6.2 L2 约束累加 ← §3 那个"养猫还是养狗"的例子
- 6.3 L3 承诺后改写(依赖顺序输出)
★ 教学框架里的对应:
| 层 | 老师做什么 |
|---|---|
| L1 | 中途改规则 → 学生跟上 |
| L2 | 再加一条约束,旧的仍有效 |
| L3 | 学生已答了一半,老师说"不是这个意思" |
第 2 阶段的"规则反转"指标是本阶段的雏形,本阶段把它做成正式的分层判据。
#第 7 阶段 · 与语言层耦合
- 7.1 内心状态 → 调制 LLM 的输出(语气、内容选择)
- 7.2 判据:固定 prompt,只改内部状态 → 输出必须变。 变了 = 翻译;由 prompt 决定 = 拟合
- 7.3 自我模型(含稳定的性别化身份)
- 7.4 关系记忆:记得你、能主动提起
- 7.5 T3 判据:「知道但说不出」 —— 信息在状态里可解出,语言却表达不出, 且提示能解锁(这是拟合系统不会有的现象)
#贯穿全程的四条纪律
- 判据先写进文件再跑,带 kill criterion(§11.3)
- ≥3 种子,报成功率 —— 单种子结论已被推翻两次
- 任何"某能力不行"的结论,必须在多个 lr 下确认(§11.11)
- 判据必须能失败 —— 如果一个实验没有失败模式,它不在测任何东西
外加一条工程纪律:跑基准前先查有没有别的 python 进程在抢 GPU
(exp24 曾残留 2 小时污染测量,见 §6.19c)。
#需要用户决策的五个岔路口
| # | 时机 | 要定什么 |
|---|---|---|
| 1 | 第 0 阶段后 | 若 units×lr 显示大 units 可用 → 架构线彻底关闭;不可用 → 才考虑矩阵记忆 |
| 2 | 第 3.2 台阶 | 撞同时容量墙时:加容量(矩阵记忆)还是改任务(放宽记忆需求) |
| 3 | 第 3 阶段 | 窗口参数:字宽(16px 还是 8px)、行数、滚动粒度 |
| 4 | 第 4 阶段 | 下哪个模型(走 modelscope 还是 hf-mirror) |
| 5 | 第 4 阶段 | LLM 的角色:建议只做 A(出题者) |
#暂不做
- 通用对话(需 1.4 万亿 tokens,不可达)—— 语言层走 §4 解耦方案
- 皮层分区(在"能学起来"之前,加了只是增加调参维度)
- 纯 LNN 语言模型(真正的障碍是训练并行性不是表达力;而我们根本不需要它表达语言)
- 自造新循环单元 —— 第 0 阶段若证明容量不是瓶颈,则整条线关闭; 若需要,也走"现成架构 + 最小改动"(§10 决策 1)