LLM模型开发教程(十)Transformer架构核心原理解读(一文搞定)
Transformer架构核心技术解读
什么是Transformer?
✅ 简单一句话:
Transformer 是一种革命性的序列模型,它用“注意力机制”取代传统循环结构,实现了高效、灵活、强大的自然语言处理能力,是现代 AI 大模型的基石。于处理序列数据(如语言)的深度学习模型,特别擅长机器翻译、文本生成等任务。
🔍 它诞生前的问题:
在 Transformer 出现之前,主流的序列模型是 RNN(循环神经网络)和 LSTM。但它们存在两个严重问题:
训练慢:因为必须按顺序处理每个词(比如先看“这”,再看“是”,再看“一本”……),无法并行计算。
长距离依赖难建模:句子中相隔很远的词之间关系难以捕捉(例如:“他”指代谁?)。
👉 所以,研究人员提出了 Transformer —— 用“注意力机制”代替 RNN,实现并行化 + 更强语义理解能力。
Transformer架构解读
📌 前置认知(重要理解)
在深入Transformer之前,需要理解一个核心概念:
- Encoder处理过程中token的变化规律:
- ✅ 语义会变化:每个token的向量表示在Encoder各层中持续变化,语义不断丰富和融合
- ✅ 位置不变:token的顺序始终保持不变(第1个token始终在第1个位置,第2个始终在第2个位置)
- 💡 类比:就像一本书,内容(语义)在不断被理解和丰富,但页码(位置)不会改变
涉及到的几个技术点解读
Encoder-Decoder 框架
图解:
🔁 整体结构 = Encoder + Decoder
左边是多个 Encoder 层堆叠(输入中文)
右边是多个 Decoder 层堆叠(输出英文)
输入:“这是一本书” → 输出:“This is a book”
✅ 这就是典型的 序列到序列(Seq2Seq)任务,比如机器翻译。
📌 关键点:
- 每个 Encoder 和 Decoder 都由多个相同的模块组成(可复制 N 次)
- 数据流动方向:输入 → Encoder → Decoder → 输出
- Encoder层也是由多个Encoder堆叠,数据在Encoder层也是一层一层传递,最后由最后一个Encoder把数据交给Decoder层,Decoder也是多层,也需要一层层传递
位置编码
📍 在Transformer中的位置
位置编码是Transformer的"第一道工序",位于整个架构的最前端:
输入文本 → Tokenize → Embedding → 【位置编码】→ Encoder/Decoder
↑
在这里添加位置信息
一句话理解:位置编码在词嵌入之后、注意力机制之前,为每个token添加"位置标签",告诉模型"这个词在第几个位置"。
公式(正/余弦)
公式解读

