☰
Transformer前传:从序列转导到注意力机制,一部NLP架构演进史
2026/11/3 11:54:39 网站建设 项目流程

很多人第一次接触Transformer,都是从2017年那篇《Attention Is All You Need》开始的。当时圈内一片哗然,感觉这个架构像是从石头缝里蹦出来的:不要循环,不要卷积,全靠注意力机制,一路碾压机器翻译的SOTA。但如果你真的把序列转导模型这几年的演进脉络捋一遍,就会发现Transformer根本没有那么"横空出世"。它更像是站在一堆前辈肩膀上,把过去几年里所有被验证过的思路做了一次激进的整合与简化。

这篇东西,我想认真聊聊Transformer出生之前的那段"前戏"。也就是从最早的序列转导想法,到RNN编码器-解码器称霸,再到注意力机制悄然登场,最后一步步逼出"纯注意力"架构的完整过程。适合刚入门NLP、被Transformer搞得一头雾水的新手,也适合那些已经会用Transformer但没时间回头看历史的人——很多看似玄学的设计决策,放在演进脉络里其实顺理成章。

1. 序列转导到底在解决什么问题——先搞清楚"转导"这两个字

1.1 从机器翻译说起:为什么叫"转导"而不是"翻译"

序列转导(Sequence Transduction)这个词,现在不少文章直接拿过来用,但很少有人解释它到底是什么意思。我第一次读《Attention Is All You Need》时,卡在最开头的"transduction"上,搜了半天才搞明白:它本质上就是把一个输入序列转换成另一个输出序列的任务,只是用了一个比"translation"更中性的学术词。

翻译是转导最经典的代表:输入是英文句子,输出是中文句子。除此之外,语音识别是把音频序列转成文本序列,文本摘要是把长文档转成短文本,命名实体识别是把句子转成标签序列,甚至对话系统也是把用户输入转成回复。这些任务统统可以归入"序列转导"的框架。

为什么强调"序列"?因为输入和输出都是有顺序的、长度可变的数据。这跟图像分类完全不同——图片可以缩放到固定尺寸,类别就那几个;但句子长短不一,词汇数量庞大,而且顺序一变意思就可能全变。"I love you"和"you love I"用的词一模一样,含义天差地别。所以序列转导模型的核心命题就是:如何在保持顺序信息的前提下,把任意长度的输入映射到任意长度的输出。

这个问题的难度,决定了后面所有架构演进的逻辑。你看到RNN、LSTM、注意力机制、Transformer,本质上都是在回答同一个问题:该怎么建模这种"变长到变长"的映射关系?

1.2 序列转导任务的通用范式:编码器-解码器框架

在序列转导这个问题上,学界很快形成了一个共识性的抽象框架:先用一个**编码器(Encoder)把输入序列读进来,压缩成一个稠密的表示;再用一个解码器(Decoder)**从这个表示出发,逐步生成输出序列。

为什么需要这个两步走?因为输入和输出之间往往不是简单的一一对应关系。比如中英翻译,英文“I"和中文"我"是对应的,但语序、语态、省略都不一样,你很难像查字典一样逐词替换。编码器的作用是把输入句子的整体语义抽取出来,解码器再依据这个语义逐词生成。这有点像你先读完一整段材料,在心里形成"大意",然后用自己的话把大意复述出来。

但编码器-解码器框架只是个骨架,真正决定模型好坏的是两个问题:信息怎么从编码器传递到解码器?解码器生成时能不能"回头"参考输入里的关键细节?第一个问题的答案,从"固定长度向量"一步步演变成了"注意力机制";第二个问题的答案,则直接催生了Transformer里的Cross-Attention。可以说,整个序列转导模型的演进史,就是一部"信息传递方式"的进化史。

1.3 为什么这个问题难:三座大山

