Transformer架构

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)基础架构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值