ω(角速度)的作用
- ω 表示角变化的快慢,ω 越大,角变化越快
- ω 起到角度缩放的作用
为什么用正余弦确定位置?
| 原因 | 说明 |
|---|---|
| ✅ 可定位 | 通过 (cosθ, sinθ) 精确表示单位圆上的点 |
| ✅ 可叠加 | 多个不同频率的波组合,生成丰富表达 |
| ✅ 保唯一性 | 每个位置都有独特编码,支持区分 |
| ✅ 支持相对位置 | 模型可学习“前一个词”、“后两个词”等关系 |
| ✅ 数学优雅 | 类似傅立叶变换,具备理论支撑和扩展能力 |
为什么存在?
Multi-Head Attention 对 token 顺序天然不敏感,无法区分序列先后关系。
具体问题:
- Attention机制只看"内容相似度",不看"位置关系"
- 例如:“猫吃鱼"和"鱼吃猫”,Attention看到的词是一样的,但意思完全不同
- 没有位置信息,模型无法区分这两个句子
解决什么问题?
将"位置信息"显式注入 token 表示,使模型具备顺序感知能力。
关键作用:
- ✅ 让模型知道词的顺序(第1个、第2个…)
- ✅ 让模型理解相对位置关系(“前一个词”、“后两个词”)
- ✅ 保证"猫吃鱼"和"鱼吃猫"能被正确区分
用在什么环节?
Encoder 和 Decoder 的 输入端(Embedding 之后,Attention 之前)。
内部详细工作流
Input Representation = Token Embedding + Positional Encoding
位置信息以向量形式叠加到语义向量中,并随层级传递。
数学表达:
- 对于位置为
pos的token,其最终表示 =Embedding(token) + PositionalEncoding(pos) - 两者维度相同,直接相加(element-wise addition)
- 相加后的向量同时包含:词义信息 + 位置信息
实际工作场景类比
同样一句话,加了页码就不会被乱序理解。
💡 关键理解
- 位置编码是固定的(原始Transformer使用正弦/余弦函数,不需要学习)
- 位置编码是可加的(直接加到词嵌入向量上)
- 位置编码只加一次(在输入层),之后所有层都继承这个位置信息
多头注意力机制
📍 在Transformer中的位置
多头注意力机制是Transformer的核心组件,出现在:
- Encoder中:Multi-Head Self-Attention(无掩码)
- Decoder中:Masked Multi-Head Self-Attention(有因果掩码)+ Cross-Attention(跨注意力)
一句话理解:多头 = 同一个token,多个并行的"理解视角",让模型同时关注多种关系。
为什么「必须」是多头,而不是单头
多头 = 同一个token,多个并行的“理解视角”
-
如果只有一个 Self-Attention,会出现一个根本问题:
- 一个 token 同一时间只能关注“一种关系模式”。
-
但真实语言中,一个词同时需要理解多种关系,例如:
- 语法关系(主谓宾)
- 语义相似性
- 指代关系
- 长距离依赖
- 修饰关系
单头做不到并行表达这些关系。
解决什么问题?
允许模型在多个表示子空间中同时捕获不同类型的依赖关系。
核心价值:
- ✅ 并行建模:同时关注语法、语义、指代等多种关系
- ✅ 表达丰富:单头只能表达一种关系,多头可以表达多种关系
- ✅ 性能提升:实验证明多头比单头性能更好
用在什么环节?
-
Encoder:Multi-Head Self-Attention(无因果掩码)
- Q、K、V都来自Encoder自身
- 可以看所有位置(包括未来位置)
-
Decoder:Masked Multi-Head Self-Attention(有因果掩码)
- Q、K、V都来自Decoder自身
- 只能看过去位置(防止信息泄露)
多头自注意力在“单层内部”的真实工作流
① 输入仍然是同一份向量序列
X = [x₁, x₂, x₃]
② 并行拆成 h 个“注意力子空间”(Heads)
- 每一个 head 都有自己的一组参数:
Head₁: Q₁, K₁, V₁
Head₂: Q₂, K₂, V₂
...
Headₕ
注意关键点:
不是把 token 拆开,而是把“表示空间”拆开
③ 每个 Head 独立做一次 Self-Attention
- 对同一个 token 序列:
Head₁ → 关注语法
Head₂ → 关注语义
Head₃ → 关注指代
...
数学上:
head_i = Attention(XWq_i, XWk_i, XWv_i)
④ 所有 Head 的输出被拼接 + 投影
Concat(head₁, head₂, ..., headₕ)
→ Linear Projection
这一步完成的事情是:把“多视角理解”整合回一个统一表示
Encoder 和 Decoder 中「多头」的真正区别(一句话就够)
Encoder 多头自注意力:
- Q K V 都来自 Encoder 自身
- 无因果掩码
- 目标:并行理解全句
Decoder 多头自注意力:
- Q K V 都来自 Decoder 自身
- 有因果掩码
- 目标:生成时不偷看未来
Decoder 多头交叉注意力:
- Q 来自 Decoder
- K V 来自 Encoder
- 目标:对齐输入语义
实际工作场景类比
同一段话由多位专家从语法、语义、逻辑等角度并行解读。
💡 关键理解
- 头数选择:通常8-16个头,d_model必须是头数的倍数(例如d_model=512,头数=8,每个头维度=64)
- 计算方式:每个头独立计算,最后拼接并投影回原始维度
- 为什么有效:不同头学习不同的"关注模式",有的关注语法,有的关注语义,有的关注长距离依赖
残差网络

