Transformer 整体架构
Transformer整体架构 详细学习笔记
核心定位:Transformer说白了就是现在所有大模型(比如Llama2、Qwen-2)的“骨架”,它最核心的地方就是抛开了传统的RNN、CNN,改用自注意力机制,既能实现并行计算提速,又能精准抓住长文本里的语义关联,而后续需要学的C++大模型推理,全程都要围着它的“仅Decoder架构”。
一、原论文核心思想(《Attention Is All You Need》)
先聊聊Transformer为啥会出现,在它之前,NLP模型主要靠RNN和CNN干活,但这俩都有明显短板,根本撑不起大模型的规模。简单说,RNN是逐字处理文本,前一个字算完才能算下一个,不仅速度慢,还记不住远处的关键信息;CNN则是只能捕捉局部的语义关联,没法灵活对接长文本的全局逻辑,做不到通盘理解。
这篇论文的核心观点特别直白:注意力机制就够了,不用再依赖RNN、CNN的老思路。所谓注意力机制,类比下来就像咱们读文章,看到某个词会下意识关注和它相关的内容,比如看到“它很甜”的“它”,会自然联想到前面的“苹果”,模型就是靠给这些相关词分配不同权重,精准抓牢语义关联。而且它能同时处理所有词,不用排队等待,不管是训练还是推理都提速不少,还完美解决了长距离记不住的问题,这也是大模型能做到大参数量、长上下文的关键。
二、Transformer整体架构:Encoder-Decoder 双塔结构
原始Transformer是“编码器(Encoder)+ 解码器(Decoder)”的双塔组合,俩模块分工特别明确,像一对搭档:Encoder负责“读懂”输入的文本,把文本转换成包含全局语义的特征张量,再传给Decoder当参考;Decoder负责“写出”对应的输出,整套架构能直接完成从输入到输出的端到端转换,机器翻译就是典型场景,输入英文、输出中文全靠它。整体流程很清晰,就是输入层→多层Encoder堆叠→Encoder输出→多层Decoder堆叠→输出层,原论文里Encoder和Decoder各堆了6层,层数越多,模型的理解和生成能力通常越强。
这里提个关键细节,不管是Encoder还是Decoder,层与层之间都靠张量传递数据,核心张量维度是[批次大小, 序列长度, 模型维度d_model],这也是咱们后续用C++做推理时要重点处理的维度。另外,所有核心模块后面都会加“残差连接+层归一化(LN)”,就像给深层网络装了“缓冲器”,能避免训练时出现梯度消失的问题,让模型能堆更多层、走得更稳。
模块1:Encoder(编码器)—— 语义理解核心
Encoder的作用特别单一,就是专心“读懂”输入文本,把文本转换成包含全局语义的特征张量,再传给Decoder当参考,它自己完全不会生成文本。每层Encoder的结构都是固定的,堆在一起就能不断强化理解能力,流程也不复杂:输入嵌入或上一层的输出,先经过多头自注意力,再做残差连接+LN,接着过前馈网络(FFN),最后再做一次残差连接+LN,就完成了本层的处理。
多头自注意力是Encoder的核心,能做到“一眼看清全文”,也就是双向注意力,处理每个词时都能关注到文本里所有位置的词,不会遗漏任何语义关联;“多头”就相当于多个人从不同角度看同一篇文章,最后汇总观点,能让语义捕捉更全面。FFN就是纯做计算的模块,靠两层全连接网络加激活函数,给注意力层的输出做进一步特征增强,原论文用的是ReLU激活,现在大模型大多换成了GELU,训练起来更稳定。残差连接和LN不用多讲,核心就是帮深层网络“稳住节奏”,避免出错,Encoder的输入和输出长度一致,全程并行计算,效率很高,最大优势就是能精准捕捉全局语义。
模块2:Decoder(解码器)—— 文本生成核心
Decoder才是大模型的“主角”,核心任务就是靠Encoder给的语义特征,再结合已经生成的文本,逐字逐词地自回归生成下一个Token。现在主流的大模型,比如Llama2、Qwen-2,都直接删掉了Encoder,只用Decoder堆叠,也就是“仅Decoder架构”,所以咱们学大模型推理,重点就是吃透Decoder。
每层Decoder比Encoder多了一个注意力层,整体结构和Encoder类似但多了关键步骤:输入嵌入或上一层输出,先过掩码多头自注意力,再做残差连接+LN,接着经过交叉注意力,再做一次残差连接+LN,然后过FFN,最后做残差连接+LN,完成本层处理。这里最关键的就是掩码多头自注意力,它和Encoder的双向注意力不一样,是单向的,还加了“掩码”机制——就像咱们写文章,只能看着前面写过的内容,不能提前偷看后面的,模型也一样,生成第3个词时,只能关注前2个词,未来位置的词会被掩码屏蔽,本质就是把未来位置的注意力权重设为负无穷,经过Softmax后权重变成0,模型根本看不到,这样才能保证生成的文本符合顺序逻辑。
交叉注意力原本是连接Encoder和Decoder的“桥梁”,能让Decoder盯着Encoder的语义特征,保证生成的内容和输入贴合,但在仅Decoder架构里,没有Encoder就没了作用,所以会直接删掉,这也是大模型架构简化的关键。FFN和残差连接、LN,和Encoder里的作用完全一样,就不再重复。Decoder的核心特点就是自回归生成,逐词推进,上一个词的输出就是下一个词的输入,这也是大模型推理延迟的主要原因,后续做量化、并行优化,基本都是围绕这个问题展开;而且它靠深层堆叠提升能力,比如Llama2-7B堆了32层Decoder,Qwen-2-7B堆了28层,层数越多,语义理解和生成能力越强,但计算量和显存占用也会跟着增加,这也是大模型推理需要优化的核心痛点之一。
模块3:输入/输出层
输入层和输出层就是模型和自然语言的“翻译官”,负责把不可计算的自然语言,转换成模型能处理的数字张量,再把模型输出的张量转回自然语言。输入层主要做两件事:Token化和Embedding,Token化就是把原始文本拆成最小语义单元(Token),再转换成Token ID序列;Embedding则是把离散的Token ID,映射成连续的语义向量,同时还要加入位置编码——大模型大多用RoPE旋转位置编码,就像给每个词贴了“位置标签”,解决Transformer本身没有天然序列感知能力的问题。输出层就是一层全连接网络,把Decoder最后一层的输出,映射成词表大小维度的Logits向量,经过Softmax归一化后,得到每个Token的生成概率,再通过Top-k/Top-p等解码策略,选出下一个Token,直到生成终止Token或达到最大长度,完成文本生成。
三、大模型专属架构:仅Decoder,实操核心
原始Transformer的Encoder-Decoder架构,更适合机器翻译这种序列转换任务,而大模型的核心是纯生成任务,比如聊天、问答、写代码,所以仅Decoder架构才成了主流,也是咱们后续用C++做大模型推理的唯一架构对象。
这种架构的简化很直观,首先是删掉Encoder模块,只保留多层Decoder堆叠,结构大幅简化,能降低工程实现难度;其次是删掉Decoder里的交叉注意力层,毕竟没有Encoder,这层就没了作用,简化后每层Decoder就变成了“掩码多头自注意力→残差连接+LN→FFN→残差连接+LN”的核心流程。而且Embedding层会直接对接第一层Decoder,输入是Token化+RoPE位置编码后的向量序列,输出就是Logits向量,全程围绕Decoder展开,简洁又高效。
大模型之所以都用仅Decoder架构,核心就是适配需求:一是生成能力更优,自回归逻辑天生贴合纯生成任务,比Encoder-Decoder架构更适配聊天、问答等场景;二是工程实现更简单,结构简化后,训练和推理的计算量、显存占用都会降低,更适合做大参数量扩展,比如从7B模型升级到70B模型;三是推理效率更高,少了Encoder的计算环节,能明显提升推理速度,更适合工程化部署;四是能兼顾理解能力,靠深层Decoder堆叠+大参数量训练,仅Decoder架构既能“读懂”文本,又能“写出”高质量内容,不用额外依赖Encoder。
咱们再说说仅Decoder架构的推理流程,以Llama2-7B为例,核心分为两个阶段,特别好理解。第一个是Prefill(预填充)阶段,主要处理用户输入的Prompt,一次性计算出所有Token的语义特征,同时缓存KV值——也就是注意力层计算时的键(K)和值(V),这样后续生成Token时就不用重复计算,能节省时间;这个阶段结束后,会输出第一个生成Token的Logits。第二个是Decode(逐Token生成)阶段,基于Prefill阶段缓存的KV值,再结合上一个生成的Token,逐词计算下一个Token的Logits,同时不断更新KV缓存,重复这个过程,直到生成终止Token或达到最大文本长度,就完成了一次完整的推理。
四、核心考点
这里汇总几个高频考点:Transformer的核心突破是用自注意力机制替代RNN,实现并行计算并解决长距离依赖问题;Encoder和Decoder的核心差异的是,Encoder用双向注意力负责语义理解,Decoder用单向掩码注意力负责文本生成;大模型的核心架构是仅Decoder,删掉了Encoder和交叉注意力层,靠深层Decoder堆叠实现理解与生成;推理的关键是掩码操作(保证生成顺序)、KV Cache(优化推理延迟)和自回归生成(逐Token推进);LN、FFN、掩码多头自注意力是核心算子,后续用C++做推理时必须手写实现。
五、总结
总的来说,Transformer的核心价值就是靠自注意力机制,实现高效的语义建模和文本生成,而大模型的仅Decoder架构,是对它的工程化优化,既适配纯生成任务,又能降低部署成本。咱们学这个架构,不用纠结太多复杂细节,重点是吃透Decoder的掩码机制、自回归生成逻辑,还有核心算子的作用,这些都是后续学C++大模型推理、算子开发、性能优化的基础,把这些吃透,后续的学习就能更顺畅。







