Transformer 逻辑图
✅ 总览
一个完整的 Transformer 模型 = 编码器(Encoder)+ 解码器(Decoder),其目标是将一个序列作为输入,输出另一个序列。每个部分都由多个“层(Layer)”堆叠而成,每层结构类似。
🔷 Transformer 总体结构
【输入序列】
↓
【Embedding(词嵌入)】
↓
【加上位置编码(Positional Encoding)】
↓
【编码器(Encoder)模块 × N 层堆叠】
↓
┌──────────────────────────────────────┐
│每层包含: │
│ │
│1. 多头自注意力机制(Multi-head Self Attention) │
│ → 用 Q、K、V 计算相关性: │
│ ATTENTION(Q,K,V) = softmax(Q·Kᵀ / √dₖ)·V │
│ → 多个头并行拼接(Concat) │
│ │
│2. 残差连接 + 层归一化: │
│ LayerNorm(x + Sublayer(x)) │
│ │
│3. 前馈神经网络(Feed Forward Network) │
│ → FFN(x) = max(0, xW₁ + b₁)W₂ + b₂ │
│ │
│4. 残差连接 + 层归一化(同上) │
└──────────────────────────────────────┘
↓
【编码器输出序列】
↓
【解码器(Decoder)模块 × N 层堆叠】
↓
┌────────────────────────────────────────────────────┐
│每层包含: │
│ │
│1. Masked 多头自注意力(防止看到未来 token) │
│ → 掩码未来词,使注意力权重为 -∞ │
│ │
│2. 编码器-解码器注意力层(Encoder-Decoder Attention) │
│ → 使用编码器输出为 Key 和 Value,与解码器当前 Query 做注意力 │
│ │
│3. 残差连接 + 层归一化 │
│ │
│4. 前馈神经网络(与编码器相同) │
│ │
│5. 残差连接 + 层归一化 │
└────────────────────────────────────────────────────┘
↓
【解码器输出序列(每个位置生成一个 token)】
↓
【Linear 全连接层 + Softmax】
↓
【输出词概率分布】
↓
【选择最大概率词 → 输出】
🧠 编码器结构(Encoder Layer)
一个编码器层由三个部分组成:
输入向量(如“我 是 学生”)
↓
1️⃣ 多头自注意力(Multi-Head Self-Attention)
↓
➕ 残差连接 + LayerNorm(归一化)
↓
2️⃣ 前馈全连接网络(Feed-Forward Network)
↓
➕ 残差连接 + LayerNorm
↓
输出(作为下一层 Encoder 的输入)
每层重复以上结构 N 次(如6层、12层等)
🔁 解码器结构(Decoder Layer)
每层Decoder稍复杂,包含三个子模块:
输入向量(例如翻译生成中的“Je suis...”)
↓
1️⃣ 掩码自注意力(Masked Multi-Head Self-Attention)
↓
➕ 残差连接 + LayerNorm
↓
2️⃣ 编码器-解码器注意力(Encoder-Decoder Attention)
↓(输入来自编码器输出)
➕ 残差连接 + LayerNorm
↓
3️⃣ 前馈网络(Feed-Forward Network)
↓
➕ 残差连接 + LayerNorm
↓
输出向量
💡 注意力机制(Self-Attention)
注意力计算步骤如下:
输入向量 X
↓
线性变换生成 Q(查询)、K(键)、V(值)矩阵:
Q = XWq
K = XWk
V = XWv
↓
计算注意力权重:
scores = Q × Kᵀ / √d_k
↓
Softmax 归一化:
attention_weights = softmax(scores)
↓
输出 = attention_weights × V
多个头(head)并行执行,拼接后送入线性层。
🔄 多头注意力(Multi-Head Attention)
为什么要多头?每个注意力头专注于不同位置或关系:
多个 Q/K/V → 多组注意力计算 → 拼接 → 线性投影 → 输出
例如:
head_1:看主语
head_2:看动词
head_3:看句末结构
📏 位置编码(Positional Encoding)
Transformer本身不具备顺序概念,需要加位置信息:
- 使用正弦 + 余弦函数生成不同频率的位置向量
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
或使用:
- Learnable Position Embedding(可学习的)
- Rotary Position Embedding(旋转位置编码,RoPE)
一.Transformer 中的归一化层(Norm)& 残差连接(Residual Connection)
【Transformer 中为何引入 Norm 与 Residual?】
↓
【解决深层网络的训练问题】
↓
【1. Layer Normalization(层归一化)】
↓
✅ 定义:对每个样本自身进行归一化(而不是跨 batch)
↓
✅ 优点:
→ 减少内部协变量偏移(稳定训练)
→ 加速收敛
→ 便于深层网络保持梯度
↓
✅ 归一化步骤:
→ 计算均值 μ、方差 σ²(基于每一行)
→ 标准化:x̂ = (x - μ) / √(σ² + ε)
→ 加上可学习缩放 γ 与平移 β:y = γ·x̂ + β
↓
✅ 应用位置:
→ 每个子层后 + 残差连接:`Norm(x + Sublayer(x))`
→ 两处使用:① 自注意力后;② 前馈网络后
【为什么不用 Batch Norm?】
↓
BatchNorm 的局限:
→ 依赖于 batch 规模,序列不等长时不稳定
→ 推理阶段需要统计均值/方差
→ 对文本数据不直观
↓
LayerNorm 的优势:
→ 单样本归一化,适配变长序列
→ 推理阶段行为一致
→ 更贴合 NLP 的处理逻辑
【2. Residual Connection(残差连接)】
↓
✅ 目的:
→ 避免深层网络中梯度消失
→ 允许模型学习“恒等映射”
→ 提升信息流动与训练稳定性
↓
✅ 使用方式:
→ 对子层输入 x 和输出 F(x) 做相加:`x + F(x)`
→ 再进行 LayerNorm:`LayerNorm(x + F(x))`
【3. RMSNorm(RMS 归一化)】
↓
✅ 定义:不计算均值和方差,只用输入的均方根进行归一化
↓
✅ 步骤:
→ RMS(x) = √(Σxᵢ² / d)
→ x̂ = x / (RMS(x) + ε)
→ y = γ·x̂ + β
↓
✅ 相比 LayerNorm:
→ 计算更高效(不求均值和方差)
→ 不平滑小特征
→ 更适合深层模型、高维表示
【对比:LayerNorm vs RMSNorm】
↓
📌 LayerNorm:
→ 考虑均值 + 方差,适合标准 NLP 任务
→ 稳定性强,但计算更复杂
📌 RMSNorm:
→ 不考虑均值,只归一化幅值
→ 更快、更节省,适合 LLaMA 等深模型
【4. Pre-Norm vs Post-Norm 架构】
↓
✅ Pre-Norm(规范化放前面):
→ Norm → Attention/FFN → + 残差
→ 优点:稳定梯度,适合深模型
✅ Post-Norm(规范化放后面):
→ Attention/FFN → + 残差 → Norm
→ 优点:收敛速度快,适合浅模型
【5. 激活函数】
↓
✅ ReLU(原始 Transformer):
→ 简单高效:max(0, x)
→ 非线性增强,避免梯度消失
↓
✅ GELU(BERT、T5 等):
→ 平滑近似激活:结合线性与非线性
→ 表现更好,适合深模型
↓
📌 GELU ≈ x·Φ(x) ≈ 0.5·x·(1 + tanh(√(2/π)(x + 0.044715x³)))
【6. 权重共享(Parameter Sharing)】
↓
✅ 嵌入层共享:
→ 输入 Embedding 与输出 Softmax 权重共享
→ 降低参数量,语义空间一致
✅ 自注意力层共享:
→ Decoder 中的两类注意力头(自注意力、交叉注意力)可共享权重(某些实现)
✅ LayerNorm 可结构一致:
→ 虽非硬性共享,但常使用类似参数
✅ FFN 层共享(部分变体):
→ 在所有层中共用 FFN 子网络,减少参数
🧠 总结提示(小白友好):
- Transformer 模型设计中的每一项归一化/残差/激活机制,都是为了解决训练难、层数深、模型收敛慢、梯度不稳定的问题。
- 每一个设计(如 Pre-Norm、RMSNorm、权重共享)背后都有特定的适用场景和效率-效果权衡。
二、注意力机制和 Multi-Head Self-Attention
【输入序列 X】
↓
【通过 3 个线性变换矩阵(Wq, Wk, Wv)生成】
→ Q(查询)
→ K(键)
→ V(值)
【计算注意力步骤(Self-Attention)】
↓
1️⃣ Q × Kᵀ → 得到每个词与其他词的相关性(相似度)
↓
2️⃣ 除以 √dk → 防止点积过大造成梯度过小(数值稳定)
↓
3️⃣ Softmax → 得到每个词与其它词的注意力权重(归一化)
↓
4️⃣ 权重 × V → 加权求和,输出新的向量表示(每个词聚合上下文)
———————————————————————————————
【多头注意力机制(Multi-Head Attention)】
↓
每个头使用不同的:
→ Wqᵢ,Wkᵢ,Wvᵢ → 得到不同的 Qᵢ, Kᵢ, Vᵢ
↓
每个头分别做 Self-Attention:
→ headi = Attention(Qᵢ, Kᵢ, Vᵢ)
↓
将所有 headi 拼接:Concat(head₁, …, headh)
↓
通过线性层投影输出:MultiHead(Q,K,V) = Concat(…)·Wo
———————————————————————————————
【Q/K/V 各自作用和不能共用权重的原因】
↓
→ Q:查询“我应该关注谁?”
→ K:提供其他词的“特征描述”
→ V:表示被关注词的“实际信息”
↓
不能共用权重原因:
→ 功能差异导致表达不同
→ 若共享,会使注意力失效,表达能力下降
———————————————————————————————
【为什么点积除以 √dk?】
↓
→ 点积值随维度 dk 增加而增大
→ 若不缩放,Softmax 输出将过于极端(梯度爆炸或消失)
→ 理论上点积 ∝ √dk,除以 √dk 保持值稳定
———————————————————————————————
【为什么注意力机制用点乘不用加法?】
↓
✅ 计算效率:矩阵乘法更快(适合并行)
✅ 向量特性:点乘反映向量相似度(角度越小,值越大)
✅ Softmax归一化后可得权重
✅ 数值更稳定:避免加法带来的不稳定变化
———————————————————————————————
【多头注意力机制的优势】
↓
✅ 捕捉不同特征 → 每个头从不同角度看输入
✅ 上下文整合增强 → 每个头关注不同位置
✅ 并行计算 → 加速训练
✅ 弥补单头局限 → 表示更丰富
✅ 表达能力增强 → 参数多、结构复杂
———————————————————————————————
【代码实现核心流程】
↓
→ 输入 x ∈ (batch, seq_len, embed_size)
↓
→ 分别通过 Q/K/V 线性变换,调整为:
→ (batch, heads, seq_len, head_dim)
↓
→ attention = Softmax(Q × Kᵀ / √dk)
↓
→ out = attention × V
↓
→ reshape 拼接,最终通过全连接输出层 → 得到 Multi-Head 输出
三、位置编码(原理、RoPE、长序列扩展) 以及 Transformer优化方法(性能问题与改进
🔁 2. 位置编码 & 长序列处理逻辑图(文字箭头版)
【Transformer 无序列感知能力】
↓
【引入位置编码 → 赋予词语顺序】
↓
【经典位置编码方式:正弦和余弦函数】
→ 公式:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
↓
【优点】:
→ 能捕捉词之间的相对位置信息
→ 可扩展到任意长度的序列
🔄 2.1.1.1 LLaMA 使用 RoPE 的原因
【RoPE:旋转位置编码】
↓
1. 保持序列关系 → 直接嵌入 Q/K 中
2. 平滑扩展 → 可处理比训练更长的序列
3. 实现简单 → 无需额外参数,兼容原 attention
4. 性能更强 → 泛化性更好,实验效果更优
📏 2.1.1.2 针对长序列的改进型位置编码方法
【面对长序列 → 经典正弦编码可能失效】
↓
【可选方案】:
↓
a. 固定位置编码(正弦/余弦)
→ 改频率、加权重 → 扩展能力提升
b. 可学习的位置编码
→ 参数训练得出 → 适配任务语境更强
c. 相对位置编码
→ 基于相对距离 → 强上下文捕捉能力
d. 层次化位置编码
→ 拆块编码 → 控制复杂度
e. 动态位置编码
→ 输入时实时生成 → 应对多变输入长度
f. 位置索引(Position ID)
→ 作为额外输入 → 让模型显式感知“第几位”
⚙️ 3.1.1.1 Transformer 长序列处理瓶颈与优化方案
【问题】:
→ 自注意力复杂度为 O(n²) → 长序列计算/内存爆炸
【优化方向】:
↓
1️⃣ 稀疏注意力机制:
→ Linformer:低秩投影
→ Reformer:局部敏感哈希
→ Longformer:窗口式 + 全局 token 混合
2️⃣ 分块策略:
→ Chunk 处理:分组交叉注意
→ Sliding Window:只关注邻域
3️⃣ 架构改造:
→ Performer:核方法近似注意力
→ Synthesizer:权重由网络生成(非点积)
4️⃣ 训练级优化:
→ Gradient Checkpointing:内存换时间
→ Reduced Precision(FP16):节省显存
→ 序列池化:聚合关键信息降低长度
🔧 3.1.1.2 Transformer 改进算法与训练经验总结
【模型结构优化】
↓
→ 多头注意力:多角度关注不同信息
→ 稀疏注意力:提升长文本效率
→ 相对位置编码:增强依赖捕捉能力
【结构级增强】
↓
→ Transformer-XL:跨段上下文连接
→ 更深/更广网络结构:提升表达能力
【训练技巧】
↓
→ 学习率调度(warm-up + 衰减)
→ 梯度累积:提升 batch size 训练稳定性
【正则化 & 内存优化】
↓
→ Dropout + LayerNorm
→ 混合精度(FP16)提升速度减少内存
【迁移学习】
↓
→ 大模型预训练 → 微调
→ 领域数据适配(领域适应)
【模型压缩】
↓
→ 模型剪枝:去冗余
→ 权重量化:INT8/FLOAT16 加速推理
【知识迁移】
↓
→ 知识蒸馏:大模型 → 小模型压缩迁移
【多模态 & 自监督】
↓
→ 自监督:BERT/GPT 预训练方式
→ 多模态:图文结合处理多类型数据
四、Transformer 与 RNN/LSTM、Seq2Seq 模型在架构、性能、机制、适用性等方面的全方位比较
🔁 4. 对比分析
🧠 4.1 Transformer vs RNN / LSTM
【传统序列模型:RNN / LSTM】
↓
【存在问题】
→ 顺序依赖 → 无法并行
→ 长距离依赖捕捉困难 → 梯度消失/爆炸
↓
【改进目标:并行化 + 长依赖建模】
↓
【Transformer】
↓
1️⃣ 并行计算能力
RNN/LSTM:每步依赖前一步,无法并行
Transformer:Self-Attention 可并行 → 提升训练效率
2️⃣ 长距离依赖能力
RNN/LSTM:依赖门控结构,效果有限
Transformer:直接建模任意位置 → 全局依赖建模更强
3️⃣ 建模灵活性
RNN/LSTM:逐步处理,捕捉范围受限
Transformer:任意位置两两交互 → 高表达力
🔄 4.2 Transformer vs Seq2Seq(编码器-解码器)
【传统编码器-解码器:Seq2Seq】
↓
【结构】:
→ 编码器:LSTM / BiLSTM
→ 解码器:LSTM + Attention
→ 局限性:信息压缩(仅传最后一个Context向量)
【演进】
↓
Seq2Seq + Attention(2015)
↓
Transformer(2017)→ 全Attention替代RNN
↓
Transformer-XL / Reformer(2019+)
↓
大模型(GPT-3、PaLM 等)
【代表模型】
↓
GNMT:Seq2Seq + Attention → WMT 优秀
BERT:Transformer Encoder(MLM)
GPT:Transformer Decoder(自回归生成)
⚙️ 架构对比:结构、注意力、训练策略
1️⃣ 模型结构
→ 编码器:
Seq2Seq:RNN → Context Vector
Transformer:多层自注意力 → 全局表示
→ 解码器:
Seq2Seq:RNN 依赖前一时刻 + 上下文
Transformer:自注意 + 交叉注意
→ 信息流机制:
Seq2Seq:仅传最后输出 → 信息瓶颈
Transformer:传全体位置输出 → 无瓶颈
2️⃣ 注意力机制
→ Seq2Seq:仅解码器用 Attention
→ Transformer:
编码器:自注意力
解码器:Masked 自注意 + 编解交叉注意
→ 注意力计算:
Seq2Seq:基于隐状态
Transformer:点积注意力(softmax(Q·Kᵀ/√dk)·V)
3️⃣ 训练与效率
→ 并行性:
Seq2Seq:顺序 → 慢
Transformer:并行 → 快
→ 显存:
Transformer 高(O(n²))
→ 梯度传播:
Transformer 稳定(残差 + LayerNorm)
→ 位置信息:
Seq2Seq:隐式(时间步)
Transformer:显式(位置编码)
⚖️ 总结对比:优劣势与使用建议
【优缺点总览】
→ Seq2Seq:
✔️ 结构简单、可流式解码、适合短文本
❌ 无法并行、信息瓶颈、难处理长序列
→ Transformer:
✔️ 并行强、高表达、适合长依赖、多模态
❌ O(n²) 显存消耗、自回归推理慢
【适用场景推荐】
→ 短文本翻译:
Seq2Seq 可用,Transformer 更强
→ 长文本生成:
Transformer 更优(自注意捕捉全局依赖)
→ 实时推理:
Seq2Seq 单步解码快
→ 多模态任务:
Transformer 可灵活适配(图像、语音等)
【结论】
Transformer = 并行 + 长依赖 + 强表达
成为大模型时代(GPT、T5、BERT)基础架构