📍 在Transformer中的位置
残差连接出现在Transformer的每一个子层之后:
- Multi-Head Self-Attention 子层后
- Feed-Forward Network 子层后
注意:
做残差时是有两份输入,一份是原数据,一份是自己学到的数据
图解
Transformer 使用残差网络是为了让模型更容易训练更深的网络。
每一层都把"自己学的东西"和"原来的信息"加在一起;
这样即使某一层没学到啥,也不会丢失原始数据;
模型可以堆叠很多层(如6层、12层),依然保持稳定;
正是因为有了这个设计,才使得 Transformer 能够构建超大规模模型(如 GPT、BERT)。
为什么存在?
- Transformer 采用深层堆叠结构(多层 Encoder / Decoder),子层内部包含线性映射、Softmax、非线性激活等操作。随着层数增加,表示会发生级联变换,导致梯度传播路径变长,训练难度显著上升。
解决的问题
- 通过显式构建恒等映射路径,使每一层只需学习相对于输入的增量表示(residual),从而:
- 缩短有效梯度传播路径
- 保证底层语义表示在高层仍可被直接访问
- 提高深层 Transformer 的可训练性与稳定性
应用环节
- 每一个子层(SubLayer)之后,包括:
- Multi-Head Self-Attention 子层
- Position-wise Feed-Forward Network 子层
- 在 Encoder 与 Decoder 中均一致使用。
内部机理
对任一子层函数 SubLayer(·):
y = x + SubLayer(x)
output = LayerNorm(y)
其中 x 为子层输入。子层学习的是对 x 的修正项,而非完整重构。
工程语义类比
- 每一层对序列表示的建模是"在既有表示上的增量修正",而非替换;若修正无效,原始表示仍被完整保留并传递至后续层。
💡 关键理解
- 为什么有效:残差连接创建了"信息高速公路",让梯度可以直接传播到底层
- 数学本质:
y = x + f(x),如果f(x)学不好,至少还有x(恒等映射) - 与LayerNorm配合:残差连接可能改变数值分布,LayerNorm负责稳定,两者缺一不可
层归一化

📍 在Transformer中的位置
LayerNorm紧随残差连接之后,与每个子层成对出现:
- Multi-Head Self-Attention + Residual → LayerNorm
- Feed-Forward Network + Residual → LayerNorm
一句话理解:LayerNorm是Transformer的"稳定器",负责统一数值尺度,让训练更稳定。
存在原因
在 Multi-Head Self-Attention 与 Position-wise Feed-Forward Network 之后,token 表示是多个线性变换与加权求和的结果,其数值分布在层间高度不稳定,影响梯度尺度与收敛行为。
解决的问题
- 对每个 token 的隐藏表示进行特征维度级归一化,消除内部协变量偏移(internal covariate shift),从而:
- 稳定训练过程
- 提高学习率可用范围
- 加快模型收敛
应用环节
- 紧随残差连接之后,与每一个子层成对出现:
- Multi-Head Self-Attention + Residual 后
- Position-wise FFN + Residual 后
内部机理
- 对单个 token 的隐藏向量
x ∈ R^d
μ = mean(x)
σ² = var(x)
x̂ = (x − μ) / sqrt(σ² + ε)
output = γ · x̂ + β
其中 γ、β 为可学习参数;归一化仅作用于特征维度,不跨 token。
工程语义类比
不同 token 在不同层中可能被赋予不同强度的注意力权重,Layer Normalization 统一其数值尺度,使后续层建模基于结构与关系,而非幅值差异。
💡 关键理解
- 归一化方向:LayerNorm是对特征维度归一化(每个token独立归一化),不是BatchNorm(对batch维度归一化)
- 为什么用LayerNorm:Transformer是序列模型,batch大小可能变化,LayerNorm更稳定
- 可学习参数:γ和β是可学习的缩放和偏移参数,让模型可以"选择"是否使用归一化
前馈神经网络FFN
- 本质就是把 token 向量里不同的语义线索混合成新的语义特征,然后重新映射到
token 的向量空间坐标,使隐藏表示更丰富、更能承载复杂语义。
📍 在Transformer中的位置
FFN出现在Encoder和Decoder的每一层中,紧接在Multi-Head Attention子层之后:
Attention → Residual + LayerNorm → 【FFN】 → Residual + LayerNorm
一句话理解:FFN是Transformer的"语义变换器",把token向量里不同的语义线索混合成新的语义特征,然后重新映射到token的向量空间坐标,使隐藏表示更丰富、更能承载复杂语义。
存在原因
- Multi-Head Self-Attention 的核心作用是建模 token 间依赖关系,其本质是加权线性组合,不引入复杂的非线性变换。
解决的问题
通过在每个 token 位置引入非线性映射,提高模型对复杂语义模式的表示能力,使模型不仅能“聚合信息”,还能“变换信息”。
应用环节
Encoder 与 Decoder 的每一层中,紧接在 Multi-Head Attention 子层之后。
内部机理
- 对每个 token 表示独立应用:
FFN(x) = W₂ · φ(W₁ · x + b₁) + b₂
其中:
- φ 为非线性激活函数(ReLU / GELU)
- 参数在所有 token 位置间共享
- 不引入 token 间交互(position-wise)
工程语义类比
Attention 子层完成跨位置的信息聚合;FFN 子层在固定位置上对聚合结果进行非线性语义重编码。
💡 关键理解
- 为什么需要FFN:Attention本质是线性组合(加权求和),FFN引入非线性变换,增强表达能力
- 典型结构:两层全连接,先升维(通常4倍,如512→2048)再降维(2048→512),中间用ReLU/GELU激活
- 位置独立:FFN对每个token位置独立处理,不引入token间交互(position-wise)
- 参数量大:FFN的参数量通常占Transformer总参数量的2/3左右
Encoder内部解析