站在2024年回看,序列转导模型的难点其实可以概括成三座大山:

  • 长度问题:输入越长,信息越容易在传递过程中丢失。RNN时代的做法是把整句话压缩成一个向量,句子一旦超过二三十个词,后面的信息基本就糊了。你想想,让你把一部电影讲给别人听,只准你说一句话,你只能挑最核心的信息,细节全丢。RNN干的其实就是这种事。

  • 顺序问题:序列信息是天然有先后次序的,但怎么把这个次序"喂"给模型,不同架构给出了完全不同的答案。RNN靠逐步迭代隐式地编码顺序,CNN靠卷积窗口的局部顺序,Transformer则干脆把位置信息做成显式的向量加进去。这三种方案各有代价,后面我会详细对比。

  • 对齐问题:输出序列的每个元素,到底应该"看"输入序列的哪一部分?英文的“he”对应中文的“他”,但"he"后面很远的地方可能才出现真正决定"他"指代谁的名词。模型需要具备"跨长距离找到对应关系"的能力,这在RNN时代是致命的痛点,也正是注意力机制要解决的核心问题。

这三座大山,构成了理解后续所有技术细节的坐标轴。你每看到一个模块,都可以问一句:它是在解决长度问题、顺序问题,还是对齐问题?这么一问,Transformer里很多看似绕圈子的设计就都好懂了。

2. RNN时代的荣光与天花板:编码器-解码器架构的奠基

2.1 从Seq2Seq到LSTM:2014年那个"复制粘贴"的里程碑

序列转导真正变成一个可以被训练的端到端问题,标志性事件是2014年Sutskever等人的工作《Sequence to Sequence Learning with Neural Networks》。这篇论文做的事情在今天看来简单得近乎朴素:用两个LSTM,一个把输入句子逐词读进去,把最后一个时刻的隐状态当作整个句子的"语义摘要";另一个从这个摘要出发,逐词生成输出。

这套架构在Google的机器翻译系统上线后效果惊人,从此"编码器-解码器"成了NLP领域的标配。但注意一个细节:编码器把整个句子压成了一个固定长度向量。这意味着无论输入是五个词还是五十个词,最后传给解码器的信息量是一样的。这就像你不管交多长的报告,上面只给你一页纸的摘要空间——信息必然会被压缩,压缩必然导致丢失。

LSTM相比传统RNN的改进,在于用门控机制部分解决了长距离依赖问题。输入门、遗忘门、输出门三个门控,让网络学会"记住什么、忘掉什么"。你可以把它想象成一个人带着笔记本:遇到重要信息记下来,发现信息过期了就划掉,要用的时候再翻开来看。这比早期RNN那种"凭脑子硬记"的隐状态要强得多——梯度可以沿着"记忆通道"传得更远,训练更稳定。

2.2 隐状态信息瓶颈:机器翻译里的"长句子崩塌"

我在2015年左右做机器翻译实验时,对RNN的"长度崩塌"体会特别深。句子在10个词以内,效果还行;一旦超过30个词,翻译质量肉眼可见地下降。原因就是前面说的固定长度向量瓶颈。

具体来说,解码器在第t步生成词时,能依赖的信息其实只有两部分:上一时刻生成的词,加上那个被压扁的"语境向量"。如果编码器没能把某个关键信息塞进这个向量,解码器就是巧妇难为无米之炊。更麻烦的是,句子越长,早期的信息越容易被后面的词"冲淡"——LSTM的遗忘门虽然能记住一些东西,但记忆容量终究有限。

后来有人做过一个很直观的分析:把编码器不同时刻的隐状态拿出来看,发现靠近句子末尾的隐状态主要编码了句子后部的信息,开头的信息早就被覆盖得差不多了。这说明RNN不是在"理解"整个句子,而是在"不断更新一个压缩笔记",笔记的容量就那么大,记了新内容就忘了旧内容。

2.3 RNN的串行死结:为什么训练慢到怀疑人生

除了信息瓶颈,RNN还有一个更致命的结构性缺陷:串行计算。t时刻的隐状态依赖t-1时刻的隐状态,这意味着你必须等前一个词处理完,才能处理下一个词。训练时,整个序列就是一个长长的依赖链,GPU再强也没用——你没办法把一个50步的循环拆成50个并行任务。

这个问题的严重性,用过RNN训练大规模语料的人都有体会。一个中等规模的英德翻译模型,在当年的GPU上要训一周甚至更久。而且随着序列变长,反向传播的路径也变长,梯度消失问题虽然被LSTM缓解了,但并没有根除。

