Transformer架构核心技术解读

什么是Transformer?

✅ 简单一句话:

Transformer 是一种革命性的序列模型,它用“注意力机制”取代传统循环结构,实现了高效、灵活、强大的自然语言处理能力,是现代 AI 大模型的基石。于处理序列数据(如语言)的深度学习模型,特别擅长机器翻译、文本生成等任务。

🔍 它诞生前的问题:
在 Transformer 出现之前,主流的序列模型是 RNN(循环神经网络)和 LSTM。但它们存在两个严重问题:
训练慢:因为必须按顺序处理每个词(比如先看“这”,再看“是”,再看“一本”……),无法并行计算。
长距离依赖难建模:句子中相隔很远的词之间关系难以捕捉(例如:“他”指代谁?)。
👉 所以,研究人员提出了 Transformer —— 用“注意力机制”代替 RNN,实现并行化 + 更强语义理解能力。

Transformer架构解读

📌 前置认知(重要理解)

在深入Transformer之前,需要理解一个核心概念:

  1. Encoder处理过程中token的变化规律
    • 语义会变化:每个token的向量表示在Encoder各层中持续变化,语义不断丰富和融合
    • 位置不变:token的顺序始终保持不变(第1个token始终在第1个位置,第2个始终在第2个位置)
    • 💡 类比:就像一本书,内容(语义)在不断被理解和丰富,但页码(位置)不会改变

涉及到的几个技术点解读

Encoder-Decoder 框架
在这里插入图片描述

图解:

🔁 整体结构 = Encoder + Decoder

左边是多个 Encoder 层堆叠(输入中文)
右边是多个 Decoder 层堆叠(输出英文)
输入:“这是一本书” → 输出:“This is a book”

✅ 这就是典型的 序列到序列(Seq2Seq)任务,比如机器翻译。

📌 关键点:

  1. 每个 Encoder 和 Decoder 都由多个相同的模块组成(可复制 N 次)
  2. 数据流动方向:输入 → Encoder → Decoder → 输出
  3. 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 同一时间只能关注“一种关系模式”。
  • 但真实语言中,一个词同时需要理解多种关系,例如:

    1. 语法关系(主谓宾)
    2. 语义相似性
    3. 指代关系
    4. 长距离依赖
    5. 修饰关系
      单头做不到并行表达这些关系。

解决什么问题?

允许模型在多个表示子空间中同时捕获不同类型的依赖关系。

核心价值

  • 并行建模:同时关注语法、语义、指代等多种关系
  • 表达丰富:单头只能表达一种关系,多头可以表达多种关系
  • 性能提升:实验证明多头比单头性能更好

用在什么环节?

  1. Encoder:Multi-Head Self-Attention(无因果掩码)

    • Q、K、V都来自Encoder自身
    • 可以看所有位置(包括未来位置)
  2. 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),从而:
    1. 缩短有效梯度传播路径
    2. 保证底层语义表示在高层仍可被直接访问
    3. 提高深层 Transformer 的可训练性与稳定性

应用环节

  • 每一个子层(SubLayer)之后,包括:
    1. Multi-Head Self-Attention 子层
    2. 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),从而:
  1. 稳定训练过程
  2. 提高学习率可用范围
  3. 加快模型收敛

应用环节

  • 紧随残差连接之后,与每一个子层成对出现:
  1. Multi-Head Self-Attention + Residual 后
  2. Position-wise FFN + Residual 后

内部机理

  • 对单个 token 的隐藏向量 x ∈ R^d
