上海网站建设与设计公司好交换友情链接的注意事项
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 = XWqK = XWkV = 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 VectorTransformer:多层自注意力 → 全局表示
→ 解码器: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)基础架构