资讯详情

Transformer完全拆解:从注意力机制到大模型基石

📅 2026/9/16 23:40:28 | 华诺云谱 👁 阅读
Transformer完全拆解:从注意力机制到大模型基石
2017年谷歌机器翻译团队发表了一篇标题相当“霸气”的论文——《Attention Is All You Need》。当时NLP圈的主流还是LSTM、GRU这类循环神经网络结果这篇论文直接放话RNN和CNN都不用了只用注意力机制就足够了。七年多过去回头看这句话不仅兑现了还彻底重塑了整个深度学习版图。你现在用到的任何一个大模型底层骨干基本都能追溯到这篇文章。今天我想带大家把这篇文章重新读一遍但不是逐句翻译论文而是把重点放在“它为什么这样设计”上面。Transformer的总体架构到底是什么每个模块解决什么问题哪些细节最容易被忽略但又至关重要在拆解完这些之后我还会结合Transformer在机器翻译、预训练语言模型、计算机视觉里的演进聊聊这个架构的生命力体现在哪里。无论你是刚入门准备手写第一个Transformer还是想系统梳理一遍底层原理这篇文章都能给你一个相对完整的参考框架。1. 论文在挑战什么RNN/LSTM时代的痛点在进入架构细节之前得先理解当时的位置。如果不清楚Transformer要“革”的是谁的命很多设计选择你会看不懂。1.1 循环神经网络的天花板串行计算与长距离遗忘在Transformer出现之前序列建模的主流方案是RNN系家族。LSTM和GRU通过门控机制缓解了梯度消失问题在机器翻译、文本分类等任务上取得了很不错的效果。但这类模型有两个“天生”的麻烦躲不掉。第一是串行计算。RNN必须在时间步上一步步往后推处理第t个词之前必须先把第t-1个词的隐状态算出来。这种顺序依赖直接导致它很难大规模并行训练序列越长训练时间越长。当时训练一个像样的神经机器翻译模型动辄几天甚至几周是家常便饭。第二是长距离依赖问题。虽然后来LSTM的遗忘门能“记住”信息但距离太远的关键信息仍然容易在逐步传递中被稀释。比如“我在北京长大后来去上海工作所以我非常喜欢北京的饮食”最后那个“北京”要和最开头的“北京”建立关联中间隔了十几个单词。对RNN而言这条路要经过十几个时间步的隐状态传播信息早已“失真”。1.2 注意力机制的最初角色翻译时的“临时查资料”其实注意力机制在Transformer之前已经存在。2014年Bahdanau等人把注意力引入神经机器翻译基本思路是解码器在生成每个目标语言单词时不要只盯着编码器的最后一个隐状态而是对所有源语言位置的隐状态做加权求和权重由当前解码状态和每个源位置的相关性决定。这个机制在当时的理解很通俗翻译某个目标词的时候模型会“回头看一眼”源句里哪些词更重要。比如翻译“苹果”这个词时注意力权重会主要落在源句中对应的“apple”上。但注意在那个时候注意力只是RNN的“补丁”。主干依然是循环网络注意力只负责在解码阶段做信息检索。没人敢说把循环网络整个扔掉。《Attention Is All You Need》的贡献恰恰在于一个极具魄力的主张不用RNN、不用CNN把注意力机制直接作为整个模型的主干。换句话说注意力不只负责“查资料”连“读资料”“写报告”全包了。论文后面的实验证明这一拍脑袋式的激进想法竟然在翻译效果和训练速度上双杀当时的强基线模型。2. 总体架构拆解Transformer由哪些模块组成2.1 Encoder-Decoder整体骨架与数据流向Transformer是一个标准的Encoder-Decoder架构整个网络由编码器Encoder和解码器Decoder两部分组成。编码器负责把输入序列“理解”成一组上下文表示解码器负责根据这些表示逐个生成输出序列。论文里的配置是Encoder和Decoder各6层N6所有层都用相同的结构但参数各自独立。如果只看整体数据流一次前向传播大概是这样输入句子中的每个词先映射为词向量Embedding维度d_model512。在词向量上叠加位置编码Positional Encoding给模型注入词的顺序信息。向量序列进入Encoder经过6层编码块每层都是“多头自注意力 前馈网络”的组合并且在每个子层外都有残差连接和层归一化。Encoder的输出作为Decoder的“记忆库”Decoder在每层里通过“交叉注意力”不断从这个记忆库中提取信息。Decoder在生成第i个位置时会屏蔽掉第i个位置之后的词保证自回归特性也就是只能看到已经生成的词。最后通过一个线性层Softmax输出下一个词的概率分布。整个过程中核心信息交换机制只有一个注意力机制。这也是“Attention Is All You Need”这个名字的由来。2.2 编码器层与解码器层的差异对比Encoder的每一层有两个子层Multi-Head Self-Attention多头自注意力Position-Wise Feed-Forward Network逐位置前馈网络每个子层后面都接一个残差连接和LayerNorm论文中用公式表示为LayerNorm(x Sublayer(x))Decoder的每一层则多了一个子层共三个Masked Multi-Head Self-Attention带掩码的多头自注意力Multi-Head Cross-Attention交叉注意力也叫Encoder-Decoder AttentionPosition-Wise Feed-Forward Network多头自注意力里的“自”字意味着Q、K、V都来自同一个输入序列模型在输入序列内部建立位置之间的关联。交叉注意力不一样它的Q来自Decoder上一层的输出而K、V来自Encoder的输出这样解码器就能“读取”编码器对源句的完整理解。我刚开始读论文时容易犯的一个错误是把这两个注意力混淆。其实记住一句话就行Self-Attention负责“内部交流”Cross-Attention负责“外部吸收”。2.3 超参数与数据形状变化论文中Base模型的核心超参数如下表所示层数 N6隐藏维度 d_model512多头注意力头数 h8每头维度 d_k d_v64前馈网络中间层维度 d_ff2048总参数量约6500万Dropout0.1Label Smoothing0.1为了真正理解Transformer我建议你把数据张量在每个模块前后的形状变化写一遍。假设输入一个批次形状为(batch_size, seq_len)经过Embedding后变成(batch_size, seq_len, 512)加上位置编码形状不变进入多头自注意力Q/K/V分别由输入乘上权重矩阵得到形状都是(batch_size, seq_len, 512)然后拆成8个头变成(batch_size, 8, seq_len, 64)注意力计算结束后拼回去又变回(batch_size, seq_len, 512)经过残差LayerNorm形状不变进入前馈网络先放大到(batch_size, seq_len, 2048)再缩回(batch_size, seq_len, 512)6层堆叠结束后输出仍然保持(batch_size, seq_len, 512)很多搞不清楚Transformer的人卡就卡在这注意力拆了又合维度却没变。本质上Transformer的每一层都是在保持序列长度和特征维度不变的情况下不断对特征表示做精炼。3. 核心机制拆解注意力为什么撑得起整个架构3.1 缩放点积注意力Q、K、V到底在做什么注意力机制的核心是缩放点积注意力Scaled Dot-Product Attention公式如下Attention(Q, K, V) softmax(QK^T / √d_k) V这个公式初看有点抽象但拆开来说并不复杂。QQuery表示“我在找什么”KKey表示“我是什么”VValue表示“我有什么信息”。整个过程就是用Q去和每个K做点积得到相似度分数再用Softmax把这些分数变成权重最后用权重去加权求和所有V。生活化一点的类比是你在图书馆找一本讲机器学习的书。Q是你脑子里的书名关键词K是每本书封面上的标签V是书的内容。你先把关键词和所有书的标签比对一遍找到相关度最高的几本然后按照相关程度去翻阅这些书的内容提取关键信息。为什么点积可以衡量相似度两个向量方向越一致点积越大。这个直觉在线性代数里很清楚也是注意力计算里最常见的选择。那为什么要除以√d_k论文里明确说了当d_k比较大时QK^T的点积数值会变得很大把Softmax推进梯度极小的饱和区导致训练困难。除以√d_k是为了把点积结果的方差压回1左右。假设Q和K的每个分量都是均值为0、方差为1的独立随机变量那么点积的方差会等于d_k标准差为√d_k。除以√d_k后方差归一Softmax就能维持一个合理的梯度。这个小细节后来被无数工作沿用但你真去问一些调过模型的人未必能说出这层数学原因。这就是论文比博客和二手教程更值得读的地方。3.2 多头注意力让模型从多个角度“看”序列单个注意力头只能在一套语义空间里做匹配论文选择了多头注意力Multi-Head Attention来让模型同时关注不同信息子空间。实现方法是把d_model512的向量投影成h8组每组维度64分别做独立的注意力计算得到8个输出后再拼接回去最后经过一个线性投影。为什么不直接用一个更大的注意力头论文的消融实验给了一个很直观的答案多头效果显著优于单头。因为不同的头捕捉的是不同类型的依赖关系。有的头关注句法关系代词指向哪个名词有的头关注相邻词的局部关系有的头关注长距离的核心信息。让8个头并行相当于请了8个专家从不同角度审查同一份材料最后汇总意见自然比一个专家拍板更全面。一个常见的误解是多头注意力是不是把参数量增加了几倍其实不会因为每个头的维度变成了原来的1/h总的计算量和单头大注意力基本一致。把512维拆成8个64维算完再拼回来矩阵运算总量没有膨胀。3.3 位置编码让没有顺序观念的注意力“知道”顺序注意力机制本身是无序的。你把一句话里的词随便打乱顺序注意力的计算结果不会改变因为加权求和只需要QK匹配分数不包含位置信息。这当然不行语言是强顺序依赖的。论文采用了一种正弦位置编码方案PE(pos, 2i) sin(pos / 10000^(2i/d_model)) PE(pos, 2i1) cos(pos / 10000^(2i/d_model))其中pos是词的位置索引i是维度索引。不同的维度对应不同的正弦波频率。这样设计的一个精妙之处在于对于任意固定的偏移kPE(posk)都可以表示为PE(pos)的线性函数。也就是说模型很容易通过线性变换学到相对位置关系。论文实验证明可学习的位置编码和正弦位置编码效果几乎没有差别所以最终选择了正弦方案因为它不需要额外训练参数而且理论上可以外推到训练时没有见过的序列长度。后来业界演化出了很多替代方案比如GPT用的可学习位置编码、现在大模型广泛使用的RoPE旋转位置编码、还有ALiBi这类加偏置的方案。但核心思想都是一样的位置信息必须显式注入模型只是注入方式各有侧重。3.4 两种掩码机制Transformer里有两处用到了Mask容易混淆。第一处是Padding Mask。因为训练通常是按batch做的一个batch内的句子长短不一短句需要填充到和最长句一样的长度。填充的部分没有实际语义注意力计算时要屏蔽掉否则模型会把无效位置的信息也加权进来。实现方式很简单在填充位置的注意力分数上加一个极大的负数Softmax之后权重就趋近于0。第二处是Look-Ahead Mask只用在Decoder的Self-Attention里。解码器是自回归生成的预测第i个词时只能看到第1到第i-1个词不能提前看到后面的词。实现时构造一个上三角矩阵将上三角部分全部置为负无穷比如-1e9这样每个位置在计算注意力时只能“看”到自己左侧的信息。这个掩码机制是序列生成任务能不能正确训练的关键。很多人手写Transformer出bug最后发现都是Mask加错了位置或者形状对不上。4. 容易被忽略的工程细节残差、归一化与前馈网络4.1 残差连接配套LayerNorm的奥秘Transformer每个子层都在做同一件事先算子层结果然后做残差连接最后做层归一化。这个“先残差后归一化”的顺序后来被称为Post-LN。残差连接解决的是深层网络训练中的梯度消失问题梯度可以直接从上层“抄近路”传回下层不用每次都穿透整个子层结构。这让模型可以堆到几十层、上百层而不至于训练崩溃。LayerNorm和BatchNorm的区别值得多说一句。BatchNorm是在Batch维度上做统计归一化但在NLP场景里有两个问题一是序列长度动态变化不同batch的统计量不稳定二是当batch size比较小时BatchNorm的均值方差估计会很抖。LayerNorm则是对单个token的特征维度做归一化不依赖batch大小且在训练和推理时行为一致所以更适配Transformer这种结构。后续很多工作发现Post-LN在深层模型上训练不稳定于是GPT系列采用了Pre-LN也就是把LayerNorm挪到子层之前x Sublayer(LayerNorm(x))。Pre-LN的训练更稳定但表示能力会有轻微损失。这个细节是工程师调模型时的宝贵经验论文本身没提但对理解后续架构演进很重要。4.2 前馈网络注意力只管“交流”FFN负责“思考”前馈网络FFN部分是Transformer里最容易被人忽略但其实很重要的模块。公式如下FFN(x) max(0, xW1 b1)W2 b2它在每个位置上独立做两次线性变换中间夹一个ReLU激活函数先扩大到2048维再缩回512维。注意力机制本身是“token之间”的信息交换属于线性加权表达能力有限。FFN是对每个位置的特征做非线性变换相当于每个词在被注意力“混合”之后再独立地“思考”一遍精炼自己的特征。在计算机视觉领域ViT论文里甚至发现FFN内部的隐藏层激活天然对应着图片里的某些模式类别说明FFN承担了相当一部分“记忆和抽象”的功能。至于为什么中间维度是2048而不是别的数论文用的是4倍经验值。后来的很多模型也会用4倍算是行业默认的“甜点值”。如果你压缩这个维度模型容量会明显下降但盲目扩大收益递减且训练成本剧增。4.3 训练技巧与优化器设置论文里写得清清楚楚论文的实验配置是国内很多二手教程不会细讲的但恰恰是“复现论文”的重点优化器采用Adamβ10.9β20.98ε1e-9。学习率采用动态调度先线性warmup再按步数倒数衰减。公式是lr d_model^(-0.5) · min(step^(-0.5), step · warmup_steps^(-1.5))其中warmup_steps4000。在训练初期学习率从0线性爬升防止模型一开始就跑飞warmup结束后按step的倒数衰减让模型慢慢收敛。正则化方面使用了Residual Dropoutp0.1对每个子层输出、以及Embedding和位置编码相加后的结果都做Dropout。还用了Label Smoothingε0.1。这个操作的直观效果是让模型不要对训练标签过于自信降低过拟合虽然会略微提高困惑度但能提升翻译质量和准确率。训练成本方面论文里给的数据是Base模型在8张P100 GPU上训练12小时大约跑了10万步。当时这个效率对机器翻译任务来说已经是质的飞跃放到现在的大模型训练上更不敢想象。5. 论文怎么证明自己实验效果与消融分析5.1 翻译任务上的降维打击Transformer在WMT 2014英德翻译任务上BLEU值达到28.4比之前最好的结果提升了2个BLEU以上英法翻译任务上BLEU达到41.8同时训练成本大幅降低。当时对比的基线包括各种使用了注意力机制的RNN模型。论文还专门列出了不同模型达到相同效果所需的训练成本Transformer在取得更高BLEU的同时训练时间还比当时最强的LSTM系统少了差不多一个数量级。这种“效果更好速度更快”的双重优势让学术界几乎没有拒绝它的理由。5.2 消融实验揭示了几个重要结论论文做了大量消融实验有几个结论对我理解架构非常有帮助去除多头注意力退化为单头BLEU下降明显验证了多头的必要性。把注意力头维度从64增大性能反而下降固定每个头维度为64是最佳选择。用可学习位置编码替换正弦位置编码效果差异很小说明关键不在于编码形式而在于位置信息是否被注入。增大注意力计算时的核大小或使用更复杂的非线性注意力并不能带来增益点积注意力这个最简单的选择反而是最稳的。消融实验的价值在于它告诉我们哪些设计是必需品哪些是锦上添花。即便到了今天当有人问我“Transformer能不能精简一点”我都会拿这些实验结果说事别乱砍头别乱换位置编码。5.3 注意力的可解释性可视化带来的惊喜论文里还放了几张注意力可视化图展示翻译时不同head的权重分布。比如有些head会在句法层面将动词和其主语对齐有些head会关注相邻词之间的局部依赖有些head则捕捉长距离的“核心词呼应”。这种可视化给了研究者极大的直观信心模型没有学疯它学到的关系确实和人对语言的理解方式有相当程度的重合。这也是后来大量“模型可解释性”工作的重要起点。6. Transformer架构的后世影响从NLP到CV再到千行百业6.1 预训练时代的分叉BERT走EncoderGPT走DecoderTransformer出现后NLP领域迅速分化出两条路线。BERT选择堆叠Transformer的Encoder通过完形填空式的预训练任务学习双向上下文表示。这种架构擅长“理解”在分类、阅读理解、命名实体识别等任务上表现极强。GPT则选择堆叠Decoder利用自回归的因果语言模型做预训练。这种架构擅长“生成”给定前面的词预测下一个词。后来的GPT系列不断验证了“大力出奇迹”的路径模型够大、数据够多Decoder-only就能涌现出惊人的通用能力。从2023年以来的大模型格局看Decoder-only路线成了绝对主流。原因有很多包括因果掩码和自回归生成天然适配规模化、训练目标统一、部署链路简洁等。但追根溯源底子都是Transformer这个架构。6.2 视觉Transformer把图像切成单词Transformer在NLP证明了自己之后很快被移植到计算机视觉领域。ViTVision Transformer做了一个非常“粗暴”的迁移把图像切成一堆固定大小的patch每个patch拉平成向量再加位置编码然后直接送进标准的Transformer Encoder。结果发现只要预训练数据足够大ViT在图像分类上能逼平甚至超越同规模的CNN。随后Swin Transformer进一步解决了一个实际问题ViT的全局自注意力复杂度随图像分辨率平方增长高分辨率图片根本跑不动。Swin通过“层次化结构 窗口局部注意力 跨窗口连接”把复杂度降回线性在检测、分割等密集预测任务上全面超过CNN基线。再往后像HGFormer这类工作开始尝试把超图学习与Transformer结合探索更高阶的视觉关系建模。Transformer从一个机器翻译模块变成了通用特征提取器几乎是“哪里有特征建模哪里就有Transformer”。6.3 手写Transformer是理解架构最快的路径如果你想彻底吃透这篇论文我最推荐的方式是动手写一遍Transformer。代码框架不复杂关键是把几个张量形状吃透。比如手写一个单层Encoder的Self-Attention流程大概是输入形状(batch, seq_len, d_model)生成Q、K、V形状均为(batch, seq_len, d_model)拆分多头变形为(batch, heads, seq_len, d_k)计算注意力分数(batch, heads, seq_len, seq_len)除以√d_k应用Mask若有把需要屏蔽的位置替换为负无穷Softmax归一化乘上V得到(batch, heads, seq_len, d_k)合并头投影回d_model这个流程跑一遍你会对Transformer的每个细节都有肌肉记忆。反正我当初写完之后再读其他模型源码就轻松了很多。另外一个容易被忽略的实操点如果训练时模型不收敛或者NaN首要排查顺序是学习率是否过大、Mask形状是否正确、LayerNorm是Pre还是Post、残差连接是否加在归一化之前。这些坑我基本都踩过一遍。6.4 读论文的正确姿势三遍法以我反复阅读这篇论文的经验建议采用三遍读法。第一遍先看图。把论文里的架构图、表格看一遍只建立整体印象不纠结公式。第二遍抠公式。逐行推导注意力公式、位置编码公式、学习率公式把每个符号的含义和维度都搞清楚。第三遍看实验设计。理解消融实验到底在证明什么训练超参数为什么这样设置这样才能从“懂原理”进阶到“能复现”。读论文最大的收益从来不是记住架构图而是理解作者在每个设计点上的取舍逻辑。这些逻辑才是可以迁移到你自己工作中的真正财富。最后再分享一个我个人的小习惯我会把论文里精华的几段原文打印出来贴在工位上。隔一段时间再回头翻一眼每次都能看出一点点新东西。好的论文就像好的工具价值不会被时间稀释只会随着你的经验积累被挖掘得更深。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。