读完之后我最不服气的一点:「睡眠」是这篇博客里最不重要的词。
它没在睡觉,它在做 compaction。这套东西跑在固定架构和人为规则里,跟真的生物睡眠机制不沾边——作者自己也写了。那为什么不直接叫 compaction?因为「睡眠」好传播。行吧。
先别急,我不是来骂标题的。抹掉这两个字之后,底下那套机制反而更值得画开:它把「往权重里写新东西,又不能把旧的写坏」当成一个存储分层问题在解。这个转换才是真东西。
问题本身不新,博客归纳成三条:知识停在截止日期;直接持续更新参数会灾难性遗忘;靠上下文学习只能把新东西留在当前会话窗口里,会话一关就没了。
第三条我想多说一句。这两年大家的默认答案都是「上下文窗口拉长就行了」。不行。窗口再长也只是桌子更大,东西还摊在桌上,人一走桌子就清空。那不叫学,那叫记性好。
我的第一版图是这样的:
[ 模型权重 ]
▲
│ 睡眠阶段:把白天学到的东西写进去
│
[ 白天积累的临时记忆 ]
干净、对称、错。
错在哪:往同一批参数里写,就是覆盖,覆盖就是遗忘。这恰恰是它要解决的问题。我盯着这张图看了半天,脑内只有羊叫。
等等等等,先别急。关键是「扩容量」那一步——它不覆写,它加一层。
清醒:收输入
│ 临时信息 → 短期记忆(高频参数,热区)
▼
睡眠
├─ 巩固:扩出新的低秩 MoE 专家(容量是预先划好的)
│ 热区知识蒸馏进这里,旧参数基本不动
├─ 修剪:把热区那批高频临时参数重置,腾出地方
└─ 做梦:路由随机点亮非标准专家 → 生成合成样本
→ 按梯度筛 → 挑好的做微调
▼
清醒:进入下一个阶段
画张图更直观,三块区域:
┌──────────┬───────────────┬──────────────────┐
│ 热区 │ 温区 │ 冷区 │
│ 高频临时│ 扩展出的 │ 原来的老参数 │
│ 参数 │ 低秩专家 │ 基本不动 │
├──────────┼───────────────┼──────────────────┤
│ 睡眠后 │ 巩固时写入 │ 全程稳定 │
│ 被重置 │ 长期留在这里 │ │
└──────────┴───────────────┴──────────────────┘
「预先分配」这四个字是整套东西里最像工程、最不像魔法的部分。容量不是无限长的,是事先划好的预算,用完就那么多。这一条决定了它是能落地的方案,不是「让模型自己长」。
我看到「写入 → 合并 → 回收」这个循环的第一反应是:这就是 LSM-tree 的 compaction,或者 CPU 的缓存分层。热区是 write buffer,巩固是往下层 merge,修剪是回收空间。「睡眠」只是这个循环的调度时机。
这个比喻抓大方向很好用,但它漏风,而且漏得不止一处。
第一处:生物的睡眠是整块脑子下线、专门巩固白天的经历;这里只有被路由到的那一撮专家在动,核心代码和设计全程不变。所以它更像「一个后台进程在沙盒里跑,预算固定」,不像「大脑睡了」。
第二处漏得更狠:生物不会梦到自己没见过的语法。而它的「做梦」阶段是模型自己生成合成样本——白天根本没经历过的东西。这一点直接戳穿了比喻:它不是在做梦,它是在做带探索噪声的 rehearsal。
那「做梦」到底在干什么?说白了:随机点亮一些平时不用的专家,把不同领域的知识搅在一起;然后生成样本,按梯度信号筛掉没用的;挑出来的好样本做监督微调,再看下游表现。理论上把它解释成「改善优化景观的几何结构」——随机激活拓宽梯度方向,筛选强化有用信号,梯度条件更好。这个解释我买,它就是一个采样策略加数据筛选,没什么玄的。
只有一个小地方让我挑了下眉毛:奖励里有一项是 Levenshtein 距离,就是字符串编辑距离。用编辑距离当「你学到没有」的奖励信号,粗糙得有点可爱。语义相似度加上字面相似度,两个都是「看起来