Transformer十问
一、Transformer如何解决梯度消失/爆炸问题
通过两个关键技术:
残差连接(Residual Connection):
层归一化(Layer Normalization):对单样本所有特征维度归一化。
二、Transformer的主要缺陷是什么?
计算复杂度:自注意力对序列长度L的时间复杂度为O(L²),长序列处理代价高(如10k+ tokens)。
内存占用:存储注意力矩阵需O(L²)空间,限制批处理大小。
三、Transformer如何催生了预训练语音模型(如BERT、GPT)?
- Encoder派系(理解任务):
BERT:基于Transformer编码器,通过MLM+Next Sentence Prediction预训练。
- Decoder派系(生成任务):
- GPT系列:基于Transformer解码器,使用自回归语言建模预训练。
四、Transformer注意力机制公式为什么除以一个缩放因子
- 问题根源:点积的方差膨胀
假设 Query(Q
)和 Key(K
)向量是维度为 的独立随机向量,每个分量均值为 0、方差为 1。
点积结果 的方差:
若和
独立,则
结论:点积结果的方差随线性增长。
- 方差过大的危害:Softmax 梯度消失
注意力权重通过 Softmax 计算:
当 的值极大时:
Softmax 会将大部分概率集中在少数几个元素上(接近 one-hot 分布)。
梯度问题:
Softmax 在接近 one-hot 时梯度接近 0 → 反向传播时梯度消失,模型难以更新参数!
示例:
若,点积结果的标准差
。输入 Softmax 的值在 [-8, 8] 波动 → 极端值概率接近 1 或 0 → 梯度消失。
- 缩放因子的作用:稳定方差
通过除以缩放点积结果:
缩放后的方差:
效果:将点积结果的方差控制为 1 → 输入 Softmax 的值保持稳定范围 → 避免梯度消失!
五、前馈神经网络(FFN)为什么用两层线性层+激活函数?
结构公式:
(原论文
)
设计意图:
第一层
将维度扩大4倍→增强非线性表示能力
ReLU激活引入稀疏性
第二层
投影回原始维度→防止信息膨
参数量占比:FFN占Encoder总参数量的70%(远大于注意力层)。
六、层归一化(LayerNorm)和残差连接(Residual Connection)在 Transformer 中出现的顺序有两种主流设计(Pre-Norm 和 Post-Norm),它们有何区别?各自优劣是什么?
Post-Norm(原始论文设计):
输出 = LayerNorm(x + Sublayer(x))
即残差连接放在内部,归一化放在最外层。
缺点: 在训练非常深的模型(如12层以上)时,梯度容易不稳定,导致训练困难,甚至需要精细的学习率热身(Warm-up)策略。
Pre-Norm(现在更常用):
输出 = x + Sublayer(LayerNorm(x))
即先对输入进行归一化,再执行子层操作,最后加上残差。
优点: 训练过程更加稳定,允许训练极深的模型(如100层),通常可以移除或减少 Warm-up 步骤。因为梯度可以直接通过恒等路径(Identity Path)回传,缓解了梯度消失问题。
潜在缺点: 有研究表明 Pre-Norm 的最终性能可能略低于训练成功的 Post-Norm,但其稳定的优点使其成为当今大模型(如 GPT、LLaMA)的默认选择。
七、现代大型语言模型(LLMs)普遍只使用解码器(Decoder-Only)架构,而非完整的编码器-解码器架构。为什么?
这源于任务范式的转变和架构的简洁性优势。
统一的任务范式: LLMs 的核心范式是自回归语言建模(根据上文预测下一个词)。这是一个纯生成任务,解码器架构天生就是为此设计的。而编码器-解码器架构是为“序列到序列”(Seq2Seq)任务设计的,其中间有一个“编码”和“解码”的明确分离,比如翻译和摘要。
架构简洁性与效率: 只使用解码器架构更简单、参数更统一。训练时,只需要一套权重进行语言模型预训练,非常高效。而 Encoder-Decoder 结构有两套参数,可能更复杂。
涌现的通用能力: 研究发现,当解码器模型的规模足够大时,通过提示(Prompting)或指令微调(Instruction Tuning),它能够隐式地学会理解、分类、推理等传统上需要“编码”能力的任务,而无需显式的编码器。它通过生成答案的方式来“解决”各种任务。
成功的实践验证: GPT 系列的成功雄辩地证明了纯解码器架构在 scaling law 下的巨大潜力,使其成为了当前 LLM 的主流选择。T5 这种编码器-解码器架构更像是一个“多任务统一器”,但在通用能力上被证明不如纯解码器架构强大。
八、自注意力机制的计算复杂度为何是 Transformer 处理长序列的核心瓶颈?有哪些主流技术能有效降低其复杂度?
自注意力机制的复杂度瓶颈源于其全局依赖建模的方式,而降低复杂度的核心思路是 “减少无效注意力计算” 或 “用低成本方式近似全局注意力”。
(1)复杂度瓶颈的根源
自注意力对序列中每一个 token(如文本的词、图像的 patch)都需计算与其他所有 token 的注意力权重,其时间复杂度为 O(n²·d)(n 为序列长度,d 为 token 的特征维度):
- 第一步 “Q・Kᵀ”(计算注意力得分):复杂度 O (n²・d)(Q/K 均为 n×d 矩阵,相乘后得到 n×n 的注意力矩阵);
- 第二步 “softmax+Q・V”(权重归一化与特征加权):复杂度同样为 O (n²・d)。
当 n 极大(如文本序列 n=10000、医学影像 patch 数 n=20000)时,n² 的增长会导致计算量和显存占用呈指数级上升,直接超出硬件承载能力。
(2)主流降复杂度技术
技术类型 | 核心原理 | 典型案例 | 复杂度优化效果 |
---|---|---|---|
稀疏注意力 | 仅计算 token 与 “关键邻居” 的注意力(而非全局) | Longformer(滑动窗口 + 全局稀疏) | 降至 O (n・d・w)(w 为窗口大小) |
线性注意力 | 用核函数(如随机投影)近似 Q・Kᵀ,避免 n² 计算 | Performer(正定性核近似) | 降至 O (n・d・log n) |
分层注意力 | 将长序列拆分为小段,先局部建模再全局聚合 | Transformer-XL(段级循环) | 降至 O (n・d) |
注意力蒸馏 | 用小模型学习大模型的注意力分布,缩减参数 | DistilBERT(保留 60% 参数) | 复杂度降低 40%+ |
九、Transformer 在小样本学习(Few-shot Learning)中面临 “参数冗余” 与 “数据依赖” 的双重挑战 —— 模型参数上亿但训练数据仅数十条,当前参数高效微调(PEFT)技术如何在保留预训练知识的同时,用少量数据适配下游任务?
传统全量微调(Fine-tuning)需更新 Transformer 所有参数,在小样本下易过拟合;PEFT 的核心是 “冻结大部分预训练参数,仅微调少量参数”,通过 “参数高效” 实现知识迁移,主流方案分为三类:
(1)前缀微调(Prefix Tuning)
- 设计逻辑:在输入序列前插入一段 “可学习的前缀 token”(如 10-50 个虚拟 token),冻结 Transformer 主体参数,仅训练前缀 token 的嵌入向量。
- 核心原理:前缀 token 可视为 “任务专属提示”,通过学习前缀,模型可在不改变主体结构的情况下,将预训练知识适配到新任务(如用前缀 “情感分析:” 引导模型判断文本情感)。
- 优势:参数增量极小(仅前缀嵌入,约 10k-100k 参数),适合多任务场景(不同任务用不同前缀,共享主体模型)。
(2)适配器微调(Adapter Tuning)
- 设计逻辑:在 Transformer 的每一层(如自注意力后、Feed-Forward 后)插入 “小型适配器模块”(如 Down-project→Activation→Up-project,维度从 d 降至 d/r,r 为压缩比),冻结主体参数,仅训练适配器。
- 核心原理:适配器通过 “低维瓶颈” 学习任务专属特征,既能捕捉任务差异,又避免参数过多导致过拟合(如 r=16 时,适配器参数仅占主体的 1%-2%)。
- 代表变体:LoRA(Low-Rank Adaptation),将适配器的权重矩阵分解为两个低秩矩阵(A×B,维度 d×r + r×d),进一步减少参数,被 ChatGPT、Stable Diffusion 广泛用于微调。
(3)提示微调(Prompt Tuning)
- 设计逻辑:与前缀微调类似,但将 “可学习提示” 插入文本序列中(而非前缀),或直接优化 “离散提示模板”(如 “这篇文章的情感是 [正面 / 负面],因为它提到了 [MASK]”),仅训练提示相关参数。
- 核心原理:通过优化提示,让模型利用预训练阶段的 “补全能力”(如 MLM)完成下游任务,无需调整模型主体,适合自然语言理解任务(如文本分类、NER)。
十、transformer的实现代码
将专门写一篇博客进行讲解。