资讯动态

Transformer核心算法演进史:从自注意力到思维链的七年优化之路

发布时间:2026/10/26 14:19:36 来源:尧图企业网站定制
开头很重要我不打算从Transformer是什么讲起而是从一个让我印象很深的困惑开始为什么同样的模型架构放在不同场景、不同规模下表现差这么多症结往往不在网络结构本身而在那些看起来不起眼的算法细节。自注意力、位置编码、归一化方式、路由策略——这些Transformer架构中的核心算法过去七年的演进几乎是一部浓缩的深度学习调优史。这篇博文我想沿着这条线把每个关键算法设计从为什么这样设计讲到后来怎么被替代、被优化既有原理拆解也有我实际训练和推理时的体会希望能帮你建立一条完整的认知链路而不是停留在会调库的水平。1. 2017年的那张图从零拆解Transformer原始算法组件1.1 缩放点积注意力为什么分母必须除以根号dTransformer最核心的算法组件就是缩放点积注意力公式很简单Attention(Q, K, V) softmax(QK^T / √d_k) V三个矩阵分别来自输入经过线性投影后的查询、键和值。Q和K做点积得到的是两两token之间的相似度分数再经过softmax变成权重最后加权求和V。很多人第一次看到这个公式会有个疑问为什么要除以√d_k而不是直接softmax(QK^T)这里面的逻辑其实很实在。假设Q和K的每个元素都是均值为0、方差为1的随机变量两个d维向量的点积结果方差会随着d的增长线性增大——大约等于d。维度越大点积的绝对值越大softmax输入进入饱和区梯度会变得非常小训练基本推不动。除以√d_k相当于把方差重新拉回到1附近让softmax的输入落在梯度合理的区间。我最初自己实现这个注意力的时候偷懒省掉了缩放项结果训练Loss怎么都降不下去。后来检查了半天才发现是这个问题。这个细节看起来不起眼但它是Transformer能稳定训练的第一个关键算法设计也是后来所有注意力变体都必须遵守的底线。还有一个容易忽略的点这里的点积是矩阵形式整批计算一次性完成。这跟RNN按时间步遍历完全不同是Transformer能做到大规模并行的根本原因。Transformer解决了长距离依赖的建模问题本质上是让任意两个位置之间的交互距离都变成1一步到位不需要像LSTM那样靠门控机制逐时间步传递信息。1.2 多头注意力与位置前馈网络分工与卡位多头注意力是Transformer的第二个核心设计。原始论文用了8个头每个头的维度是64总维度512。每个头在独立的子空间里做注意力理解不同维度的关系——有的头关注语法结构有的头关注指代关系有的头关注局部语义。这种分工效应在可视化注意力权重的时候特别明显。但这里有个实践中的坑多头数量并不是越多越好。我做过消融实验把头数从8加到16、32小规模任务上效果基本持平甚至有些任务还会掉点。因为每个头的维度会随之变小单个头的表达能力被削弱。论文里其实也提到了头数和每头维度之间有个权衡但大多数人只记住了多头效果好这个结论。正确做法是保持总维度不变的前提下调整头数找到适合你任务的甜点。再说说位置前馈网络FFN。它做两件事先拓宽再压缩维度从512升到20484倍经过ReLU激活后再降回512。这个结构保证了每个token在注意力交换完信息之后还有足够的参数空间做非线性变换和特征重组。有人会问既然注意力已经能捕捉全局关系了为什么还需要每个位置独立的FFN我可以给个粗糙的比喻注意力像开会每个人都在交换信息FFN像散会之后各自消化笔记、形成自己的结论。没有FFNTransformer的表达能力会明显受限。Statista有个很著名的消融实验显示去掉FFN层之后模型性能下降幅度比去掉注意力层还大——至少在某些任务上是这样。这个点我一直觉得值得记住注意力负责信息流动FFN负责信息加工两者缺一不可。1.3 Encoder-Decoder三类注意力的分工与遮罩设计原始Transformer是标准的Encoder-Decoder架构里面其实有3种注意力Encoder的Self-Attention每个token都能看到整句话的上下文双向交互。Decoder的Masked Self-Attention每个token只能看到自己和前面的token这就是因果遮罩causal mask。Cross-AttentionDecoder的每个位置去attend Encoder的输出把源语言的信息引入到目标语言生成过程中。因果遮罩这个设计值得单独说。为什么Decoder必须遮住未来信息因为生成是自回归的——t时刻的预测只能依赖t之前的输出否则就是信息泄漏模型等于提前看到了答案。实现方式很简单生成一个上三角为负无穷的mask矩阵加到注意力分数上softmax之后这些位置的权重趋近于0。后来的架构演进中GPT系列拿掉了Encoder和Cross-Attention只保留Decoder的Masked Self-AttentionBERT则只用Encoder。这三条路线各有代价和优势后面我会专门展开讲。2. 自注意力复杂度困境与注意力机制的算法演进之路2.1 复杂度是怎么成为瓶颈的自注意力有个逃不掉的问题时间复杂度O(n²)空间复杂度也是O(n²)。n是序列长度。每个token都要和所有其他token算相似度这个全连接的特性是性能根源也是灾难根源。原始论文的序列长度只有512O(n²)不算什么。但当你想处理长文档、长对话、长视频序列时问题就暴露了。序列长度从512翻到2048计算量变成原来的16倍。这正是后来所有注意力优化方向要干掉的目标。我当时跑过一个8k context的模型单看注意力矩阵占用的显存就能把一张A100撑爆。后来才知道这种场景下必须换注意力实现方式不能死磕原始的多头注意力。围绕这个瓶颈业界形成了几个主流方向的演进稀疏化、线性化、IO感知、推理侧KV缓存压缩。2.2 稀疏化与线性化两种省钱思路第一种思路是打破注意力机制的全连接前提只让部分token pair交互。代表性工作是Longformer的滑窗注意力——每个token只attend窗口内的token再加少量全局token兜底。序列被切分成局部块复杂度降为O(n×w)w是窗口大小。代价是长距离依赖的建模精度有损失毕竟相隔很远的两个token如果不在同一窗口就只能靠global token中转。第二种思路是线性注意力代表工作是Performer和Linear Transformer。核心技巧是利用核函数把QK^T的运算顺序调整一下原本是(QK^T)V矩阵乘法的结合律可以变成Q(K^T V)。这样高位矩阵乘法的计算复杂度被改变不再直接依赖序列长度的平方。Performer用随机特征映射来近似softmax核理论上很漂亮但实际应用中数值稳定性问题比较多在训练大模型时并没有成为主流。这两种思路的演进说明了一个规律想省复杂度要么牺牲建模精度要么牺牲数值稳定性。后来大家发现与其从数学上硬改不如从硬件执行层面想办法——FlashAttention就是这条路线。2.3 FlashAttention不改变算法改变执行方式FlashAttention的思路我觉得很有意思它不修改注意力的数学定义而是改掉计算顺序和显存访问模式。标准注意力实现有个很大的浪费把N×N的注意力分数矩阵写进显存再读出来做softmax然后去加权V。中间这个矩阵在长序列下极其大而且完全没必要落盘。FlashAttention的做法是分块tiling计算把Q、K、V切成小块一个个块地算注意力用online softmax的方式在块与块之间做rescaling全程不物化完整的注意力矩阵。这样IO复杂度从O(n²)降到了O(n)实际训练和推理里提速非常可观。我当时在8k序列上对比过占用显存降低约8倍左右训练速度也有明显提升。它还带一个副产品反向传播时不需要存储注意力权重可以用重计算recompute方式从输入和输出重新推导省掉了一大块显存开销。FlashAttention说明了一个重要规律算法演进不一定要改变数学公式有时候改变计算图结构和硬件适配方式也能带来质的飞跃。2.4 推理侧的注意力演化MQA与GQA训练解决了推理侧又有新问题。自回归模型每生成一个token都要把之前所有token的K和V缓存下来做注意力计算这个缓存叫KV Cache。序列越长KV Cache越大内存带宽就成了瓶颈。多查询注意力MQA的做法是让所有头共享同一组K和V只保留多头Q。这样KV Cache大小缩到原来的1/h内存占用大幅下降。但代价是效果有损失因为不同头失去了独立的K、V表示空间。分组查询注意力GQA是折中方案把查询头分成若干组每组内部共享一组K/V。比如Llama 2的70B版本就是8个KV heads配32个查询头。GQA在推理效率和效果之间找到了平衡点。我实际测试下来GQA比MQA的生成质量稳定很多KV Cache又比完整多头小很多。我想强调一点这些注意力变体不是替代关系而是针对不同场景做取舍。文本分类任务不需要自回归KV Cache问题不存在FlashAttention的收益也有限而长文本生成场景GQA基本成了标配。3. 位置编码的演进之路从谜语级设计到旋转位置编码3.1 为什么自注意力天生失忆置换不变性这个缺陷自注意力机制对输入顺序不敏感——把序列任意打乱注意力权重矩阵不变。这对语言模型来说是个硬伤因为词序在语言里是核心信息。猫咬人和人咬猫如果编码完全相同模型学到的都是同一个东西。所以Transformer必须额外注入位置信息。原始论文的做法是正弦余弦函数不同维度使用不同频率的震荡函数位置p的第i维编码是sin(p/10000^(2i/d))或cos。选择正弦余弦而不是可学习参数论文给的理由是可以让模型外推到更长的序列——这个理由目前看没有完全兑现但它确实开启了位置编码这个研究分支。接下来的演进我给它分四个阶段绝对位置、相对位置、旋转位置、线性偏置。一个比一个贴近位置信息到底应该怎么用的本质。3.2 从绝对位置到相对位置分别解决了什么问题绝对位置编码把位置作为绝对编号塞进token表示。BERT和GPT-2用了可学习的绝对位置编码——训练时学出一个位置embedding表。问题很明显训练时见过的最长长度就是上限超过它就只能粗暴截断。位置是死的模型很难从中学到偏移的泛化规律。相对位置编码的思路更合理模型关注的不是你在第几号位置绝对距离而是你相对我偏移了多少相对距离。T5的做法是在注意力分数上加上一个可学习的偏置这个偏置由两个位置之间的距离决定。因为语言中两个词隔了几个位置远比这个位置是第几个更有语义意义所以效果更好。在行业社区里有句玩笑话叫位置编码唤醒语言模型一点不夸张。相对位置编码是让Transformer真正理解语言顺序的关键一步也是后续所有长上下文模型绕不开的基础。3.3 RoPE旋转位置编码为什么它成了大模型标配旋转位置编码Rotary Position EmbeddingRoPE是目前大模型中最主流的位置编码方案Llama、Mistral、DeepSeek、Qwen都在用它。它是2021年苏剑林在博客和论文里提出的核心思路是把位置信息编码成向量的旋转角度而不是加到向量上。具体做法很优雅对于位置m和mn的两个token把它们的查询向量q和键向量k分别对应位置m和mn做旋转然后计算内积。因为旋转操作有个性质——q在位置m旋转k在位置mn旋转它们的点积会得到一个只和相对位置差n相关的形式。换句话说模型天然学到的是相对距离而不是绝对位置。实现上RoPE把向量按维度两两分组每组做一次二维旋转。它在推理性能上有优势外推能力好不需要训练额外的位置embedding表还能天然支持与FlashAttention并行计算——很多推理引擎的attention kernel都是针对RoPE做了fuse优化的。我实测RoPE确实比绝对位置编码好调很多。早年用可学习位置编码时超过训练长度直接崩溃几乎没法用切到RoPE后配合微软的NTK或者YaRN位置插值模型能顺滑外推到几倍长度的上下文。这在长上下文场景里几乎成了救命稻草也是它为什么被这么多主流模型选中的原因。3.4 ALiBi与其他候选方案的实际取舍除了RoPE还有几个值得一提的演进方向。ALiBiAttention with Linear Biases完全不学习位置编码而是直接在注意力分数上减去一个与距离成正比的线性偏置。偏置越大越远的token被惩罚得越狠模型被强制聚焦近邻。它的好处是极简、外推能力强训练时长度2048推理时能直接用8192。但惩罚过强的话长距离信息会被过度压制不适合所有任务。还有基于卷积架构建模位置的方案、连续位置编码方案等但都没达到能与RoPE媲美的生态地位。现在的主流共识是RoPE在长上下文外推和实现复杂度之间找到了最好的平衡点。4. 藏在训练稳定背后的归一化算法迭代4.1 Post-LN之痛为什么原始Transformer训练那么脆原始Transformer的LayerNorm放在残差连接之后即Norm(x Sublayer(x))学术上叫Post-LN。这个设计理论上最大的好处是让残差流的信号在进入下一层之前不被扰乱。但实践里有个大坑梯度信号经过深层堆叠之后幅度容易失控深度模型经常出现训练崩溃、Loss突然飙到NaN。我当时在自己的模型里尝试加深到12层以上结果频繁出现训练发散。搜索资料发现Post-LN的深层模型对学习率和初始化极其敏感需要加pre-norm和极小的learning rate才能勉强稳住。这也是Transformer论文发布初期很多人复现不了的原因之一。4.2 Pre-LN与RMSNorm简单改动换来质的提升Pre-LN把LayerNorm挪到残差之前即x Sublayer(Norm(x))。看起来只是顺序互换但梯度经由恒等路径直接回传不再穿过LayerNorm深度模型的梯度方差问题大幅缓解。这也是为什么后来GPT系列、BERT的深层变体几乎都用Pre-LN。Pre-LN并非没有代价——理论上有研究表明它会稍微降低模型的表达能力但在实用层面稳定性带来的收益远大于损失。RMSNorm是另一个重要的归一化演进。LayerNorm要求计算均值再减掉计算均值那一步在张量运算里其实很浪费。RMSNorm去掉mean-centering的步骤只保留缩放的RMS均方根部分。计算量省了约30%效果基本持平在大规模训练里这个节省非常可观。LLaMA系列就用RMSNorm替换了LayerNorm是目前开源大模型的默认选择。4.3 深层Transformer的另类稳定性手段除了Pre-LN和RMSNorm业界还有一批其他稳定化方案让Transformer走得更深。DeepNorm在残差连接里引入一个特殊的缩放系数让残差的方差在深层传播中不放大也不缩小从而支撑1000层左右的训练。还有Sandwich Norm、ScaleNorm、QK-Norm等变体各有适配场景。这类演进往往被很多人忽略但它解释了为什么现在的模型从12层到几百层都能稳定训练——这不是结构创新带来的而是这些不显眼的归一化细节在托底。5. 架构形态的分化与融合Decoder-only称王与视觉Transformer的适配5.1 为什么最终是Decoder-only成了绝对主流原始Transformer是Encoder-Decoder而GPT系列走出了一条纯Decoder路线——只有masked self-attention没有encoder和cross-attention。为什么这条路径赢了首先语言生成的本质是自回归的Decoder-only天然把理解和生成统一到一个框架里所有的任务都可以表述为输入一段前缀输出一段后缀。其次Decoder-only的训练目标统一为next-token prediction实现简单、缩放曲线平滑而Encoder-Decoder的复杂度高在预训练时稳不住。第三思维链、指令跟随等涌现能力在Decoder-only的大规模模型上最明显。我印象很深的一个对比是T5是Encoder-Decoder的代表在很多下游任务上依然很强但论普适性和简单性Decoder-only确实更占优势。这也解释了为什么今天主流的大语言模型几乎都是Decoder-only只有少数翻译和特定任务还保留seq2seq形态。5.2 视觉Transformer的适配与改良从ViT到SwinTransformer跨出NLP的那一步是ViTVision Transformer做的。ViT把图像切成固定大小的patch比如16×16每个patch拉平后映射成一个embedding再当成视觉词序列丢进标准Transformer。这个适配的代价是完全抛弃了卷积的归纳偏置局部性、平移等变性所以ViT在小规模数据集上效果反而不如CNN必须在大规模预训练上才能发挥优势。Swin Transformer以及后续的PVT等在ViT基础上做了两个关键改进一是层级化结构把不同分辨率的特征图堆成金字塔方便迁移到检测、分割等密集预测任务二是窗口注意力window attention只在局部窗口内做自注意力把复杂度从O(n²)降到O(n)配合shifted window策略在层间交错让信息可以跨窗口流动。这两个改进让视觉Transformer在ImageNet分类上打平甚至超过了CNN也铺平了后来多模态模型CLIP、Florence等的道路。从ViT到Swin我会提醒你一个容易踩的坑视觉Transformer的位置编码维度与patch数量强相关换了输入分辨率就要重新插值位置编码。这个坑在将检测模型从固定输入尺寸迁移到动态尺寸时特别常见。6. 从密集到稀疏与推理能力的解锁MoE和思维链代表的两个演进方向6.1 MoE条件计算用路由器把参数量和计算量解耦混合专家Mixture of ExpertsMoE的思想很直接一个模型包含多个独立的专家子网络输入进来时由一个路由器router判断应该让哪些专家处理。每个token并不激活所有专家只激活Top-K个。这样参数量可以做得很大但每个token实际计算量只走一小部分专家——这就是稀疏激活也叫条件计算。MoE的演进不是新概念早在2017年就有通过门控机制选择专家的架构但因为负载不均衡和通信开销等问题一直没火起来。直到GShard和Switch Transformer出现把路由策略、负载均衡损失、并行通信设计成工程可用的形态MoE才真正成为大模型扩展参数量的主流手段。DeepSeek-V3、Mixtral等模型都是MoE路线在相同算力预算下获得远超同量级稠密模型的效果。实现上最核心的算法是Top-K路由与辅助负载均衡损失。Top-K对每个token的router logits取前K个专家加权求和输出负载均衡损失确保token均匀分配到不同专家不能让某个专家饿死。我会建议你注意MoE在推理时如果未做专家并行性能可能反而更差因为内存装了全部专家但计算只用一小部分。6.2 思维链CoT当算法演进从架构层延伸到推理层如果说MoE演进的是模型内部的参数组织方式思维链Chain-of-Thought演进的则是如何引导模型用解码生成来完成推理。CoT指在推理时让模型说一段中间推理过程再给出答案。这个范式在足够大的语言模型上效果显著在较小模型上提升有限甚至没有所以学术界把它归为新出现的涌现能力。从架构算法演进角度看CoT之所以成立一个关键因素就是Decoder-only模型在next-token预测中攒下了大量token交互能力。而RoPE、GQA、FlashAttention这些算法让长序列推理时的位置信息和缓存效率都撑得住CoT才能工作。反过来CoT实际上也改变了模型的资源分配模式原本模型只会单步预测现在它可以通过生成更长文本变相增加计算深度。从我自己的体验出发CoT并不需要改任何架构算法只需要改prompt或微调数据但效果立竿见影。它让我意识到Transformer算法演进不只是数学变换的优化还有如何利用解码空间做推理规划这个更广阔的维度。6.3 演进趋势里共同的东西可缩放性与算力的解耦我发现MoE和CoT背后的共性值得拎出来说都在解耦参数规模和实际计算。MoE让参数量扩大但计算量可控CoT让推理时间可以按问题复杂度动态增加而模型参数本身不变。传统模型是参数量即算力量而这两条路径打破了这个绑定。这个趋势也解释了很多实际工程决策为什么很多团队在算力有限时选MoE而不选超大稠密模型为什么在长推理任务上宁可多生成token也要保持FLOPs增长可控。可以预见后续的算法演进会继续沿着这个方向——让模型容量和实际算力解耦让推理能自适应问题的复杂度。回看整个Transformer架构中核心算法演进的七年你会发现一个非常清晰的规律每一项优化都不是孤立炫技而是被更大模型、更长序列、更高效推理这三个实际需求拉动的。从除以根号d的缩放到多头注意力从FlashAttention分块计算到RoPE旋转编码从Post-LN到Pre-LN从密集模型到MoE从token预测到思维链引出的新范式每一步都在解决上一阶段留下的真实瓶颈。理解这些演进逻辑能让你在配置模型、选型技术方案甚至复现论文时少走很多弯路。我最后想分享一个小习惯当你拿到一个新的Transformer变体或者新的语言模型技巧时先问三个问题——它改变了哪个算法组件它针对的是训练、推理、还是表达能力瓶颈它的代价是什么把这三点想清楚基本就能判断它对你自己的场景有没有用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