当时学界对RNN的态度很矛盾:它确实是序列建模最自然的方案——毕竟语言本身就是串行产生的;但它又确实太慢了,慢到所有人都知道这条路走不远。于是大家开始琢磨两件事:能不能让计算并行起来?能不能让模型在生成时"回头查"输入的原始信息,而不是只依赖那个压缩过的向量?这两个问题,直接指向了注意力机制和CNN替代方案。

3. 注意力机制登场:打破信息瓶颈的那把钥匙

3.1 Bahdanau Attention:从"必须压缩"到"随时回头看"

2015年,Bahdanau等人的论文《Neural Machine Translation by Jointly Learning to Align and Translate》给序列转导模型带来了一次真正的范式转变。核心改动看起来很小:解码器生成每一步时,不再只看那个固定的语境向量,而是额外计算一个"注意力分布",决定当前这一步应该重点关注输入序列的哪几个位置。

具体做法是:把编码器所有时刻的隐状态都保留下来,而不是只取最后一个。解码器在生成第t个词时,拿自己当前的隐状态去和编码器的每一个隐状态做相似度计算,得到一个权重分布,再按权重加权求和,得到一个"动态语境向量"。这个向量就是解码器当前这一步骤专属的"参考摘要"。

这个机制的价值怎么强调都不为过。它把模型从"必须把所有信息塞进一个固定向量"的魔咒中解放了出来。解码器不再依赖一个模糊的整体记忆,而是可以像人查资料一样,每次生成前先快速扫一眼原文,找到最关键的那几个词,再决定怎么输出。对齐问题第一次有了优雅的解决方案——模型自己学会了在翻译"he"时去关注原文中对应的那个名词。

3.2 注意力权重的本质:软对齐(Soft Alignment)

Bahdanau Attention里最迷人的地方,是它学到的注意力权重可以直接可视化出来。你把权重矩阵画成热力图,能看到一幅清晰的"对齐图":源语言每个词对目标语言每个词的贡献程度。这在当时简直是打开了黑箱——你第一次能"看到"模型内部是如何建立两种语言之间对应关系的。

学术上管这个叫软对齐(Soft Alignment),区别于传统统计机器翻译里的"硬对齐"。硬对齐的意思是"源语言第3个词对应目标语言第5个词",是一个确定性的映射;而软对齐是"目标语言第5个词生成时,源语言第2、3、7个词分别贡献了0.2、0.6、0.2的注意力权重"。软的好处是它能表达模糊性和多样性:一个词可能同时对应多个源词,翻译时也可以灵活地分配关注度。

而且,这个对齐能力完全是从数据里学出来的,不需要任何标注。你扔进去百万句平行语料,模型自动就学会了"哪些词该对着哪些词看"。这种"自发涌现"的对齐能力,也给后来Transformer里的Self-Attention埋下了伏笔——既然注意力能从跨语言的对齐中学到东西,那它能不能从同一种语言的内部关系里也学到东西?

3.3 注意力到底改进了什么:训练视角的解读

从业内训练模型的角度看,注意力机制带来的改进可以归纳成三点。

第一,长句翻译质量大幅提升。因为解码器可以直连编码器的任意位置,信息传递路径从"绕一大圈经过隐状态"变成了"直接索引",长距离依赖的建模能力有了质的飞跃。当年我在实验中明显看到,加入注意力之后,30词以上的长句翻译BLEU值比纯RNN高出好几个点。

第二,梯度传播路径变短且直接。RNN里,第1个词的误差要经过50步才能传回编码器开头;有了注意力,解码器第t步直接和编码器所有位置相连,误差可以一步到位。这让模型的训练稳定性和收敛速度都有了显著改善。

第三,为并行化铺了路。注意力机制的本质是"加权求和"——矩阵乘法,而矩阵乘法是GPU最擅长、最容易并行的操作。它不涉及时序依赖,只要你提前把编码器所有隐状态算出来,后面的注意力计算就可以完全并行。当时大家还没意识到这个特性有多重要,直到两年后Transformer把它推向极致。

