不用数学公式讲清楚 Transformer 架构
Transformer 通常被画成一整面墙的方程式。把那些剥掉,剩下的只是一个优雅的想法:让每个词自己决定哪些词对它最重要。
Transformer 是几乎所有现代语言模型底层的架构,而它通常的登场方式,是一张布满矩阵、softmax 和希腊字母的图。这种呈现方式掩盖了它核心想法其实有多简单。你完全可以理解 Transformer 在做什么、为什么它如此奏效,而不必写下任何一个方程式。数学是它的实现方式,而想法才是真正重要的东西。
用一句话概括这个想法:Transformer 一次性处理整个序列,并让序列中的每一个位置都能去看其他所有位置,从而决定自己的含义。 其余的一切,都只是为这个核心服务的细节。
Transformer 是为了解决什么问题而生的
在 Transformer 出现之前,处理文本的主流方式是一次读一个词,从左到右,一路携带一份不断更新的摘要往前走。这种方式行得通,但它有两个顽固的弱点。
第一个是距离。如果一个词的含义取决于二十个词之前的某样东西,那这条信息就必须熬过整段旅程,在不断更新的摘要中被携带下去,每走一步都被稀释一点。远距离的关联非常脆弱。
第二个是速度。严格按顺序阅读,意味着在你读完第九个词之前没法开始读第十个词。这种计算是一条链条,而链条无法并行。训练因此很慢,因为硬件总是在等待它自己上一步的结果。
Transformer 彻底抛弃了这条链条。它不再按顺序阅读,而是把整句话同时摊在桌面上,让每个词直接去咨询其他所有词。距离不再要紧,工作也可以同时分摊到许多处理器上。
让它奏效的那一个动作
核心操作叫做注意力(attention),而它的直觉再日常不过。当你在一句话里读到"它"这个词时,你的大脑会瞬间回头瞥一眼相关的前文、忽略不相关的部分,从而搞清楚"它"指代什么。注意力就是这一瞥的机械化版本。
对每一个词,Transformer 都会问:在这里所有其他词当中,为了理解我自己,我该关注哪些?然后它把那些词的信息混合进来,按各自的相关程度加权。一个词在句子里不是孤立地被理解的——它是作为"自己"与"它所选择关注的词"的混合体被理解的。
关键在于,每个词都在同一时刻这样做,而且每个词都自行决定该看什么。"bank"这个词在一句话里可以关注"river"(河),在另一句里关注"money"(钱),于是在两句话里分别意味着不同的东西。这种在一次扫描中算出的上下文敏感性,正是整个架构的引擎。
把这个想法叠成层
一轮注意力让每个词从邻居那里收集到上下文。但一轮是浅的。Transformer 把这个动作在**层(layer)**中重复,一层叠一层。
经过第一层后,每个词的表示都已经被它所关注的词丰富过了。第二层接着再跑一次注意力——但这次是在这些已被丰富的表示之上,于是词可以去关注那些本身就已经包含上下文的上下文。含义是分阶段建立起来的:靠前的层往往捕捉局部的、表层的关系,靠后的层则把它们组合成更抽象的结构。把许多这样的层叠起来,正是大模型获得理解深度的原因。
在两步注意力之间,每个位置还会各自经过一个小的处理模块,对自己做一次变换。可以把注意力看成"词与词彼此交谈"的步骤,把这个模块看成"每个词私下里琢磨它刚听到了什么"的步骤。两者交替进行,一层接一层。
顺序为何仍然重要,以及它是如何被保留的
一次看遍所有词,有一个隐患:如果你把所有词同时丢到桌面上,你就丢失了它们的顺序。"狗咬人"和"人咬狗"包含同样的词,纯粹的注意力机制会把它们看成完全一样。
Transformer 解决这个问题的办法,是在注意力开始运行之前,就给每个词标注上它在序列中位置的信息。每个词到来时,既携带它的含义,也携带一个标记它所处位置的标签。这样,注意力在决定该关注什么时,就能把顺序考虑进去。模型既获得了一次看遍各处的自由,又没有丢掉"顺序承载含义"这个事实。
同时从多个角度去看
单次注意力会迫使每个词只敲定一种"哪些相关"的混合方式。但相关性有很多种风味。要理解一个词,你可能同时关心它的语法主语、它的语气,以及它所属的话题——而这些是不同的问题。
Transformer 并行地跑好几个注意力操作,每一个都可以自由地聚焦于一种不同的关系。一个也许在追踪某个动词归属于哪个名词;另一个也许在跟随一个话题贯穿整段。它们的结果被组合起来,于是每个词最终是被许多同时存在的视角共同告知的,而不是只有一个。这正是为什么这个架构能够捕捉真实语言那种分层、重叠的结构,而不是一个扁平、单一的"相关"概念。
为什么这个设计能扩展得这么好
Transformer 胜出,并不只是因为它更懂语言。它胜出,是因为它与我们用来训练模型的硬件出奇地契合。由于每个位置是并行处理而非链式处理的,Transformer 能充分利用那些专为"一次性执行海量运算"而造的处理器。
这种高效带来了一个深远的后果:它让在比以往大得多的模型上、用多得多的数据进行训练,变得切实可行。事实证明,这个架构会随着被造得更大、被喂入更多文本而持续进步,看不到明显的上限。一个部分出于工程便利而被选中的设计,最终成了整个大规模模型时代的基石——恰恰是因为它能吸收那些早期设计无法吸收的规模。
Transformer 自己并不会做的事
把界限讲清楚是有帮助的。Transformer 是一种架构——一种安排计算的方式。它本身什么都不知道。模型所"知道"的一切,都来自用数据对它的训练;Transformer 只是为这种学习提供了一个格外有效的形状。
它本身也不会推理、规划或验证。它产出的是一个序列的上下文感知表示,以及——在语言模型里——一个对接下来该出现什么的预测。在此之上涌现出的那些惊人能力,来自规模、数据与训练,而不是架构发明了逻辑。理解这一点能让期待保持诚实:Transformer 是舞台,不是演出本身。
总结
暂且忘掉那些方程式。Transformer 的精髓在于这样一种纪律:一次性处理整个序列,并让每个词自己决定哪些词对它重要。 注意力就是这个决定,层加深了它,位置标签保留了顺序,并行的注意力一次性捕捉多种关系。数学是它如何被造出来的,而想法是它为何奏效。正是这一个动作——直接的、全体对全体的、在一次扫描中算出的——让这个架构比此前的一切都更有能力,也更可扩展。
