用元胞自动机做语言模型:一次小规模探索
作者用神经元胞自动机(仅 3×3 局部卷积)替代注意力机制,在极小网格上训练字符级语言模型,并测量信号能否跨越网格传播。
一位独立研究者尝试完全不使用注意力机制与 Transformer 块,仅依靠一个二维网格中每个单元与八个邻居的局部交流,构建一个字符级语言模型。这不是一项严肃的 benchmark 评测,而是一次关于「局部规则能否涌现出下一字符预测能力」的实验性记录。
架构:一张网格代替注意力
作者把字符嵌入沿网格的顶行注入,每个单元持有一个 16 维向量,每一代在整张网格上施加同一个 3×3 卷积作为状态更新规则,并叠加残差连接。最早的文本模型采用 16×16 网格、8 个字符的上下文窗口以及 8 代演化,最终从靠近右侧的某个单元读出下一个字符。
这里的硬性约束是:信息只能通过相邻单元逐格传递。一个离输入位置 16 列远的读出单元,要拿到信息至少需要 16 代。这意味着如果局部规则本身没有学到「搬运」能力,远距离预测就不可能成功。实现用 PyTorch 完成,规模刻意保持极小。
训练结果:小语料上的字符级实验
为了让模型有东西可学,作者自己写了一段以「the little red fox ran home」为模板的重复性小语料作为训练数据。训练 900 步后,训练集交叉熵降至 0.310,验证集交叉熵为 0.359。模型确实能生成训练文本的片段,例如:
- the little red fox ran home.o..ittle red fox ran home.o..ittle red fox r
前半句正确,后半段则陷入同样的重复循环。作者对此并不满意,因为循环本身并不等同于学到了有用的语言结构。
信号能传多远:探针实验
为了区分「网格真的在搬运字符信息」与「输出附近的单元只是学了局部模式」,作者冻结语言模型,在已知位置放入两种字符之一并用随机字符包围,再在不同位置的单元上训练线性探针,看它能否恢复出被改写的字符(随机概率为 50%)。
距离信息源 1 列处的探针准确率约 75%,距离 4 列处降至约 59%,而到 16 列处无论跑 8 代还是 32 代都已回落到 50%,即与随机无异。结果说明:路径是存在的,但有用信号难以穿越整张网格到达远端读出点。
重复:周期而非坍缩
作者原本以为重复输出意味着网格收敛到了某个稳定不动点。测量后这一猜测被否:连续两步的网格状态在 L2 距离上保持约 22 单位的差异,且输出熵没有骤降到 0;但在 26 字符短语同一位置上,两次生成的网格完全一致。换言之,这是一个由「滑动上下文重复 → 确定性重建同一网格 → 输出同一字符」驱动的周期而非固定点。区分这一点对后续实验是必要的,因为后续另一次实验确实观察到了单字符死循环。
去掉语言:直接训练搬运能力
为判断「局部规则本质上能不能传远」,作者把语言建模整个拿掉,保留同样的局部更新机制,并直接训练规则让一个目标单元恢复距离源 1、2、4、8、16 列远的 0/1 bit,其余单元用共享的随机背景噪声干扰。
训练 32 代后,模型在 128 个平衡的留出样本上,将 16 列远的目标 bit 恢复到了 100% 准确率,重复两个随机种子都得到类似结果。可视化显示,两侧网格在 source bit 不同时的差异会随演化代际形成一条向目标端延伸的亮带。只要演化代数足够,这种纯局部规则完全可以在网格内完成中等距离的信号传输。
小结
这次实验展示了两件事:第一,仅靠局部 3×3 卷积构成的神经元胞自动机在小规模字符预测上能学到一些模式,但难以把信息传递到较远的读出位置;第二,在「目标明确 + 噪声背景共享」的刻意设置下,同样的局部规则经过足够多代演化,确实可以把一个 bit 精确送到 16 列之外。两条结论的落差,恰好说明了把局部规则扩展到真正语言建模任务时,距离与上下文长度是核心瓶颈。