μ = mean(x)
σ² = var(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₂

其中:

  1. φ 为非线性激活函数(ReLU / GELU)
  2. 参数在所有 token 位置间共享
  3. 不引入 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 单层结构:

  1. Multi-Head Self-Attention(多头自注意力)

  2. Feed Forward Network(FFN,前馈神经网络)

  3. 残差 + LayerNorm(每个子层后都有)

总结一句话:

  1. Encoder 每加一层,都是在问:
    “在更大的上下文下,我还该不该保持现在这个语义?”

  2. 层数决定“理解能有多深”
    每一层在解决:上下文关系逐步抽象的问题

可以把 Encoder 层理解为 逐层升级的“理解管道”:

🟦 第 1–2 层:局部感知层(Lexical / Surface)

  1. 解决的问题:词形、词性,邻近词搭配,基本位置关系
  2. 向量在学什么?“我是谁”,“我旁边是谁”

🟦 第 3–6 层:句法建模层(Syntactic)

  1. 解决的问题:主谓宾结构,修饰关系,依存关系
  2. 注意力模式开始呈现:树状、对称、结构化

🟦 第 7–10 层:语义整合层(Semantic)

  1. 解决的问题:同义 / 反义、角色对齐(谁做了什么)、句子层意义
  2. 这里开始:token 不再像“词”、而像“语义节点”

🟦 第 11+ 层:全局抽象层(Global / Task-level)

  1. 解决的问题:句子意图、隐含信息、上下文偏好

  2. 此时:多个 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 的信息
⚠️ 到这里为止:

  1. 只发生了信息重组
  2. 没有产生新语义

🔹 Step 5:残差连接(防止失忆)

Z = new + X(l-1)

含义:
在“原我”的基础上,
叠加刚才学到的上下文信息

🔹 Step 6:LayerNorm(稳定尺度)

Z_norm = LayerNorm(Z)

不改语义,只管数值稳定。

🔹 Step 7:FFN(真正的“变形”)

FFN(Z_norm)

直觉:

  1. “在已经知道上下文之后,我应该变成一个什么样的向量?”
  2. 这是语义形态改变发生的地方。

🔹 Step 8:再一次残差 + 归一化

X(l) = LayerNorm(FFN(Z_norm) + Z_norm)
Encoder 每层之间递进的原理

每一层不是加新信息,而是:
在更大的上下文条件下,重算“哪些信息重要”

  • 比如N层逐渐递进:
    1. X(0): 词 + 位置信息
    2. X(1): 融合局部上下文
    3. X(2): 稳定句法关系
    4. X(3): 语义角色对齐
    5. X(N): 全局语义一致表示
      即同一批 token,被反复自引用重构

Encoder 多层:为什么“递进”是必然的?

  • 关键点只有一句:
    下一层看到的不是原始 token,
    而是“已经融合过上下文的 token”。
  • 比如:
    1. 第 1 层:基于原始词
    2. 第 2 层:基于上下文词
    3. 第 3 层:基于语义词

Encoder 的结束层产物是什么?

  1. 一组"上下文充分融合"的向量序列
  2. 它不是:分类结果、预测结果
  3. 而是: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 的一句话总结

  1. Decoder 的每一层,都在重新回答一个问题(重新生成token):
    “在我目前已经说了这些话的前提下,下一步该说什么才最对?”

  2. Decoder

    • 层数决定“生成能有多稳、多准、多有策略”
    • 每一层在解决:下一 token 决策逐步校正的问题

Decoder 每一层的核心目的是什么?

Decoder 的本质任务:掩码机制下(受限约束Mask),一步步生成下一个 token

Decoder 单层结构

  1. Masked Self-Attention(只能看过去)
  2. Cross-Attention(看 Encoder 输出)
  3. FFN
  4. 残差 + LayerNorm

Decoder 分层功能拆解
🟥 低层(1–3 层):语言流畅性

  1. 解决的问题:语法是否通顺、n-gram 连贯、常见搭配
  2. 没有这些层:文本会像“语法错误的马尔可夫链”

🟥 中层(4–8 层):语义一致性

  1. 解决的问题:是否偏题、是否自相矛盾、是否遵守上下文设定
  2. 这里开始:生成开始“像是在思考”

🟥 高层(9+ 层):意图与策略

  1. 解决的问题:回答风格、任务完成度、隐含目标(说服 / 解释 / 总结)
  2. 此处: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(只看过去)

  1. 流程与 Encoder 完全一样,唯一差别:score 中加入 mask未来位置直接不可见(多了掩码机制)

  2. 作用:保证“我只能基于已经说过的内容思考”

🔸 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层递进关系
  • 每一层都在重新评估:
    “我到底该生成什么?”
  • 递进路径:
    1. Y(1): 语言合法
    2. Y(2): 语义不偏
    3. Y(3): 条件对齐
    4. Y(4): 意图清晰
    5. Y(M): 决策稳定
Encoder和Decoder的工作流关联

在这里插入图片描述

✅ 左边:Encoder(编码器)—— “读懂句子”
输入:词嵌入 + 位置编码(知道顺序)
每层包含:

  1. Self-Attention:让每个词关注其他词(比如“Thinking”和“Machines”互相关联)

  2. Feed Forward:对每个词单独加工

  3. Add & Normalize:残差连接 + 归一化 → 保留信息,防止训练崩溃

  4. 堆叠多层(图中是2层),逐步提取语义

  5. ✅ 输出:一个富含上下文的向量表示(即“这句话的意思”)

✅ 右边:Decoder(解码器)—— “生成翻译”
输入:目标语言的已生成部分(如“Machines”)
每层包含三步:

  1. Self-Attention:只能看前面已生成的词(防偷看未来)
  2. Encoder-Decoder Attention:看 Encoder 的输出 → 找对应原文词
    3 . Feed Forward + Add & Normalize
    最后通过 Linear + Softmax 得到下一个词的概率分布
  3. ✅ 输出:逐词生成目标语言(如“I think machines…”)

✅ 总结一句话

Transformer = Encoder 看懂 → Decoder 生成,靠"注意力"找关系,靠"残差"保稳定,靠"Cross-Attention"连接两者,最终实现智能翻译或生成。

💡 核心工作流程

  1. Encoder阶段:一次性处理整个输入序列,生成"语义记忆库"
  2. 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]