图解:
📍 Encoder在Transformer中的位置
Encoder位于Transformer的左侧,负责"理解输入":
输入文本 → Tokenize → Embedding + Position → 【Encoder (N层)】 → 语义Memory → Decoder
Encoder 单层结构:
-
Multi-Head Self-Attention(多头自注意力)
-
Feed Forward Network(FFN,前馈神经网络)
-
残差 + LayerNorm(每个子层后都有)
总结一句话:
-
Encoder 每加一层,都是在问:
“在更大的上下文下,我还该不该保持现在这个语义?” -
层数决定“理解能有多深”
每一层在解决:上下文关系逐步抽象的问题
可以把 Encoder 层理解为 逐层升级的“理解管道”:
🟦 第 1–2 层:局部感知层(Lexical / Surface)
- 解决的问题:词形、词性,邻近词搭配,基本位置关系
- 向量在学什么?“我是谁”,“我旁边是谁”
🟦 第 3–6 层:句法建模层(Syntactic)
- 解决的问题:主谓宾结构,修饰关系,依存关系
- 注意力模式开始呈现:树状、对称、结构化
🟦 第 7–10 层:语义整合层(Semantic)
- 解决的问题:同义 / 反义、角色对齐(谁做了什么)、句子层意义
- 这里开始:token 不再像“词”、而像“语义节点”
🟦 第 11+ 层:全局抽象层(Global / Task-level)
-
解决的问题:句子意图、隐含信息、上下文偏好
-
此时:多个 token 的表示开始趋同、出现“语义塌缩”(为决策服务)
Encoder单层工作原理
Encoder单层严格结构:
输入 X(l-1)
↓
Multi-Head Self-Attention: [ 多头自注意力机制 ]:让序列中每个位置动态关注其他所有位置,捕获全局依赖关系;“多头”表示从多个子空间并行学习不同类型的交互(如语法、语义等)。
↓
Residual + LayerNorm: [ 残差连接 + 层归一化 ]:残差连接(X(l-1) + Attention输出)保留原始信息,缓解梯度消失;LayerNorm 对每个 token 的特征维度做归一化,提升训练稳定性。
↓
Feed Forward Network: FFN:两层全连接网络(通常先升维再降维),对每个位置的向量独立进行非线性映射,增强模型表达能力,不引入位置间交互。
↓
Residual + LayerNorm: [ 残差连接 + 层归一化 ]:再次通过残差保留FFN前的信息,LayerNorm进一步稳定分布。
↓
输出 X(l)
Encoder 单层在干什么?
在当前层级的语义尺度下,
重新计算每个 token 与所有 token 的依赖权重,
并对 token 表示做一次非线性重映射。
Encoder层内精确流程
Encoder单层工作流(从输入到输出)
🔹 Step 0:层输入是什么?
输入:X(l-1)
形态:一个矩阵 [seq_len, d_model]
含义:每个 token 当前“我是谁”的向量
🔹 Step 1:复制三份(不是三种信息)
Q = X(l-1) · Wq
K = X(l-1) · Wk
V = X(l-1) · Wv
直觉解释:
Q:token的向量空间坐标,这表是我是谁?我关心什么?
K:所有token的向量空间坐标,即我有什么可以给别人查?
V:所有token的向量空间坐标,即我有哪些值可以被别人拿走
🔹 Step 2:计算“相关性分数”(只做一件事)
score(i, j) = Qi · Kj
含义:
第 i 个 token
要不要关注第 j 个 token?
🔹 Step 3:归一化为“注意力权重”
α(i, j) = softmax(score(i, :))
现在每一行都是:
“我该从谁那里拿信息,拿多少?”
🔹 Step 4:信息汇总(关键一步)
new_i = Σ α(i, j) · Vj
此时:
第 i 个 token
已经融合了 所有 token 的信息
⚠️ 到这里为止:
- 只发生了信息重组
- 没有产生新语义
🔹 Step 5:残差连接(防止失忆)
Z = new + X(l-1)
含义:
在“原我”的基础上,
叠加刚才学到的上下文信息
🔹 Step 6:LayerNorm(稳定尺度)
Z_norm = LayerNorm(Z)
不改语义,只管数值稳定。
🔹 Step 7:FFN(真正的“变形”)
FFN(Z_norm)
直觉:
- “在已经知道上下文之后,我应该变成一个什么样的向量?”
- 这是语义形态改变发生的地方。
🔹 Step 8:再一次残差 + 归一化
X(l) = LayerNorm(FFN(Z_norm) + Z_norm)
Encoder 每层之间递进的原理
每一层不是加新信息,而是:
在更大的上下文条件下,重算“哪些信息重要”
- 比如N层逐渐递进:
- X(0): 词 + 位置信息
- X(1): 融合局部上下文
- X(2): 稳定句法关系
- X(3): 语义角色对齐
- …
- X(N): 全局语义一致表示
即同一批 token,被反复自引用重构
Encoder 多层:为什么“递进”是必然的?
- 关键点只有一句:
下一层看到的不是原始 token,
而是“已经融合过上下文的 token”。 - 比如:
- 第 1 层:基于原始词
- 第 2 层:基于上下文词
- 第 3 层:基于语义词
Encoder 的结束层产物是什么?
- 一组"上下文充分融合"的向量序列
- 它不是:分类结果、预测结果
- 而是:Decoder 可以随时查询的 Key / Value 语义记忆库
💡 关键理解
- 输出形状:Encoder输出形状 = 输入形状(序列长度不变,每个位置对应一个向量)
- 输出内容:每个位置的向量都融合了全句的上下文信息
- 输出用途:作为Decoder中Cross-Attention的Key和Value,供Decoder查询使用
- 重要特性:Encoder的输出是"只读"的,Decoder只能查询,不能修改
Decoder内部解析

