Transformer架构全拆解:跟着一个token走完全程,看完再也不会忘
文章目录前言一、先把这张图刻进脑子里比你工资条还重要二、Encoder层就6件事多一件都没有三、Decoder层比encoder多3步就因为不能偷看答案第一群Masked Self-Attention第二群Cross-Attention第三群FFN四、跟着一个token走完全程翻译“Hello world”第1步tokenization第2步embedding查表第3步加位置编码第4步encoder层逐层处理第5步decoder层处理第6步输出投影第7步loss计算五、训练vs推理两种完全不同的执行方式六、三种变体为什么decoder-only最终一家独大七、参数量账本FFN才是真正的吞参大户八、常见误解这些坑90%的人都踩过写在最后P.S. 无意间发现了一个巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看传送门https://blog.csdn.net/HHX_01前言我发现咱们程序员学技术有个祖传毛病就是特别爱拆零件。学Transformer的时候把attention拆成Q、K、V三个字母把位置编码拆成sin和cos两个函数把残差连接拆成x加sublayer拆得那叫一个细细到能给Transformer做DNA亲子鉴定。结果拆完了合不上了。有人学了三个月能把Multi-Head Attention的公式倒背如流能给你讲清楚scale因子为什么是根号d_k能吐槽O(n²)复杂度是长上下文永远的爹。你问他一个token从被tokenize那一刻起到最终softmax出概率分布中间走了哪几步他当场给你表演一个大脑空白眼神涣散跟你说“等我翻一下笔记”。作者前19篇已经把Transformer的所有零件都给你拆成渣了从第9篇到第19篇attention、位置编码、FFN、残差归一化、因果掩码、复杂度、历史背景一个不落。但就像你把一辆特斯拉拆成了螺丝、轮胎、电池、电机你还是不会开特斯拉一样。你得把这些零件拼起来跟着一个token走一遍完整的流程你才算真的懂了Transformer。这一篇就是干这个的不讲新东西所有新概念全在前19篇。我就带着你跟着一个具体的token走完它在Transformer里的一生。读完之后你要是还不能闭着眼睛画出Transformer的全貌你来找我我把这篇文章抄10遍。一、先把这张图刻进脑子里比你工资条还重要先上Transformer的全貌图左边是encoder堆6层右边是decoder也堆6层中间靠cross-attention连起来。这张图我建议你直接打印出来贴在显示器上比你女朋友的照片还重要。面试的时候面试官问你Transformer架构你直接把这张图默出来他当场就得给你发offer。这个架构2017年是为机器翻译设计的左边encoder处理源语言就是你要翻译的句子右边decoder生成目标语言就是翻译出来的句子。encoder的输出传给decoder的cross-attention这是两边唯一的连接就像翻译公司的前台和翻译员之间的对讲机翻译员听不懂的时候就通过对讲机问前台。这里划个重点今天的大模型GPT、LLaMA、Mistral、Qwen全都是只用了右半部分也就是decoder-only。BERT只用了左半部分encoder-only。理解了完整的图你就能瞬间明白BERT和GPT的区别不用再背那些乱七八糟的八股文。二、Encoder层就6件事多一件都没有把encoder的一层放大内部就6步一步都不多一步都不少。我给你翻译成大白话保证你看完就忘不掉。Multi-Head Self-Attention说白了就是让每个token都看看自己身边的其他token搞清楚自己在句子里的位置和角色。就像你刚进公司第一天先跟周围的同事打个招呼知道谁是你的领导谁是你的下属谁是每天摸鱼三个小时的老油条。Add残差连接这个东西是Transformer的命根子没有它Transformer根本训不起来。就像你去爬山爬不动了原路返回就行不用从山脚重新开始。要是没有残差连接梯度传到第3层就没了后面的层根本学不到东西。LayerNorm给所有token的向量做个归一化把大家的数值拉到同一个范围内。就像公司团建不管你是年薪百万的CEO还是月薪三千的实习生都得穿统一的队服不然没法一起做游戏。Feed ForwardFFN前馈神经网络这个东西是Transformer里真正干活的占了约2/3的参数。就像公司里的基层员工干最多的活拿最少的钱背最黑的锅。Add残差连接再给你留个原路返回的标记怕你在FFN里走丢了。LayerNorm再统一一次身高确保大家都在同一个起跑线上。这6步走完一层encoder就结束了。重复6次encoder的活就干完了输出一个矩阵作为decoder的“记忆”。这里提一句原论文用的是Post-LN就是Add之后再Norm。今天的大模型几乎全部用Pre-LN就是Norm在sublayer前面。为什么因为Pre-LN训练稳定性更好不会出现梯度爆炸或者梯度消失的问题。GPT-2之后Pre-LN就成了事实标准。三、Decoder层比encoder多3步就因为不能偷看答案decoder比encoder麻烦一点一层有9步多了一个cross-attention。为什么多这一步因为decoder是生成句子的它不能偷看未来的内容。就像你考试的时候不能偷看后面同学的答案一样不然就作弊了。decoder的9步分成3个sublayer群我一个一个给你讲。第一群Masked Self-AttentionMasked Multi-Head Self-Attention跟encoder的self-attention差不多但是加了一个因果掩码把未来的token都屏蔽掉。比如你要生成“我爱中国”当你生成“我”的时候你只能看到“我”当你生成“爱”的时候你只能看到“我”和“爱”当你生成“中”的时候你只能看到“我”、“爱”和“中”以此类推。绝对不能让它看到后面的“国”不然它就直接抄答案了。Add残差连接老规矩。LayerNorm归一化老规矩。第二群Cross-AttentionCross-Attention这是encoder和decoder唯一的信息通道。Q来自decoderK和V来自encoder的最终输出。就像翻译员拿着自己写了一半的稿子通过对讲机问前台“客户刚才说的‘我爱中国’里的‘爱’是什么意思”前台就把整理好的“爱”的信息传给翻译员翻译员就知道该怎么翻了。Add残差连接。LayerNorm归一化。第三群FFNFeed Forward跟encoder的FFN一模一样干活的。Add残差连接。LayerNorm归一化。这9步走完一层decoder就结束了。重复6次decoder的活就干完了。四、跟着一个token走完全程翻译“Hello world”光说不练假把式咱们来实际走一遍就拿“Hello world”翻译成法语“Bonjour le monde”来说。我保证走完这一遍你这辈子都忘不了Transformer的流程。第1步tokenization把句子拆成token id这是大模型的第一步也是最基础的一步。“Hello world”变成[15496, 995]“Bonjour le monde”变成[10222, 333, 7625]。这里有个非常重要的细节decoder的输入要右移一位首位加一个BOS开始符变成[BOS, 10222, 333]。为什么要右移因为你要预测下一个token啊。输入BOS预测Bonjour输入Bonjour预测le输入le预测monde。就像你玩成语接龙第一个人说“一”第二个人说“二”第三个人说“三”以此类推。第2步embedding查表把每个token id变成一个512维的向量base模型。就像给每个词发一个身份证上面有512个信息包括词性、词义、感情色彩、使用场景等等。embedding矩阵的形状是(词表大小, 512)论文里source和target共享同一个embedding矩阵这样可以节省参数。第3步加位置编码Transformer本身是不知道顺序的你把“我爱中国”改成“中国爱我”它根本分不清。所以要给每个位置加一个sin/cos编码告诉模型这个词在第几个位置。就像给每个身份证加一个座位号告诉模型你坐在第几排第几列。第4步encoder层逐层处理source的embedding加完位置编码之后进入encoder layer 1走完刚才说的6步输出形状还是(2, 512)。然后重复6次最终encoder输出一个2×512的矩阵作为decoder的“记忆”。第5步decoder层处理target的embedding加完位置编码之后进入decoder layer 1走完9步。训练的时候是并行的一次性把所有target输入进去用因果掩码保证不偷看未来。推理的时候是串行的一个token一个token生成慢得要死。第6步输出投影decoder最后一层输出(3, 512)的向量过一个Linear层把512维映射到词表大小然后过softmax得到每个位置的概率分布。位置0输入BOS的输出预测应该是Bonjour位置1输入Bonjour预测le位置2输入le预测monde。第7步loss计算用交叉熵损失对3个位置取平均然后反向传播一直传回到embedding表所有矩阵都更新一步。整个训练过程一次forward就搞定了这就是Transformer比LSTM快几十倍的根源。五、训练vs推理两种完全不同的执行方式这里有个90%的程序员都搞不懂的点同样一组权重训练和推理的执行方式完全不一样。我给你打个比方你瞬间就懂了。训练Teacher Forcing就像老师带着你考试把答案直接给你你抄一遍就行。整个目标序列一次性喂入decoder因果掩码保证位置t只能看0…t-1一次forward同时算出所有位置的损失高度并行快得飞起。推理Autoregressive就像你自己闭卷考试一道题一道题做。从BOS开始逐token生成每生成一个新token都要重新forward一次。虽然有KV cache优化但整体还是串行的O(m)步。这就是为什么LLM推理慢的根本原因不是模型不行是它天生就是串行的。你再怎么优化也不可能把串行变成并行最多就是让每一步更快一点。六、三种变体为什么decoder-only最终一家独大原论文是Encoder-Decoder架构但2018年之后工业界把它拆成了三种用法分别是Encoder-only、Decoder-only和Encoder-Decoder。我给你做个对比你就知道为什么现在只有Decoder-only活下来了。维度Encoder-onlyDecoder-onlyEncoder-Decoder代表模型BERT、RoBERTaGPT、LLaMA、MistralT5、BART主要用途理解类任务分类、NER、QA生成类任务对话、写文章、翻译输入输出任务翻译、摘要训练目标MLM掩码语言模型LM语言模型seq2seq时代2018-202020202017-2020为什么Decoder-only最终胜出不是因为它理论上最优是工程现实逼的。我给你列5个原因每一个都扎心。预训练微调范式GPT-3证明了decoder-only可以靠上下文学习适配任何任务不用为每个任务专门微调。就像你买了一个智能机装个APP就能干任何事不用为了打电话买个功能机为了拍照买个相机。数据简单decoder-only只要纯文本就行自回归预测下一个token互联网上到处都是数据要多少有多少。encoder-decoder需要成对的数据比如中文和英文的翻译对这种数据很难规模化成本极高。参数效率同样的总参数量decoder-only全部用来建模文本encoder-decoder一半用于encode一半用于decode对生成任务来说浪费了一半参数。就像你买了个128G的手机系统占了64G剩下64G才能用谁愿意啊优化路线清晰decoder-only的推理优化比如KV cache、PagedAttention、FlashAttention、投机解码工业界投入了巨大的人力物力已经非常成熟了。encoder-decoder的优化生态弱得一批没人愿意搞。任务统一一切任务都可以转成“输入prompt→输出text”的形式decoder-only天然胜任。翻译你给它说“把这句翻译成法语Hello world”就行。摘要你给它说“给这篇文章写个100字的摘要”就行。写代码你给它说“用Python写个冒泡排序”就行。所以现在GPT、LLaMA、Claude、Gemini全是decoder-only的encoder-only只能在向量检索、文本分类这些小领域苟活encoder-decoder基本只能在实验室里待着了。七、参数量账本FFN才是真正的吞参大户咱们来算一下base模型的参数量base模型d512L6h8d_ff2048词表37k。算完之后你会发现一个惊天秘密FFN才是真正的吞参大户attention根本不算什么。Embedding层37000×512≈19M每个encoder层self-attention≈1.05MFFN≈2.1M合计≈3.15M6层≈18.9M每个decoder层masked self-attention≈1.05Mcross-attention≈1.05MFFN≈2.1M合计≈4.2M6层≈25.2M输出投影与embedding共享0新增总参数量≈1918.925.2≈63M跟论文里的65M差不多差距来自LayerNorm和位置编码这些小项。你看FFN占了约2/3的参数attention只占1/3。这就像公司里基层员工占了2/3管理层只占1/3真正干活的还是基层。所以MoE把FFN稀疏化就能极大地节省参数因为大部分FFN其实是不用的就像公司里大部分基层员工其实是在摸鱼一样。八、常见误解这些坑90%的人都踩过最后说几个常见的误解别再被八股文骗了。❌ “encoder是给decoder提供条件”——准确但更精确说encoder只在cross-attention阶段提供K、V。❌ “decoder必须有cross-attention”——错decoder-only模型GPT就没有cross-attention。❌ “位置编码加在每一层”——错只在最底层embedding之后加一次后续层都通过残差和attention传递。❌ “Transformer架构七年没变”——错骨架没变但细节几乎全换了Pre-LN替代Post-LNRoPE替代正弦位置编码SwiGLU替代ReLURMSNorm替代LayerNormGQA替代MHA。❌ “encoder-decoder比decoder-only强”——错在通用任务上decoder-only更灵活只有在翻译这种结构化seq2seq任务上略强一点。写在最后Transformer这篇论文发表已经快9年了9年时间里人工智能领域发生了天翻地覆的变化但Transformer的骨架一点都没变。所有人都只是在这张图上修修补补换个激活函数换个位置编码换个注意力机制仅此而已。这正是这篇论文最了不起的地方它定义了大模型的基本架构为整个行业指明了方向。如果你想做AI想做大模型想做智能体开发Transformer是你绕不过去的坎。把这篇文章收藏起来没事就翻出来看看跟着一个token走一遍流程你会发现Transformer其实一点都不难。P.S. 无意间发现了一个巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看传送门https://blog.csdn.net/HHX_01