不过,Bahdanau Attention在当时只是RNN架构上的一个"插件"——解码器仍然是一个逐步循环的RNN,序列依赖依然存在。注意力解决了"信息从哪里来"的问题,但没解决"计算能不能并行"的问题。这也是整个"前戏"阶段最吊诡的地方:大家已经摸到了正确答案的门把手,但还没狠下心来把门推开。

4. 并行化的执念:从ConvS2S到Self-Attention的思想萌芽

4.1 为什么要走CNN这条路:被逼出来的并行方案

2017年前后,用卷积网络做序列建模逐渐成了热门方向。代表工作是Facebook的ConvS2S(Convolutional Sequence to Sequence Learning)和DeepMind的ByteNet。它们的基本思路是:用一维卷积替代RNN的循环迭代,卷积窗口同时覆盖多个位置,从而让计算天然并行。

用CNN处理序列有个明显优势:局部感受野内的信息可以一次性处理完,不需要像RNN那样一步步串。比如一个kernel size为3的卷积,一步就能看到三个相邻词,整个句子过一遍卷积层就是一次矩阵运算,GPU开心得不得了。训练速度比同规模的RNN快上数倍甚至一个数量级。

但CNN也有自己的麻烦。一是感受野有限:要捕捉长距离依赖,必须堆很多层卷积或者用膨胀卷积(dilated convolution),层数一多,调参和训练的复杂度就上来了。二是顺序信息不天然存在:卷积操作本身是"位置无关"的——它对每个窗口内的元素做同样的操作,不区分"第1个"还是"第10个",必须额外把位置信息编码进去才能让模型知道顺序。ConvS2S的做法是在词嵌入上叠加位置嵌入向量,这个思路后来被Transformer直接继承了。

4.2 Self-Attention的诞生:注意力从"翻译对齐"走向"内部关系建模"

在我看过的所有"前戏"文献里,最有趣的一个思想转折是:人们开始问,既然注意力机制能建模源语言和目标语言之间的对齐关系,那它能不能建模同一种语言内部的词与词之间的关系?

这个念头一旦出现,Self-Attention(自注意力)就呼之欲出了。所谓自注意力,就是序列里的每一个位置,都去和序列里所有其他位置计算注意力权重。它的本质是让序列自己跟自己对话:每个词在编码自己的时候,主动去看句子里的其他词,判断哪些词和自己是相关的、相关的程度如何。

举一个直观的例子。"小明把苹果放在桌子上,然后它掉到了地上",这里的"它"指代什么?既可能是苹果也可能是桌子。人能根据常识判断大概率是苹果,模型要建这样的能力,就需要在编码"它"的时候,把注意力分配到前面很远处的"苹果"上。Self-Attention恰好提供了这种"任意位置直达"的通道——不需要像RNN一样经过十几步隐状态传播,也不像CNN一样需要堆很多层才能扩大感受野。

你仔细品一下就会发现,Self-Attention的思想并不是Transformer首创的。它更像是从Bahdanau的"编码器-解码器注意力"里做了一次概念移植:把"跨语言的注意"变成"内部的注意"。只是当时还没有人把它当成"唯一主角"来用。大家更习惯的做法是:用CNN或者RNN做底层特征提取,再在顶层加一点点注意力辅助。直到2017年,有人拍桌子说:既然注意力这么能打,那我们干脆不要CNN、不要RNN,完全用注意力来搭建整个模型,行不行?

4.3 Positional Encoding:Transformer从CNN手里接过的接力棒

这里必须专门提一下位置编码。因为Transformer完全抛弃了循环和卷积结构,模型本身对"词的先后顺序"是没有任何感知的——你把"我喜欢你"换成"你喜欢我",输入到同一套Self-Attention计算里,每个词的表示完全一样。这等于把顺序信息彻底扔了,当然不行。

所以Transformer选择了ConvS2S已经验证过的方案:给每个位置生成一个向量,加到词嵌入上。位置向量的设计用了一组正弦余弦函数,让不同位置之间的相对关系在向量空间里能通过线性变换来表达。这个设计看起来很数学,其实动机很简单:用可以预计算的固定向量,给模型提供顺序信息,同时不破坏并行计算的特性。