图解:
📍 Decoder在Transformer中的位置
Decoder位于Transformer的右侧,负责"生成输出":
Encoder输出(语义Memory) → 【Decoder (M层)】 → Linear + Softmax → 生成token
🔧 Decoder
Decoder 的一句话总结
-
Decoder 的每一层,都在重新回答一个问题(重新生成token):
“在我目前已经说了这些话的前提下,下一步该说什么才最对?” -
Decoder
- 层数决定“生成能有多稳、多准、多有策略”
- 每一层在解决:下一 token 决策逐步校正的问题
Decoder 每一层的核心目的是什么?
Decoder 的本质任务:掩码机制下(受限约束Mask),一步步生成下一个 token
Decoder 单层结构
- Masked Self-Attention(只能看过去)
- Cross-Attention(看 Encoder 输出)
- FFN
- 残差 + LayerNorm
Decoder 分层功能拆解
🟥 低层(1–3 层):语言流畅性
- 解决的问题:语法是否通顺、n-gram 连贯、常见搭配
- 没有这些层:文本会像“语法错误的马尔可夫链”
🟥 中层(4–8 层):语义一致性
- 解决的问题:是否偏题、是否自相矛盾、是否遵守上下文设定
- 这里开始:生成开始“像是在思考”
🟥 高层(9+ 层):意图与策略
- 解决的问题:回答风格、任务完成度、隐含目标(说服 / 解释 / 总结)
- 此处:token 选择不再只是“最可能”而是“最合适”
Decoder 单层工作原理
输入 Y(l-1)
↓
Masked Multi-Head Self-Attention:[掩码多头自注意力]:让当前已生成的输出序列内部进行注意力计算,但通过“掩码”禁止关注未来位置;确保自回归特性:第 t 个词只能依赖第 1 到 t−1 个词,防止信息泄露。
↓
Residual+LayerNorm:[残差连接+层归一化 ] 残差连接保留原始输入 Y(l-1),避免深层网络信息丢失;LayerNorm 对每个 token 的特征维度归一化,稳定训练动态。
↓
Cross-Attention (Encoder-Decoder): 跨注意力:Query来自Decoder当前状态,Key 和 Value 来自 Encoder 最终输出 X;实现“译文词 ↔ 原文词”的动态对齐,例如生成 “cats” 时聚焦中文 “猫”。
↓
Residual+LayerNorm: [ 残差连接 + 层归一化 ]:再次融合跨注意力前后的信息,保持梯度通路畅通,提升模型鲁棒性。
↓
Feed Forward Network:[前馈神经网络(逐位置非线性变换)] 与 Encoder 相同:两层全连接网络,独立处理每个位置的向量,引入非线性能力,增强表达力,不改变序列长度。
↓
Residual+LayerNorm:[残差连接+层归一化]最后一次信息整合与分布稳定,输出本层最终表示。
↓
输出 Y(l)
Decoder 单层工作流(从输入到输出)
🔸 Step 0:层输入是什么?
输入:Y(l-1)
含义:当前已生成内容的向量状态
🔸 Step 1:Masked Self-Attention(只看过去)
-
流程与 Encoder 完全一样,唯一差别:score 中加入 mask未来位置直接不可见(多了掩码机制)
-
作用:保证“我只能基于已经说过的内容思考”
🔸 Step 2:残差 + LayerNorm
-同 Encoder,稳定状态。
🔸 Step 3:Cross-Attention(最关键的交接点)
输入:
- Q:来自 Decoder 当前状态
- K / V:来自 Encoder 最终输出
数学形式:
Attention(Q_dec, K_enc, V_enc)
🔸 Step 4:信息融合
输出结果是:
“当前生成状态 + 输入语义条件”的融合表示
🔸 Step 5:FFN(生成决策塑形)
和 Encoder 一样:
把融合结果
映射到“更适合选 token”的向量空间
🔸 Step 6:残差 + 归一化
Y(l)
Decoder 和 Encoder 的差异,不是多,而是多了一道"查询外部记忆"的步骤。
💡 关键理解
- Decoder的输入:不是Encoder的输出,而是已生成的部分(从开始)
- Decoder的核心:Cross-Attention是Decoder独有的,用于查询Encoder的语义记忆
- 生成方式:自回归(autoregressive),一个词一个词地生成,每次生成时都会查询Encoder
Decoder层递进关系
- 每一层都在重新评估:
“我到底该生成什么?” - 递进路径:
- Y(1): 语言合法
- Y(2): 语义不偏
- Y(3): 条件对齐
- Y(4): 意图清晰
- …
- Y(M): 决策稳定
Encoder和Decoder的工作流关联

