现在的从业者容易忘记:Transformer 原典(Vaswani et al. 2017)是为机器翻译设计的,主体是 encoder-decoder,decoder 每层里那块对 encoder 输出做检索的 cross attention 是标准件。2018–2020 年这三年,架构争论的主线就是"双塔 + cross attention"与"单塔 decoder-only"孰优。结局已知,但输掉的逻辑值得复盘,因为交叉注意力本身并没有消失——它在扩散模型的条件注入、多模态对齐、RAG 里换了个身份继续服役。
cross attention 的机制定位
结构上没有神秘之处:decoder 第 $l$ 层在自注意力之后插入
$$ \mathrm{CrossAttn}(x_l) = \mathrm{softmax}\Big(\frac{x_l W^Q (H W^K)^\top}{\sqrt d}\Big)\, H W^V, $$
其中 $H$ 是 encoder 的最终输出,整个解码过程中 $HW^K, HW^V$ 算一遍缓存住,不再更新。和自注意力的本质差别只有两点:K/V 来自另一个序列(固定),Q 随生成步更新;掩码通常是全可见的(encoder 侧没有因果约束,双向上下文)。位置编码也因此分家:encoder 侧用双向位置方案,decoder 侧用因果方案。
这个结构对应一个强先验:输入文本要先被整体编码成一套与生成位置无关的表示 $H$,生成时逐 token 去 $H$ 里检索。翻译任务里这个先验是对的——源句的句法框架先于目标句的第一个词存在。但先验同时也是枷锁:$H$ 压缩了全部输入,容量 $n\times d$ 固定,长输入的信息瓶颈就压在这层 cross attention 的检索质量上。
单塔是怎么赢的
decoder-only 的崛起(GPT、然后 GPT-3)靠的是另一个维度的论证:架构的规模经济性。比参数效率,双塔结构在相同层数下要维护两套投影、两种位置编码、两份预训练语料的消化方式;比目标统一性,encoder-decoder 的天然预训练目标是 span corruption(BERT 式掩码、T5 式去噪),而 decoder-only 用平凡的 next-token prediction 就能吸收任意文本。T5 把 encoder-decoder 推到 11B、证明 denoising 目标 scaling 良好,是同一路线的巅峰——但 GPT-3 用同样的算力预算展示了 LM 目标 + 单塔在 in-context learning 上的涌现,争论就此失去悬念:不是双塔架构不能 scale,而是同样的钱投给单塔回报更高,且下游任务只需要把"输入 + 指令"拼进前缀就能复用同一个生成器,工程上零额外结构。
值得记一笔的中间证据是 UniLM(2019)和 prefix-LM:它们证明在单塔内用注意力掩码就能模拟 encoder 的双向可见性——"先整体编码输入"这个行为不需要独立的 encoder,把输入段掩码成双向、生成段掩码成因果即可。这等于在结构上宣判了 cross attention 的可替代性:它做的事(Q 检索固定 K/V)可以在自注意力里用掩码和位置编码拼出来。T5 后来版本、UL2 都吸收了 prefix 的设定。
cross attention 没有死,只是改了名字
decoder-only 统一 NLP 之后,cross attention 在三个方向复活,且每次都是"有一个外部表示要被反复检索"的场景:
- 多模态:LLaVA、Flamingo 式的视觉注入,视觉特征作为固定 K/V,文本 token 的 Q 去检索——机制和机器翻译的 cross attention 一字不差,只是 encoder 换成了 CLIP。
- 扩散模型条件:Stable Diffusion 的 UNet 里,文本嵌入经 cross attention 注入去噪过程,K/V 固定、Q 来自图像 latent 的当前噪声状态。
- 检索增强:RAG 把检索到的文档块拼进上下文是最常见的做法,但更省 context 的方案(每步只注入相关块)本质上是回到 cross attention 的"外部 K/V 库"形态。
复盘这场争论的教益:架构之争的胜负手往往不是机制的表达力(cross attention 能做的,精巧的单塔加掩码基本都能模拟),而是训练目标的通用性 × 工程栈的简单度 × 预训练数据的利用率三者的乘积。机制设计得再优雅,如果需要配套独立的目标函数和数据管线,就在规模竞争里先输一半。
小结
cross attention 与 encoder-decoder 的分歧本质是"先编码后检索"的双塔先验与"一切塞进前缀"的单塔通用性之争。胜负不在机制表达力——UniLM 证明了掩码可以模拟双向编码——而在规模经济:单塔 + LM 目标用一套结构吃掉了所有任务。理解这个结局的边界同样重要:一旦场景里出现"需要被反复检索的外部固定表示"(图像、文本条件、检索库),cross attention 的形式就会回来,因为那种检索结构的缓存性质(K/V 只算一次)是前缀拼接地摊模拟不出来的。