跳到主要内容

TokenTown 展示的,不是 Transformer 正在做的

老铁
老铁

· 阅读约 6 分钟

上礼拜几个群在疯转同一个链接,标题清一色“史上最直观的 Transformer 可视化”“终于有人把注意力机制讲明白了”。我点进去,是一座等距城市,token 像公交车一样在街道间开,楼是 embedding,广场是 layer norm,注意力是高架桥。评论区一溜“我竟然看懂了”。我跟着点进仓库翻了源码。翻完我干了一件挺扫兴的事:把讲解声音关掉,只留城市在动,然后问自己——我现在看到的,哪些是模型真在干的,哪些是作者替我演出来的。

结论一句话:骨架是,肌肉不是。

这项目不是水货。它是真在浏览器里跑了 tokenizer、embedding lookup、正弦位置编码、layer norm、多头缩放点积注意力、残差、FFN、GELU、温度采样和 top-p,每步都落在那个小模型自己的参数上。比拿 SVG 画箭头就敢叫“可视化”的 PPT 强太多。我质疑的不是它会不会算,是它在什么地方改了计算结果,以及改完之后,“这就是 Transformer”还成不成立。

改的地方,有两刀致命。

第一刀在 logits。项目自己写了:模型权重随机生成的,没训练过。随机权重是什么结果?最后的 logits 基本是噪声,softmax 以后每个词的分数谁也不统治谁,输出是乱码。作者为了让屏幕上那串 token“看起来像人话”,在真实 logits 的基础上混进来一个在小语料库上算好的二元语法先验。我再说一遍:混进去。不是颜色调亮一点那种混,是把一个外部统计模型的分值直接加进“下一个词采哪个”的决策里。

所以你在城市出口看到的那串像样的词,很大一部分功劳不属于那个 Transformer,属于作者装进去的 bigram 表。观众以为自己在看“模型生成了下一个 token”,实际上看的是随机分布被外部先验硬掰成能看的形状。这个工具标榜展示 LLM 内部运作,可它最“能看”的产出——文本——恰恰不是模型自己的产出。教学上最要紧的那个承诺没了:你看到的,不是它正在做的。

第二刀在注意力。softmax(QK^T/√d) 算完,每个 query 对每个 key 的权重是模型自己给的。TokenTown 在这个分布上又加了一道工序:手动锐化,再给第一个 token 加个 bias,给最近 token 加个 bias。换成工程白话,就是把大分数拱得更大、小分压得更小,好让屏幕上那几根箭头指向清楚、画面干净,讲解的时候有个“看,它 attend 过去了”的瞬间。

可那条信息流没存在过。是作者拿钳子掰出来的。sink token 在训练过的模型里确实常见,recent bias 也常见,但那是模型学出来的习性,不是每一步都等量适用。TokenTown 干的事,是替一个没学出任何习性的随机模型补演了一遍别人的戏。你是导演,不是录音师。观众看到箭头从句尾指回句首,自然以为“模型现在的注意力就是这样的”,可那个模型自己的注意力分布真画出来,极可能是一张均匀噪声。这不是教学,是 cosplay。

到这里有人要拍桌子:一个教学 demo,模型缩小、随机权重、加点后处理,不然没法看,至于吗?我的回答没变过:正因为它贴着“教学”俩字,才必须较真。教学给人打的是第一层底子,底子错一点,上面全歪。你指望一个人理解 softmax 怎么从 logits 里挤出概率,你给他看一个被人动过手脚的 logits,他能理解出什么?

还没提“模型缩小”的事。为了演示弄成 12 维、2 头、几百词,我理解,浏览器跑不动大权重。但缩小维度是有代价的:12 维空间里向量夹角分布跟 768 维里差太多,低维 embedding 下随机初始化的注意力几乎就是平的。这正是作者为什么不得不上第二刀去锐化——不锐化,那几条桥根本画不出来。也就是说,从模型被缩小那刻起,这个可视化跟“真实模型行为”已经隔了两层:一层尺度失真,一层为了弥补尺度失真而引入的人为后处理。观众隔着两层玻璃,看到的是一个信心满满的箭头。

我可能说得重了。但“为了好看改数据”这个念头真让我不舒服。它会传染。今天你觉得教育 demo 改一改 logits 无伤大雅;下个月写线上 A/B 报表,为了让曲线更符合会上的叙事,把异常点标成“数据中心抖动”;再过一年你发现监控面板的 P99 被调过了,因为“领导喜欢稳定曲线”。滑坡不必然发生,可哪次滑坡不是从“就改一点点”开始的?

PGSimCity 是这个项目明说的灵感来源。巧了,那个项目走的策略正好相反:它画的是 PostgreSQL 真实查询计划里的真实行为,hash join 就是 hash join,seq scan 就是 seq scan,不需要给 b-tree 加人工锐化,不需要把统计值换成另一个模型再告诉你“这就是 postgres”。真实系统的机制本身撑得住。TokenTown 撑不住,原因也简单——它要展示的那个随机小模型,本来就没有机制可看。要好看只能造假;不造假就是一片糊。

那这东西还有没有价值?有。但它的价值是第二遍,不是第一遍。我的顺序排这样:

  1. 先把 Transformer 那八步在白板上推一遍,从输入 embedding 到最终采样,每一步输入输出形状写清楚。
  2. 挑个极小实现,不用 GPU 的那种,把 QKV 乘出来,手写一遍 softmax(注意别让它溢出),把残差和 layer norm 调通,看着 loss 掉下去。
  3. 再回来打开 TokenTown,把每个街区指认到公式里那一步,再看哪里被处理过、哪里是作者替你演的。

顺序反了,你就不是在学机制,你在看纪录片。看完记得一堆街区名字,真让你推一遍注意力矩阵,还是不会。

我的态度很明确:TokenTown 是个手艺活不错的项目,但它展示的不是 Transformer 正在做的,是一部被剪辑过的 Transformer 纪录片。你可以看它,但别把它当第一课。第一课永远是打开一个 notebook,把 QKV 乘出来,手写一遍 softmax,把残差和 layer norm 调通,让 loss 真正掉下去。走完这段路,再回来看城市,你才配说“我看懂了”。在这之前,坐在观光巴士上惊呼“原来如此”,和懂了之间,隔着一整片你还不肯下去踩的沙地。看完 TokenTown 就觉得自己入了 Transformer 的门,是给一片没铺混凝土的地刷了层漆。雨一下,全露馅。

老铁
老铁

把每个技术现象拆到原理、再上升到工程价值观,崇尚基础功、反浮躁。

查看主页 →