✅ 左边:Encoder(编码器)—— “读懂句子”
输入:词嵌入 + 位置编码(知道顺序)
每层包含:
-
Self-Attention:让每个词关注其他词(比如“Thinking”和“Machines”互相关联)
-
Feed Forward:对每个词单独加工
-
Add & Normalize:残差连接 + 归一化 → 保留信息,防止训练崩溃
-
堆叠多层(图中是2层),逐步提取语义
-
✅ 输出:一个富含上下文的向量表示(即“这句话的意思”)
✅ 右边:Decoder(解码器)—— “生成翻译”
输入:目标语言的已生成部分(如“Machines”)
每层包含三步:
- Self-Attention:只能看前面已生成的词(防偷看未来)
- Encoder-Decoder Attention:看 Encoder 的输出 → 找对应原文词
3 . Feed Forward + Add & Normalize
最后通过 Linear + Softmax 得到下一个词的概率分布 - ✅ 输出:逐词生成目标语言(如“I think machines…”)
✅ 总结一句话
Transformer = Encoder 看懂 → Decoder 生成,靠"注意力"找关系,靠"残差"保稳定,靠"Cross-Attention"连接两者,最终实现智能翻译或生成。
💡 核心工作流程
- Encoder阶段:一次性处理整个输入序列,生成"语义记忆库"
- Decoder阶段:逐词生成,每生成一个词都要:
- 先看自己已生成的内容(Masked Self-Attention)
- 再查询Encoder的语义记忆(Cross-Attention)
- 最后决定下一个词(FFN + Softmax)
Encoder与Decoder的互动流程
Step 0:Encoder 先完整跑完(一次性)
输入 tokens
→ Embedding
→ Encoder Layer 1
→ Encoder Layer 2
→ ...
→ Encoder Layer N
产物只有一个
E = [e1, e2, ..., en]
含义非常明确:
- 每个 ei 都是一个“已经融合了全文上下文”的 token 表示
Step 1:Decoder 开始生成(以当前位置 t 为例)
Decoder 的输入是:
已经生成的 tokens = [y1, y2, ..., y(t-1)]
此时Decoder不知道下一个词是什么…
Step 2:Decoder 做 Masked Self-Attention(先管好自己)
Q = Y · Wq
K = Y · Wk
V = Y · Wv
+ causal mask
这一步的唯一作用:
在“不看未来”的前提下,
把“我已经说过的话”整理成一个稳定状态
产物:
S(t) = 当前生成状态向量
Step 3:Decoder 用 S(t) 去“问” Encoder(核心交互)
这是 Encoder 和 Decoder 唯一发生真实交互的地方。
Query = S(t)
Key / Val = E (Encoder 输出)
计算:
Attention(S(t), E)
直觉解释
我现在要继续说话,
输入内容中哪些地方和我最相关?
Step 4:Encoder 返回“相关语义片段”
Attention 的结果是:
C(t) = Encoder 中与当前生成最相关的信息组合
注意:
- Encoder 不参与计算
- Encoder 不改变自身
- Encoder 只是被“读取”
Step 5:Decoder 融合信息并做生成决策
融合:S(t) + C(t)
→ FFN
→ 得到用于预测下一个 token 的向量
Step 6:输出概率,选 token,进入下一个时间步
Linear + Softmax → P(next token)
然后
[y1, y2, ..., y(t-1), yt]
循环回 Step 2。
记住
- 一句话总结 Encoder ↔ Decoder 的互动关系
- Encoder 负责把输入变成“可被查询的语义记忆”;
- Decoder 在每一步生成时,用自身状态作为 Query,
主动从 Encoder 中检索所需信息。
是否与 Encoder 交互[单项依赖]
- Encoder:完全不关心 Decoder
- Decoder:高度依赖 Encoder
关系比喻
- Encoder = 整理资料的人
- Decoder = 写答案的人
- Cross-Attention = 查资料
更工程一点:
- Encoder = 只读语义内存
- Decoder = 自回归控制器
❌ 错误理解:
Decoder 是“拿 Encoder 输出直接生成文本”
✅ 正确理解:
Decoder 是“在已有输出历史的基础上,
反复向 Encoder 查询条件信息来做决策”
核心概念
- Encoder 提供的是"语义空间"(理解输入,生成可查询的记忆)
- Decoder 提供的是"时间与顺序"(按顺序生成输出)
- 生成永远由 Decoder 发起(Encoder只理解,不生成)
💡 常见误区澄清
❌ 错误理解:
- “Encoder直接生成输出”
- “Decoder拿Encoder的输出直接翻译”
- “Encoder和Decoder同时工作”
✅ 正确理解:
- Encoder先完整处理输入,生成语义记忆
- Decoder在生成时,每一步都查询Encoder的记忆
- Encoder和Decoder是"先理解后生成"的顺序关系
Encoder和Decoder一般有几层?由什么决定?
📍 层数选择的基本原则
层数不是越多越好,需要平衡:
- ✅ 性能:层数越多,表达能力越强
- ❌ 成本:层数越多,计算量和内存占用越大
- ⚠️ 训练难度:层数越多,训练越困难(梯度消失、过拟合)
| 模型 /场景 | Encoder 层数 | Decoder 层数 | 说明 |
|---|---|---|---|
| 原始 Transformer(论文) | 6 | 6 | 论文标准配置 |
| 小模型 / 教学 / 原型 | 2–4 | 2–4 | 快速验证想法 |
| BERT-base | 12 | — | 只用Encoder |
| BERT-large | 24 | — | 更大参数量的BERT |
| GPT-2 | — | 12–48 | 只用Decoder,不同规模 |
| GPT-3 | — | 96 | 超大模型 |
| 现代大模型(经验) | 12–80+ | 12–80+ | 根据任务和资源选择 |
任务复杂度对层数的要求
| 任务类型 | 对层数的要求 |
|---|---|
| 分类 / 情感判断 | 低 |
| 抽取式 QA | 中 |
| 翻译 / 摘要 | 高 |
| 复杂推理 / 生成 | 极高 |
为什么“层数”比“你想的更重要”?
因为:
每一层 Attention ≈ 一次“关系重计算”
1–3 层:局部依赖
6–12 层:句法 + 语义
24+ 层:抽象推理、指代消解、规划
这也是为什么
BERT-base = 12
BERT-large = 24
GPT-3 = 96
根据技术能选择
新手/原型阶段
Encoder: 4–6
Decoder: 4–6
Hidden size: 256–512
NLP生产任务
Encoder: 12
Decoder: 6–12
Hidden size: 768
如果你做生成 / 推理
Decoder-only
Layers: 能撑多少算多少
💡 层数选择的经验法则
- 理解任务(如BERT):Encoder层数更重要,通常12-24层
- 生成任务(如GPT):Decoder层数更重要,通常12-96层
- 翻译任务:Encoder和Decoder都需要,通常6-12层
- 资源受限:从少层开始(4-6层),逐步增加
- 性能优先:根据任务复杂度选择,复杂任务需要更多层
Transformer完整工作流解读
事前科普
- 位置编码[Positional Encoding] 负责顺序
- 多头注意力-Encoder[Multi-Head Self-Attention] 负责依赖建模
- 掩码多头自注意力-Decoder[Masked Multi-Head Self-Attention] 负责因果约束
- 残差连接[Residual Connection] 保证信息不丢
- 层归一化[Layer Normalization] 稳定数值分布
- 前馈神经网络[Feed-Forward Network] 是把 token 向量里不同的语义线索混合成新的语义特征,然后重新映射到 token 的向量空间坐标,使隐藏表示更丰富、更能承载复杂语义。