这里有个细节值得回味:Transformer的位置编码用的是加法融合(add),而不是拼接(concat)。原因在于拼接会改变向量的维度,加大计算量,而且实验表明加法足够让模型区分不同位置。这说明Transformer的设计哲学从一开始就是"能省则省,能简则简",只保留真正必要的组件,把复杂度交给数据和算力去消化。

4.4 站在前人的肩膀上:2017年那个"集大成"的时刻

到这里,Transformer出生前的所有关键拼图其实已经集齐了:

  • 编码器-解码器框架 → 来自Sutskever 2014的Seq2Seq
  • 门控机制 → 来自LSTM/GRU
  • 注意力机制 → 来自Bahdanau 2015
  • 多头思想 → 本质上是用多组不同的投影去捕捉多种对齐关系,这在multi-concept attention等早期工作里有影子
  • 位置编码 → 来自ConvS2S / ByteNet
  • 并行计算 → 来自CNN序列建模的启发

所以当你在网上看到有人感叹"Transformer是天才的灵光一现"时,我其实不太认同。Vaswani和团队确实做了伟大的工作——他们敢砍掉RNN和CNN,把注意力推到极致;但每一个模块几乎都有前人验证过的影子。Transformer真正的贡献,是做了一个极简而统一的架构设计,证明了"注意力本身足以支撑序列转导的完整任务"。用一句话概括:它不是凭空出现的发明,而是对过去几年散落各处的思想做了一次精准的"合并同类项"。

5. 站在2024年回看:Transformer继承了什么,又颠覆了什么

5.1 一张表看清序列转导模型的演进脉络

这几代模型放在一起对比,你会发现演进逻辑异常清晰:

模型顺序建模方式信息传递方式并行度核心瓶颈
RNN / LSTM隐状态逐步迭代固定长度向量极低,串行长程信息丢失、训练慢
带注意力的RNN隐状态迭代动态加权求和低,编码器可并行,解码器串行解码器速度仍是瓶颈
ConvS2S卷积局部窗口层级堆叠扩大感受野高远距离依赖需多层卷积
Transformer位置编码 + Self-Attention任意位置直达加权极高计算复杂度平方级,长序列内存爆炸

这张表里最值得关注的是"信息传递方式"那一列。从"固定向量"到"动态加权求和",再到"任意位置直达加权",你会发现核心进展始终围绕同一个主题:让模型更容易地获取输入序列中的任意信息。RNN时代的信息是"压缩存储的",注意力时代的信息是"可按需检索的"——Transformer把"按需检索"做成了全序列无死角的就地直连。

5.2 Transformer对"前戏"做了哪些简化与激进决策

Transformer相比前代模型,做了几个在当时看来非常激进的简化决策,理解了这几个"激进",才有资格说真正理解了Transformer。

激进之一:彻底抛弃循环。在Transformer之前,"序列必须逐步处理"几乎是铁律。Transformer把这一点整个推翻,所有位置并行计算Self-Attention。后果是训练速度质的飞跃,也间接促成了后来大规模预训练模型的爆发。没有这个并行性,你很难想象几万亿参数的语言模型能在合理时间内训练出来。

激进之二:彻底抛弃卷积。卷积在传统观念里是"局部建模"的王牌,Transformer用Self-Attention直接建模全局关系,把局部性也交给注意力自己去学(后来的相对位置编码就是在弥补这一点)。事实证明注意力确实学得会"近处多关注、远处少关注"的模式,而且比卷积的死窗口灵活得多。

激进之三:多头注意力。Transformer之所以不用单个注意力而是拆成多个头,是为了让模型能同时关注多种不同类型的关系。单个注意力权重分布有一个倾向:如果某个位置关系特别强,它就几乎占据所有权重,模型会忽略其他次要但有用的关系。多个头意味着可以并行捕捉"语法依赖""指代关系""相邻词共现"等多种模式。这就像你同时雇佣好几个助理,让他们用不同的侧重点去读同一份报告,最后把大家的发现汇总——信息量自然比一个助理大。

激进之四:解码器的Masked Self-Attention。解码器生成时不能看到未来的词,因此用掩码把每个位置之后的注意力权重强制设为0。这个设计保证了自回归生成的合法性,也引出了后来大模型里那个著名的"因果注意力(Causal Attention)"概念。你现在看到GPT系列里那个上三角掩码矩阵,根源就在这里。