含义非常明确:

  1. 每个 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 中与当前生成最相关的信息组合

注意:

  1. Encoder 不参与计算
  2. Encoder 不改变自身
  3. 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。

记住

  1. 一句话总结 Encoder ↔ Decoder 的互动关系
  2. Encoder 负责把输入变成“可被查询的语义记忆”;
  3. Decoder 在每一步生成时,用自身状态作为 Query,
    主动从 Encoder 中检索所需信息。

是否与 Encoder 交互[单项依赖]

  1. Encoder:完全不关心 Decoder
  2. Decoder:高度依赖 Encoder

关系比喻

  1. Encoder = 整理资料的人
  2. Decoder = 写答案的人
  3. Cross-Attention = 查资料

更工程一点:

  1. Encoder = 只读语义内存
  2. Decoder = 自回归控制器

❌ 错误理解:
Decoder 是“拿 Encoder 输出直接生成文本”
✅ 正确理解:
Decoder 是“在已有输出历史的基础上,
反复向 Encoder 查询条件信息来做决策”

核心概念

  1. Encoder 提供的是"语义空间"(理解输入,生成可查询的记忆)
  2. Decoder 提供的是"时间与顺序"(按顺序生成输出)
  3. 生成永远由 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完整工作流解读

事前科普

  1. 位置编码[Positional Encoding] 负责顺序
  2. 多头注意力-Encoder[Multi-Head Self-Attention] 负责依赖建模
  3. 掩码多头自注意力-Decoder[Masked Multi-Head Self-Attention] 负责因果约束
  4. 残差连接[Residual Connection] 保证信息不丢
  5. 层归一化[Layer Normalization] 稳定数值分布
  6. 前馈神经网络[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₃]

关键点:

  1. 顺序信息已编码进向量
  2. 之后所有层都不会再“处理顺序”这个问题
二、Encoder:把“词”变成“全句理解后的记忆”
  • Encoder 有 N 层,每一层结构完全一样,只是参数不同。

Encoder 单层工作流(每一层都干这三件事)

③ Multi-Head Self-Attention(无掩码)

对每个位置 i:

h_i = Attention(x_i, x_1, x_2, x_3)
  • 含义是:
    1. “I” 在计算表示时会参考 “love”“you”
    2. “you” 也会参考 “I”“love”
  • 但注意:
  1. 位置不动
  2. 第 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₃]
  • 你可以把它理解为:
    1. 一张“语义记忆表”
    2. 每一行 = 一个原始位置
    3. 内容 = 融合了全句上下文的表示

顺序:完全和输入一致

三、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 一样:
    1. 做非线性变换
    2. 稳定数值
    3. 不改变信息流规则

⑨ Decoder 输出 logits → 预测 token

Decoder 最后一层输出:

向量 → Linear → Softmax → 概率分布

选概率最高的 token,例如:

预测结果: "我"
五、进入下一步生成(自回归)

把刚生成的 token 拼回输入:

<bos> 我

再走一遍 Decoder:

  1. Masked Self-Attention(只能看 我)
  2. Cross-Attention(继续查 Encoder memory)
  3. 输出下一个词:爱
    循环直到:
<eos>
Transformer工作流总结

文本

Tokenize

Embedding + Position

Encoder(N 层)

语义 Memory(顺序不变)

Decoder(从 开始)

  • Masked Self-Attention(守因果)
  • Cross-Attention(查 memory)
  • FFN

    Softmax

    逐 token 生成输出
认知闭环:
  1. Encoder:理解输入,不生成
  2. Decoder:生成输出,不理解输入
  3. 两者通过 Cross-Attention 精确协作
  4. 顺序靠 Position Encoding
  5. 因果靠 Mask
  6. 并行靠 Attention
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