业务场景
- 假设任务:机器翻译
- 用户输入(源语言):
- I love you
- 模型目标输出(目标语言):
我 爱 你
一、从用户文本到模型可计算的数据
① 分词(tokenization)
输入文本被切成 token(示例):
["I", "love", "you"]
→ [101, 245, 389] (token_id)
这是离散符号 → 数字索引,还没有语义
② Embedding + Position(顺序在这里被“写死”)
对每个 token_id:
token_embedding(token_id) → 语义向量
position_embedding(pos) → 位置信息
两者相加:
x₁ = E("I") + P(1)
x₂ = E("love")+ P(2)
x₃ = E("you") + P(3)
两者相加后可以同时得到:词义和位置信息
X = [x₁, x₂, x₃]
关键点:
- 顺序信息已编码进向量
- 之后所有层都不会再“处理顺序”这个问题
二、Encoder:把“词”变成“全句理解后的记忆”
- Encoder 有 N 层,每一层结构完全一样,只是参数不同。
Encoder 单层工作流(每一层都干这三件事)
③ Multi-Head Self-Attention(无掩码)
对每个位置 i:
h_i = Attention(x_i, x_1, x_2, x_3)
- 含义是:
- “I” 在计算表示时会参考 “love”“you”
- “you” 也会参考 “I”“love”
- 但注意:
- 位置不动
- 第 1 个输出仍然对应第 1 个输入
④ Add & Norm(稳定训练,不改语义逻辑)
x_i = LayerNorm(x_i + h_i)
只做数值稳定,不改变“信息流向”。
⑤ FFN(逐 token 的非线性理解)
x_i = FFN(x_i)
- 作用一句话:
- 把“注意力聚合到的信息”做更深的语义变换
⑥ 重复 N 层后,Encoder 输出
Encoder 输出:
H = [h₁, h₂, h₃]
- 你可以把它理解为:
- 一张“语义记忆表”
- 每一行 = 一个原始位置
- 内容 = 融合了全句上下文的表示
顺序:完全和输入一致
三、Encoder → Decoder 的交接(关键理解点)
- Encoder 不“生成东西”,它只做一件事:
- 把输入句子压缩成一个可被查询的语义 memory
Decoder 之后做的事情,本质是:
不断用“我已经生成的内容”
去查询 Encoder 的 memory
四、Decoder:从 开始“一个词一个词地生成”
⑦ Decoder 的输入起点
Decoder 第一刻输入的是:
<bos>
不是 Encoder 的输出。
⑧ Decoder 单层工作流(这是最关键的)
A. Masked Multi-Head Self-Attention(因果掩码)
输入(第一步):
每一层 Decoder 有 三块核心计算:
<bos>
规则:
当前位置只能看“已经生成的 token”
不能看未来,保证原文顺序
- 目的一句话:
- 在并行计算中,强制遵守从左到右的语言因果顺序
B. Cross-Attention(Decoder ↔ Encoder 交互)
- 这是 Encoder 和 Decoder 唯一真正交互的地方。
计算逻辑:
Query = Decoder 当前状态
Key = Encoder 输出 H
Value = Encoder 输出 H
含义是:“我现在要生成一个词,请帮我从输入句子的所有位置中,找最相关的语义信息。”
C. FFN + Add & Norm
- 和 Encoder 一样:
- 做非线性变换
- 稳定数值
- 不改变信息流规则
⑨ Decoder 输出 logits → 预测 token
Decoder 最后一层输出:
向量 → Linear → Softmax → 概率分布
选概率最高的 token,例如:
预测结果: "我"
五、进入下一步生成(自回归)
把刚生成的 token 拼回输入:
<bos> 我
再走一遍 Decoder:
- Masked Self-Attention(只能看 我)
- Cross-Attention(继续查 Encoder memory)
- 输出下一个词:爱
循环直到:
<eos>
Transformer工作流总结
文本
↓
Tokenize
↓
Embedding + Position
↓
Encoder(N 层)
↓
语义 Memory(顺序不变)
↓
Decoder(从 开始)
- Masked Self-Attention(守因果)
- Cross-Attention(查 memory)
- FFN
↓
Softmax
↓
逐 token 生成输出
认知闭环:
- Encoder:理解输入,不生成
- Decoder:生成输出,不理解输入
- 两者通过 Cross-Attention 精确协作
- 顺序靠 Position Encoding
- 因果靠 Mask
- 并行靠 Attention
更多推荐



所有评论(0)