5.3 被"前戏"忽略的部分:训练稳定性和规模化的意外收获

还有一个很少被写进历史书的点值得提:Transformer的架构为什么特别适合大规模并行训练和超大规模参数量?除了并行计算,还有一个原因是它比RNN更容易做残差连接的堆叠。每层Self-Attention + FFN就是一个"函数",残差连接让信息可以无损地跨层流动,这使得几十层甚至上百层的Transformer在训练时仍然稳定。RNN那种循环结构你试试叠个三四层就够头疼了,信息在循环里打转,梯度在时间维度上爆炸或消失。

另一个"意外收获"是,Transformer的架构对于扩展模型宽度和深度都有很好的弹性。Self-Attention的计算只用矩阵乘法,增加隐藏层维度就是在增加矩阵尺寸,硬件利用率基本可以保持;RNN增加隐藏层维度效果则受限于串行依赖,GPU利用率上不去。这就是为什么LLM时代几乎清一色Transformer——不是因为它最聪明,而是因为它最能"堆"。

当然,Transformer不是没有代价。最明显的毛病是Self-Attention的计算复杂度是序列长度的平方,一旦输入超过几千个token,内存和时间都吃不消。这个痛点催生了后面一堆花活:稀疏注意力(Sparse Attention)、线性注意力(Linear Attention)、滑动窗口注意力(Sliding Window Attention)等等。但这些优化,本质上都是在Transformer这个"骨架"上做局部修补,架构的内核仍然是"序列全体成员互相对齐"。

6. 如果让我给新手一条学习路径:从"前戏"到"现在进行时"

文章写到这儿,我想给还在入门阶段的读者一条实操建议。很多人一上来就啃Transformer代码,囫囵吞枣地理解了Q、K、V三个矩阵,但没过多久又忘光了。我建议你按照历史演进的顺序去学,这样每个设计决定都有了"理由",记忆会深刻得多。

第一步,手写一个纯RNN的Seq2Seq模型,拿它跑一个简单的英法翻译或加法序列任务,感受一下固定长度向量的瓶颈和训练缓慢的痛苦。不需要跑大规模语料,小规模能看出"长句崩了"就行。

第二步,在它的解码器里加上Bahdanau Attention,对比一下长句的BLEU或准确率变化。你亲手实现一次注意力权重的可视化,那种"哇,模型居然自己学会了对齐"的体验,比读十篇论文都管用。

第三步,把RNN编码器换成CNN或者直接换成Self-Attention,逐步走上Transformer之路。你可以先写一个"只有Encoder"的Transformer做文本分类或情感分析,理解Self-Attention和位置编码的运作;再动手实现Decoder部分,体会Masked Self-Attention和Cross-Attention的区别。

第四步,真正完整实现一遍Transformer,用《Attention Is All You Need》里的默认参数(d_model=512, 6层, 8头)跑一个机器翻译任务。这时你会发现,之前所有"前戏"里的概念——编码器-解码器、注意力、位置编码、并行计算——全部汇聚到了一个统一的架构里。

我个人的体会是,先看历史再看代码的方式,比对着论文抄代码要多学到一层东西:你能分清楚哪些设计是"必须如此",哪些只是"当时觉得好用所以保留"。比如你会明白,为什么FFN在全连接层中间用ReLU,而Self-Attention里用Root Mean Square Norm或者LayerNorm——前者是为了引入非线性,后者是为了稳定梯度。而这些判断标准,都是在一次次实验对比中被验证出来的。

回头再看"transformmr 的前戏"这个标题,它其实点破了深度学习研究里一个恒常的规律:再惊艳的模型,也逃不过"站在前人肩膀上"这个宿命。Transformer确实是革命性的架构,但它的革命性来自"敢于砍掉旧组件"的魄力,而不是"凭空创造新理论"的天启。理解了前戏,你读懂的不只是Transformer,更是模型演进背后的那一套评判逻辑——什么瓶颈,什么方案,什么代价。这样的坐标系,会陪你走很远的路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询