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 推理 BF165.59 GiB / ~19 tok/s对话需 ≥10 tok/s
3B 推理 INT41.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 判据:「知道但说不出」 —— 信息在状态里可解出,语言却表达不出, 且提示能解锁(这是拟合系统不会有的现象)


#贯穿全程的四条纪律

  1. 判据先写进文件再跑,带 kill criterion(§11.3)
  2. ≥3 种子,报成功率 —— 单种子结论已被推翻两次
  3. 任何"某能力不行"的结论,必须在多个 lr 下确认(§11.11)
  4. 判据必须能失败 —— 如果一个实验没有失败模式,它不在测任何东西

外加一条工程纪律:跑基准前先查有没有别的 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)


← 返回《PROJECT.md》目录