目录
- [1. 请介绍 Transformer 的结构组成、各部分作用及底层原理。](#1. 请介绍 Transformer 的结构组成、各部分作用及底层原理。)
- [2. Transformer 的 forward 计算包含哪些部件?非线性由什么提供?](#2. Transformer 的 forward 计算包含哪些部件?非线性由什么提供?)
- [Forward 流程(以 Encoder 为例)](#Forward 流程(以 Encoder 为例))
- 非线性来源
- [3. Transformer 为什么能替代 RNN?核心优势是什么?](#3. Transformer 为什么能替代 RNN?核心优势是什么?)
- [RNN 的致命缺陷](#RNN 的致命缺陷)
- [Transformer 的核心优势](#Transformer 的核心优势)
- [4. 详细介绍 Self-Attention 机制,包括本质、数学解释、具体计算步骤,及时间复杂度。](#4. 详细介绍 Self-Attention 机制,包括本质、数学解释、具体计算步骤,及时间复杂度。)
- [5. 为什么要用 Multi-Head Attention?切分为多头的作用是什么?](#5. 为什么要用 Multi-Head Attention?切分为多头的作用是什么?)
- [6. 计算 Attention 的 Softmax 之前为什么要除以根号 \(d_k\)?](#6. 计算 Attention 的 Softmax 之前为什么要除以根号 d_k?)
- [7. 介绍一下 Transformer 的位置编码(Positional Encoding),还了解其他位置编码吗?](#7. 介绍一下 Transformer 的位置编码(Positional Encoding),还了解其他位置编码吗?)
- [原始方案:Sinusoidal Positional Encoding](#原始方案:Sinusoidal Positional Encoding)
- 其他主流方案
- [现代趋势(LLM 时代)](#现代趋势(LLM 时代))
- [8. 介绍 QKV 的计算。如果在 Transformer 中去掉 K,变成 QQV,会有什么问题?(仅考虑编码器内部)](#8. 介绍 QKV 的计算。如果在 Transformer 中去掉 K,变成 QQV,会有什么问题?(仅考虑编码器内部))
- [QKV 计算详解](#QKV 计算详解)
- [如果去掉 K,变成 QQV(仅考虑 Encoder 内部)](#如果去掉 K,变成 QQV(仅考虑 Encoder 内部))
- [9. Transformer 是 Encoder-Decoder 架构,而 GPT 是 Decoder-only 架构,为什么会演变成这种形式?为什么生成式任务(如 GPT)通常舍弃 Encoder?](#9. Transformer 是 Encoder-Decoder 架构,而 GPT 是 Decoder-only 架构,为什么会演变成这种形式?为什么生成式任务(如 GPT)通常舍弃 Encoder?)
- 历史演变
- [为什么生成任务舍弃 Encoder?](#为什么生成任务舍弃 Encoder?)
- [为什么保留 Encoder 的场景?](#为什么保留 Encoder 的场景?)
- [10. Transformer 的 FFN 层为什么会逐渐演变成 MOE 层?](#10. Transformer 的 FFN 层为什么会逐渐演变成 MOE 层?)
- [11. MOE 层的负载均衡具体是怎么做的?偏置项 b 是怎么训练的?如何保证偏置项得到变换?](#11. MOE 层的负载均衡具体是怎么做的?偏置项 b 是怎么训练的?如何保证偏置项得到变换?)
- [12. 如何降低 Transformer 的计算复杂度?常见的稀疏注意力变体有哪些?](#12. 如何降低 Transformer 的计算复杂度?常见的稀疏注意力变体有哪些?)
- [13. 分析一下 Transformer 训练过程中显存占用和计算复杂度。](#13. 分析一下 Transformer 训练过程中显存占用和计算复杂度。)
- [14. Self-Attention 机制在多模态对齐上是否存在瓶颈?有没有实际场景里注意力权重完全偏掉的情况?](#14. Self-Attention 机制在多模态对齐上是否存在瓶颈?有没有实际场景里注意力权重完全偏掉的情况?)
- 多模态对齐的瓶颈
- [实际场景:注意力权重完全偏掉的案例(不确定是不是 LLM 生成的幻觉)](#实际场景:注意力权重完全偏掉的案例(不确定是不是 LLM 生成的幻觉))
- [15. 如何解决梯度消失和梯度爆炸问题?](#15. 如何解决梯度消失和梯度爆炸问题?)
- [梯度消失(Vanishing Gradient)](#梯度消失(Vanishing Gradient))
- [梯度爆炸(Exploding Gradient)](#梯度爆炸(Exploding Gradient))
- [Transformer 中的具体实践](#Transformer 中的具体实践)
- [16. 介绍一下 LayerNorm 和 BatchNorm 的区别?](#16. 介绍一下 LayerNorm 和 BatchNorm 的区别?)
- [17. 在 Agent 多轮对话任务中,Attention 的局限性体现在哪些方面?](#17. 在 Agent 多轮对话任务中,Attention 的局限性体现在哪些方面?)
- 面试背诵要点速查(供参考)
1. 请介绍 Transformer 的结构组成、各部分作用及底层原理。
参考博客:
结构组成 :Transformer 最初是为序列到序列(Seq2Seq)任务设计的,遵循**编码器-解码器(Encoder-Decoder)**架构。
- 输入部分 :包括输入嵌入(Input Embedding) 和位置编码(Positional Encoding)。
- 编码器(Encoder) :由 \(N\)个相同的层堆叠而成(原论文中 \(N=6\))。每一层包含两个子层:多头自注意力机制(Multi-Head Self-Attention) 和逐位置前馈网络(Position-wise Feed-Forward Network,FFN) 。每个子层都使用了残差连接(Residual Connection) 和层归一化(Layer Normalization),即 "Add & Norm"。
- 解码器(Decoder) :同样由 \(N\)个相同的层堆叠而成。每一层包含三个子层:带掩码的多头自注意力(Masked Multi-Head Self-Attention) 、编码器-解码器多头注意力(Multi-Head Cross-Attention) 和前馈网络(FFN)。同样每个子层都有 "Add & Norm"。
- 输出部分:包括一个线性层(Linear)和 Softmax 层,用于计算下一个 token 的概率分布。
各部分作用及底层原理:
- 位置编码 :由于 Attention 机制本身是位置无关的(即对打乱的序列会产生相同的结果),位置编码的作用是注入序列的顺序信息。
- 多头自注意力 :核心是让序列中的每个位置都能关注到序列中所有其他位置的信息,从而捕捉全局依赖关系。底层通过计算 Query(查询)、Key(键)和 Value(值)之间的相似度来实现。
- 前馈网络(FFN) :这是一个两层的全连接网络,对每个位置的向量独立地进行非线性变换。其作用是对注意力层输出的特征进行进一步的处理和投影,增强模型的表达能力。
- 残差连接 & 层归一化:残差连接帮助梯度在深层网络中直接流动,防止梯度消失;层归一化则稳定了每一层的输入分布,加速模型收敛。
- 掩码多头自注意力:在解码器中,为了防止模型在预测当前词时"看到"未来的信息,掩码机制将当前位置之后的位置的注意力分数设置为负无穷(经过Softmax后变为0)。
- 编码器-解码器注意力 :它接收解码器前一层的输出作为 Query,接收编码器的输出作为 Key 和 Value。这使得解码器在生成每个词时,都能关注到输入序列的哪些部分与之最相关,起到了信息交互的作用。
整体架构
Transformer 采用 Encoder-Decoder 架构,但两者都由相同的 Layer 堆叠而成。
Encoder(编码器):
- 由 \(N\) 个相同的 Encoder Layer 堆叠(原论文 \(N=6\))
- 每个 Encoder Layer = Multi-Head Self-Attention + Feed-Forward Network (FFN) + 两个残差连接 + LayerNorm
Decoder(解码器):
- 由 \(N\) 个相同的 Decoder Layer 堆叠
- 每个 Decoder Layer = Masked Multi-Head Self-Attention + Cross-Attention (连接 Encoder 输出)+ FFN + 三个残差连接 + LayerNorm
各部件作用与原理
| 组件 | 作用 | 底层原理 |
|---|---|---|
| Self-Attention | 建立序列内任意位置的直接依赖,捕获全局上下文 | 通过 Q/K/V 计算相似度加权,实现"全连接"的序列建模,时间复杂度 \(O(n^2)\) |
| Multi-Head | 将高维空间切分为多个子空间,并行学习不同语义关系 | 类似 CNN 的多通道,增强表达能力,H 个 head 关注不同 aspect(语法/语义/指代等) |
| FFN | 对 Attention 输出进行非线性变换,增强模型容量 | 两个线性层夹激活函数:\(FFN(x) = \max(0, xW_1 + b_1)W_2 + b_2\),逐位置独立计算 |
| 残差连接 | 缓解梯度消失,支持深层堆叠 | \(LayerNorm(x + Sublayer(x))\),保留浅层信息,梯度可直接回传 |
| LayerNorm | 稳定训练,加速收敛 | 对单样本特征维度归一化:\(LN(x) = \gamma \frac{x - \mu}{\sigma} + \beta\),比 BN 更适合变长序列 |
| Positional Encoding | 注入位置信息(模型本身无位置感知) | 正弦/余弦函数或学习式嵌入,编码绝对/相对位置 |
关键原理总结
- Attention Is All You Need:完全抛弃 RNN/CNN,仅靠 Attention 机制建模序列关系
- 并行计算:相比 RNN 的时序依赖,Self-Attention 可一次性计算整个序列,充分利用 GPU 并行性
2. Transformer 的 forward 计算包含哪些部件?非线性由什么提供?
Forward 计算包含的部件:
- 输入部件:Token 嵌入查找和位置编码叠加。
- 多头注意力部件 :\(QKV\)线性投影、点积相似度计算、Softmax、加权求和、多头拼接、输出线性投影。
- Add & Norm 部件:残差相加和层归一化。
- 前馈网络(FFN)部件:第一个线性层、非线性激活函数、第二个线性层。
- 输出部件:最后的线性层和 Softmax。
非线性的提供 :
Transformer 中的非线性主要由两个部分提供:
- 前馈网络(FFN)的激活函数 :这是最主要的非线性来源。在 Transformer Base 版本中使用的是 ReLU(或 GELU、SwiGLU 等变体),它对每个位置的向量进行独立的高维映射和非线性筛选。
- Self-Attention 中的 Softmax:Softmax 操作本身也是一种非线性函数,它将点积分数转换为非线性的概率分布。
Forward 流程(以 Encoder 为例)
Input Embedding + Positional Encoding
↓
[Encoder Layer × N]
├─ Multi-Head Self-Attention
│ ├─ Linear 投影得到 Q, K, V
│ ├─ Scaled Dot-Product Attention (Softmax)
│ ├─ Concat + Linear
│ └─ Dropout
├─ Add & LayerNorm (残差1)
├─ FFN
│ ├─ Linear₁ (升维,通常 4×)
│ ├─ Activation (ReLU/GELU/SwiGLU)
│ ├─ Linear₂ (降维)
│ └─ Dropout
└─ Add & LayerNorm (残差2)
↓
Output
非线性来源
| 位置 | 非线性操作 | 说明 |
|---|---|---|
| FFN 激活函数 | ReLU / GELU / SwiGLU | 主要非线性来源,逐位置独立变换 |
| Attention Softmax | Softmax(\(QK^T/\sqrt{d_k}\)) | 提供概率分布的"软性选择"非线性 |
| LayerNorm | 含可学习参数的缩放/偏移 | 轻微非线性,主要起稳定作用 |
重点 :FFN 的激活函数是主要非线性来源,没有它模型退化为线性变换的堆叠。
3. Transformer 为什么能替代 RNN?核心优势是什么?
Transformer 能替代 RNN 的核心在于它解决了 RNN 的两大痛点:无法并行 和长距离遗忘。
RNN 的致命缺陷
- 长距离依赖困难:梯度需经过长链反向传播,存在梯度消失/爆炸,难以建模远距离关系
- 串行计算 :时间步 \(t\) 依赖 \(t-1\) 的隐状态,无法并行,GPU 利用率低
- 计算复杂度高 :序列长度 \(n\),计算复杂度 \(O(n \cdot d^2)\),但常数因子大且无法加速
Transformer 的核心优势
| 优势 | 具体表现 |
|---|---|
| 全局依赖建模 | Self-Attention 任意两位置直接交互,距离为 \(O(1)\),彻底解决长程依赖 |
| 完全并行化 | Attention 计算可矩阵化,整个序列一次性处理,\(O(1)\) 时间步(忽略 Softmax 规约) |
| 计算效率 | 虽然复杂度也是 \(O(n^2 \cdot d)\),但矩阵乘法高度优化,实际速度远超 RNN |
| 可解释性强 | Attention 权重直观展示模型"关注"位置,便于调试和分析 |
| 堆叠扩展性 | 残差连接 + LayerNorm 支持深层网络(100+ 层),表达能力随深度指数增长 |
一句话总结 :Transformer 用 空间换时间 ,通过 \(O(n^2)\) 的 attention 计算换取了并行性 和长程建模能力,在硬件加速时代这是更优的 trade-off。
4. 详细介绍 Self-Attention 机制,包括本质、数学解释、具体计算步骤,及时间复杂度。
本质 :Self-Attention 的本质是 "用序列中的其他元素来增强目标元素的语义表示",通过计算序列中每个元素与所有元素之间的相关性(注意力权重),然后基于这些权重对相关信息进行聚合,从而让模型更好地理解上下文。
数学解释及具体计算步骤 :
给定输入序列 \(X = [x_1, x_2, ..., x_n]\),其中 \(x_i\) 是维度为 \(d_{model}\) 的向量。
-
计算 Q, K, V :通过三个可训练的权重矩阵 \(W^Q, W^K, W^V \in \mathbb{R}^{d_{model} \times d_k}\) 对输入 \(X\) 进行线性变换,得到 Query、Key、Value 矩阵。
\[Q = XW^Q, \quad K = XW^K, \quad V = XW^V \]
-
计算相似度(点积) :计算 Query 矩阵与 Key 矩阵的点积,得到一个 \(n \times n\) 的注意力分数矩阵 \(S\)。\(S_{ij} = Q_i \cdot K_j^T\) 表示第 \(i\) 个词对第 \(j\) 个词的关注程度。
-
缩放(Scale) :将注意力分数除以 \(\sqrt{d_k}\),防止点积结果过大导致 Softmax 梯度消失。
\[S_{scaled} = \frac{QK^T}{\sqrt{d_k}} \]
-
应用 Softmax :对缩放后的矩阵在最后一个维度(即对每个 Query 对应的所有 Key 的分数)进行 Softmax 归一化,得到最终的注意力权重矩阵 \(P\)(概率分布)。
\[P = softmax(\frac{QK^T}{\sqrt{d_k}}) \]
-
加权求和 :将注意力权重矩阵 \(P\) 与 Value 矩阵 \(V\) 相乘,得到最终的输出矩阵 \(Z\)。
\[Z = PV \]
时间复杂度 :
Self-Attention 的时间复杂度是 \(O(n^2 \cdot d)\) ,其中 \(n\) 是序列长度,\(d\) 是向量维度。
- \(Q \cdot K^T\) 计算量为 \(O(n^2 \cdot d)\)。
- 加权求和 \(P \cdot V\) 计算量为 \(O(n^2 \cdot d)\)。
本质
将序列中每个位置与所有位置进行相似度比较,根据相似度加权聚合信息,实现"动态全连接图"的构建。
数学解释
给定输入序列 \(X \in \mathbb{R}^{n \times d_{model}}\),通过线性投影得到:
\[Q = XW^Q, \quad K = XW^K, \quad V = XW^V \]
其中 \(W^Q, W^K \in \mathbb{R}^{d_{model} \times d_k}\),\(W^V \in \mathbb{R}^{d_{model} \times d_v}\)
Scaled Dot-Product Attention:
\[\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]
输出维度:\(\mathbb{R}^{n \times d_v}\)
具体计算步骤
Step 1: 线性投影
Q = X @ W_q # [n, d_model] @ [d_model, d_k] = [n, d_k]
K = X @ W_k # [n, d_k]
V = X @ W_v # [n, d_v]
Step 2: 计算相似度(点积)
scores = Q @ K.T # [n, d_k] @ [d_k, n] = [n, n]
Step 3: 缩放
scores = scores / sqrt(d_k)
Step 4: Softmax 归一化(按行)
attn_weights = softmax(scores, dim=-1) # [n, n], 每行和为1
Step 5: 加权聚合
output = attn_weights @ V # [n, n] @ [n, d_v] = [n, d_v]
Step 6: 输出投影(Multi-Head 时)
output = Concat(head_1, ..., head_h) @ W_o
时间复杂度分析
| 操作 | 计算复杂度 | 说明 |
|---|---|---|
| Q/K/V 投影 | \(O(3 \cdot n \cdot d_{model} \cdot d_k)\) | 三个矩阵乘法 |
| \(QK^T\) | \(O(n^2 \cdot d_k)\) | 核心瓶颈,序列长度的平方 |
| Softmax | \(O(n^2)\) | 逐行计算 |
| 加权 V | \(O(n^2 \cdot d_v)\) | 假设 \(d_k = d_v = d_{model}/h\) |
| 总计 | \(O(n^2 \cdot d)\) | 与 RNN 的 \(O(n \cdot d^2)\) 对比,\(n \ll d\) 时更优 |
空间复杂度 :\(O(n^2)\) 存储 Attention 矩阵,这是长文本(如 100K token)的主要挑战。
5. 为什么要用 Multi-Head Attention?切分为多头的作用是什么?
使用 Multi-Head Attention 的核心原因是 让模型能够从不同角度、关注不同子空间的信息。
切分为多头的作用:
- 捕获多维度的特征关系:类似于卷积神经网络(CNN)中多个卷积核的作用,不同的注意力头可以学习到不同类型的依赖关系。例如,一个头可能主要关注语法结构(如名词-动词关系),另一个头可能关注长距离的语义指代(如代词与其先行词),还有一个头可能关注相邻词的局部信息。
- 降低单次注意力的偏重风险:如果不切分多头,整个模型只能在一个单一的语义空间内计算平均的注意力权重,这可能导致模型过度关注自身或其他一两个词,而忽略了其他有用的信息。
- 增强模型表达能力:多头机制允许模型联合处理来自不同表示子空间的信息。最后将所有头的信息拼接起来,通过一个线性变换融合成一个更丰富、更强大的特征表示。
实现上 :Multi-Head 并不是循环计算多个头,而是通过对 \(d_{model}\) 维度的切分,将原来的大矩阵乘法变成多个小矩阵的并行乘法,从而保持计算效率与单头相似。
核心动机
单头 Attention 的表达能力有限,难以同时捕捉不同类型的语义关系。
具体作用
| 作用 | 解释 |
|---|---|
| 多子空间并行学习 | 将 \(d_{model}\) 维空间切分为 \(h\) 个 \(d_k\) 维子空间(\(d_k = d_{model}/h\)),每个 head 独立学习不同 aspect |
| 增强表达能力 | 类似 CNN 的多通道特征,不同 head 可关注:语法关系、语义相似、指代消解、位置邻近等 |
| 计算效率 | 虽然总参数量相同,但每个 head 的矩阵更小,可并行计算,且注意力矩阵更小(\(n \times n\) 但维度降低) |
计算流程
head_i = Attention(XW_i^Q, XW_i^K, XW_i^V) # [n, d_k]
MultiHead(Q,K,V) = Concat(head_1,...,head_h)W^O # [n, h*d_k] @ [h*d_k, d_model] = [n, d_model]
总参数量 :\(4 \cdot d_{model}^2\)(Q/K/V/O 各 \(d_{model} \times d_{model}\)),与单头相同,但分布更优。
实际观察
- 不同 head 确实学到不同模式:有的关注局部(相邻词),有的关注全局(远距离依赖),有的关注特定语法关系
- Head Pruning:可裁剪冗余 head 而不显著损失性能,证明存在分工
6. 计算 Attention 的 Softmax 之前为什么要除以根号 \(d_k\)?
这是为了防止梯度消失,也被称为缩放点积注意力(Scaled Dot-Product Attention)。
原因 :假设 \(q\) 和 \(k\) 是独立的随机变量,均值为0,方差为1。那么它们的点积 \(q \cdot k = \sum_{i=1}^{d_k} q_i k_i\) 的均值为0,但方差变为 \(d_k\)。
- 未缩放时 :当 \(d_k\) 很大时,点积结果会非常大(方差大),导致 Softmax 函数的输入落入梯度极小的饱和区域。这意味着 Softmax 之后,正确的词概率接近1,错误的词概率接近0,但反向传播时梯度会非常小,模型几乎无法学习。
- 缩放后 :除以 \(\sqrt{d_k}\),可以将点积的方差拉回 1,使得 Softmax 的输入落在梯度敏感的区域,保证了训练过程的稳定性。
核心原因
防止 Softmax 梯度消失(饱和).
数学推导
假设 \(q, k\) 的分量是独立随机变量,均值为 0,方差为 1:
- 点积 \(q \cdot k = \sum_{i=1}^{d_k} q_i k_i\)
- 方差:\(\text{Var}(q \cdot k) = \sum_{i=1}^{d_k} \text{Var}(q_i k_i) = d_k \cdot 1 \cdot 1 = d_k\)
- 标准差:\(\sqrt{d_k}\)
当 \(d_k\) 较大时(如 64, 128):
- 点积的绝对值会很大(方差大)
- 导致 Softmax 输入进入极端区域(极大正值或负值)
- Softmax 输出趋近 one-hot(一个位置接近 1,其余接近 0)
- 梯度消失:反向传播时梯度几乎为 0,无法训练
缩放的作用
除以 \(\sqrt{d_k}\) 后:
- 新方差:\(\text{Var}(\frac{q \cdot k}{\sqrt{d_k}}) = \frac{d_k}{d_k} = 1\)
- 数值范围适中,Softmax 保持"软性",梯度流动正常
类比
类似 LayerNorm/Weight Initialization 的思想:控制信号强度,维持数值稳定性。
7. 介绍一下 Transformer 的位置编码(Positional Encoding),还了解其他位置编码吗?
原始 Transformer 的位置编码 :
原论文使用了三角函数的绝对位置编码(Sinusoidal Positional Encoding)。
\[PE_{(pos, 2i)} = sin(pos / 10000^{2i / d_{model}}) \]
\[PE_{(pos, 2i+1)} = cos(pos / 10000^{2i / d_{model}}) \]
其中 \(pos\) 是位置索引,\(i\) 是维度索引。
- 作用 :通过不同频率的正余弦函数,为每个位置生成一个唯一的向量。这种设计的优势在于,它能够让模型轻易地学习到相对位置关系 ,因为对于固定的偏移量 \(k\),\(PE_{pos+k}\) 可以表示为 \(PE_{pos}\) 的线性变换。
其他位置编码 :
随着发展,出现了很多更先进的编码方式,主要分为绝对编码和相对编码:
- 可学习位置编码(Learned Positional Embedding) :将位置编码视为可训练的参数矩阵。如 BERT、GPT 等模型使用。优点是灵活,但缺点是外推性差,即无法处理比训练时更长的序列。
- 旋转位置编码(RoPE) :是目前大模型(如 LLaMA, ChatGLM)最常用的方法之一。它通过旋转矩阵乘法将相对位置信息直接注入到 Query 和 Key 的向量表示中。RoPE 具有良好的相对位置感知能力 和较好的外推性。
- ALiBi(Attention with Linear Biases) :这种方法不直接对 Embedding 加位置信息,而是在 Attention 分数计算完成后,根据 Query 和 Key 的距离加上一个预设的、不可学习的线性偏置项 。其优点是极强的外推能力和极高的计算效率,广泛应用于 BLOOM 等模型中。
原始方案:Sinusoidal Positional Encoding
原论文使用固定正弦/余弦函数:
\[PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) \]
\[PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) \]
其中 \(pos\) 是位置,\(i\) 是维度索引。
优点:
- 可处理任意长度(外推性)
- 相对位置可通过线性变换得到:\(PE_{pos+k}\) 是 \(PE_{pos}\) 的线性函数(由三角函数和角公式保证)
- 无需学习参数
缺点:
- 绝对位置信息较弱
- 长文本外推时周期可能不匹配
其他主流方案
| 方案 | 原理 | 优缺点 | 代表模型 |
|---|---|---|---|
| Learned Positional Embedding | 将位置作为可学习参数 \(E_{pos} \in \mathbb{R}^{d_{model}}\) | 灵活,但长度受限(需预设 max_len),外推性差 | BERT, GPT-2 |
| Relative Positional Encoding | 不编码绝对位置,只建模相对位置偏移 | 更好的长度泛化,计算复杂 | Transformer-XL, T5 |
| Rotary Position Embedding (RoPE) | 通过旋转矩阵编码相对位置,\(q_m, k_n\) 乘旋转矩阵 \(R_{\theta,m}, R_{\theta,n}\),内积只依赖 \(m-n\) | 融合绝对/相对优点,外推性好,计算高效 | LLaMA, PaLM, GPT-4 |
| ALiBi (Attention with Linear Biases) | 直接在 Attention Score 加上基于距离的负偏置 $-m \cdot | i-j | $ |
| CoPE (Contextual Position Encoding) | 基于上下文动态计算位置权重 | 更灵活,但复杂 | 研究前沿 |
现代趋势(LLM 时代)
- RoPE 成为主流:LLaMA 系列、GPT-4、Claude 均采用,兼顾效率与效果
- 长文本外推技术:NTK-aware scaling、YaRN、Dynamic NTK 等,解决预训练长度外推问题
8. 介绍 QKV 的计算。如果在 Transformer 中去掉 K,变成 QQV,会有什么问题?(仅考虑编码器内部)
QKV 的计算 :
在 Transformer 中,\(Q, K, V\) 是通过输入矩阵 \(X\) 分别与三个不同的权重矩阵 \(W^Q, W^K, W^V\) 相乘得到的。
- \(Q = XW^Q\): 代表当前词在询问什么。
- \(K = XW^K\): 代表当前词有什么特征被询问。
- \(V = XW^V\): 代表当前词实际提供的信息内容。
如果去掉 K,变成 QQV 的问题 :
如果不使用 \(K\),而直接用 \(Q\) 与自身的转置(即 \(QQ^T\))来计算注意力分数,会引发严重问题:加剧模型对自身位置的关注,破坏注意力机制的泛化能力。
- 数学本质 :在《超细节的BERT/Transformer知识点》一文中提到,如果 \(q=k=v\) 且不乘 \(W\) 矩阵,那么 \(q_i \cdot k_i\)(即 \(q_i \cdot q_i\))的值会是最大的,导致模型几乎只关注自己。
- 逻辑推导 :即使允许 \(Q\) 和 \(K\) 的计算矩阵不同,但如果强制 \(K=Q\),那么对于任意两个不同的词 \(x_i\) 和 \(x_j\),相似度计算变成了 \((W^Q x_i) \cdot (W^Q x_j)\)。这虽然能计算 i 和 j 的关系,但由于 \(W^Q\) 只是一个固定的线性变换,它只能在一个固定的"查询"空间内计算相似度。
- 结论 :标准的 Attention 机制允许 \(Q\) 和 \(K\) 在不同的空间中度量相似度(由 \(W^Q\) 和 \(W^K\) 分别定义),增加了模型的灵活性和表达能力。去掉 \(K\) 会让 Query 既当运动员又当裁判员,严重限制了模型区分不同词之间关系的能力。
QKV 计算详解
Input X: [batch_size, seq_len, d_model]
W_q: [d_model, d_k] W_k: [d_model, d_k] W_v: [d_model, d_v]
Q = X @ W_q # [batch, seq_len, d_k] - 查询:我要找什么信息
K = X @ W_k # [batch, seq_len, d_k] - 键:我有什么信息(索引)
V = X @ W_v # [batch, seq_len, d_v] - 值:实际内容(通常 d_v = d_k)
Attention = softmax(Q @ K.T / sqrt(d_k)) @ V
物理意义:
- Q:当前位置的"查询意图"
- K:所有位置的"内容标签"
- V:所有位置的"实际信息"
- 通过 Q·K 匹配找到相关信息,从 V 中提取
如果去掉 K,变成 QQV(仅考虑 Encoder 内部)
计算形式 :\(\text{Attention} = \text{softmax}(\frac{QQ^T}{\sqrt{d_k}})V\)
问题分析:
| 问题 | 具体说明 |
|---|---|
| 对称性过强 | \(QQ^T\) 是对称矩阵,\(A_{ij} = A_{ji}\),强制双向关系对称,但语言中关系常不对称(A 关注 B ≠ B 关注 A) |
| 缺乏内容索引 | Q 既当"查询"又当"索引",导致查询与内容耦合。无法区分"我要找 X"和"我有 X",检索逻辑混乱 |
| 表达能力骤降 | 参数量减少(少一个 \(W_K\)),且 \(QQ^T\) 的秩受限(rank ≤ \(d_k\)),无法建模复杂关系 |
| 训练不稳定 | \(QQ^T\) 的数值动态范围更难控制,Softmax 更容易饱和 |
| 等价于线性 Attention 退化 | 数学上近似于对 V 做固定的二次型加权,失去灵活性 |
本质 :K 的存在实现了内容与查询的解耦,是 Attention 机制"检索-读取"逻辑的关键。去掉 K,模型退化为固定的自相关计算,失去动态路由能力。
9. Transformer 是 Encoder-Decoder 架构,而 GPT 是 Decoder-only 架构,为什么会演变成这种形式?为什么生成式任务(如 GPT)通常舍弃 Encoder?
演变原因 :
这种演变主要源于预训练任务目标 和下游任务形式的变化。
- 原始 Transformer:诞生于机器翻译任务,这是一个典型的 Seq2Seq 任务,输入(源语言)和输出(目标语言)是完整的、但内容不同的句子。Encoder 负责理解整个输入句子,Decoder 则负责基于输入理解逐个生成输出词。
- GPT 的 Decoder-only :GPT 开创了"自回归语言建模"的预训练范式,即 "预测下一个词" 。这个任务天然适合 Decoder-only 架构:模型只能看到当前词之前的词(通过 Masked Attention),然后预测下一个词,完美契合了生成任务的本质。
- BERT 的 Encoder-only:BERT 使用的预训练任务是 Masked Language Model(完形填空),需要同时利用一个词的左右两侧上下文信息来预测被遮住的词,因此它只需要 Encoder 来理解完整的上下文。
生成式任务舍弃 Encoder 的原因:
- 任务本质匹配 :生成式任务的本质是无条件或基于提示(Prompt)的续写。这本质上就是一个自回归过程。Decoder-only 架构的 Masked Self-Attention 天生就是为此设计的:它在生成时只能看到历史信息,符合因果推断的逻辑。
- 架构简化与扩展:舍弃 Encoder 极大地简化了模型结构,使得堆叠更多层、训练更大规模的模型变得更加容易和稳定。GPT 系列的成功证明了这种简洁架构的扩展能力。
- 统一的任务表示:Decoder-only 架构可以将各种不同的任务(翻译、问答、摘要等)都统一为"文本生成"的格式。只需要将任务描述和输入拼接成 Prompt 喂给模型,模型就能以续写的方式生成答案,实现大一统的通用能力。
- 上下文学习(In-Context Learning):Decoder-only 架构在推理时,能够灵活地利用输入 Prompt 中的示例来调整输出,这种能力被称为上下文学习。Encoder-Decoder 模型由于对输入和输出的处理方式不同,实现这种能力相对复杂。
历史演变
| 阶段 | 架构 | 代表 | 特点 |
|---|---|---|---|
| 2017 | Encoder-Decoder | 原始 Transformer | 机器翻译(Seq2Seq) |
| 2018 | Encoder-only | BERT | 理解任务(双向编码) |
| 2018-2019 | Decoder-only | GPT-1/2/3, LLaMA | 生成任务(自回归) |
| 现在 | Decoder-only 主导 | GPT-4, Claude, Gemini | 通用人工智能(AGI)趋势 |
为什么生成任务舍弃 Encoder?
-
任务特性匹配:自回归生成的天然优势
-
生成任务本质 :从左到右逐个生成 token,**因果性(Causal)**是硬性约束
-
Decoder-only :Masked Self-Attention(因果掩码)天然满足:\(position_i\) 只能 attend to \(j \leq i\)
-
Encoder-Decoder:Encoder 是双向的,但生成时仍需通过 Cross-Attention,结构冗余
-
-
架构效率:统一 vs. 分离
| 方面 | Encoder-Decoder | Decoder-only |
|---|---|---|
| 参数量利用 | 需维护两套参数(Enc + Dec) | 单一堆叠,全部用于生成 |
| 计算效率 | Encoder 需完整编码,无法流式 | 可 KV-Cache 加速,逐 token 复用历史 |
| 预训练目标 | 需设计复杂目标(如 BERT 的 MLM) | 简单统一的 Next Token Prediction |
-
Scaling Law 的必然选择
-
实证发现 :当模型规模扩大(100B+),Decoder-only 的 Emergent Ability(涌现能力)更显著
-
统一范式:所有任务(理解、生成、推理)都可表达为"续写",无需区分 Enc/Dec
-
Prompting 友好:Decoder-only 天然适配上下文学习(In-context Learning),Encoder-Decoder 的分离结构阻碍 prompt 连续性
-
-
工程实现优势
-
KV-Cache 优化 :Decoder-only 可在生成阶段缓存历史 K/V,避免重复计算,推理速度 \(O(1)\) per step
-
并行预训练:虽然生成是串行的,但预训练时可用 Masked Attention 并行计算整个序列
-
简化部署:单一模型结构,易于分布式训练和推理优化(如 Tensor Parallelism, Pipeline Parallelism)
-
为什么保留 Encoder 的场景?
- 特定理解任务:如 BERT 用于语义相似度、分类(但已被 LLM 取代趋势)
- 多模态编码:Vision Transformer(ViT)作为图像 Encoder,接 LLM Decoder
- 特定翻译任务:如 Google 早期 T5,但现代翻译也用 Decoder-only(GPT-4)
一句话总结:Decoder-only 架构是任务特性(因果生成)、参数效率(统一堆叠)、Scaling 规律(涌现能力)和工程优化(KV-Cache)共同作用的最优解,代表了生成式 AI 时代的架构收敛。
10. Transformer 的 FFN 层为什么会逐渐演变成 MOE 层?
传统 Transformer 中的 FFN 层是密集的前馈网络,参数量与隐层维度相关,随着模型规模扩大,其计算和参数量急剧增加。
MoE(混合专家)层通过将单个 FFN 替换为多个并行的专家网络和一个门控网络,实现稀疏激活:每个 token 仅激活 top-k 个专家,在保持计算量基本不变的前提下大幅增加模型参数量,从而提升模型容量和性能。
这种演变是为了在有限计算资源下扩大模型规模,例如 Switch Transformer、GShard 等模型通过 MoE 结构显著提升了大语言模型的能力。
11. MOE 层的负载均衡具体是怎么做的?偏置项 b 是怎么训练的?如何保证偏置项得到变换?
负载均衡:
- Router 可能总是选少数几个"受欢迎"专家,导致其他专家闲置(Collapse 问题)。
- 为避免某些专家过载而其他闲置,通常采用辅助损失(auxiliary loss) 鼓励各专家被选中的次数均匀,例如计算每个专家被选中的概率与均匀分布的交叉熵;
- 同时,引入专家容量(expert capacity) 限制每个专家处理的 token 数量,超出部分被丢弃或重新路由;还可通过动态调整门控的偏置项实现均衡。
偏置项 b 的训练:偏置项是门控网络中每个专家对应的可学习参数,初始为 0。在前向时,门控输出 logits 加上偏置后经 softmax 得到选择概率,反向传播中通过梯度下降更新偏置项,使其参与优化。
保证偏置项变换:偏置项作为模型参数,通过常规优化器更新。负载均衡损失会间接影响偏置项,使其向平衡专家负载的方向调整。此外,有些方法(如 GShard)会根据专家实际处理 token 数量与均值的偏差,直接更新偏置项以实现负载均衡。
(这两个看不懂)
12. 如何降低 Transformer 的计算复杂度?常见的稀疏注意力变体有哪些?
Transformer 的自注意力复杂度为 O(n²d),n 为序列长度。可通过稀疏注意力、低秩近似等方法降低。
常见稀疏注意力变体包括:
- 局部注意力:如滑动窗口注意力(Longformer),每个 token 只关注附近窗口内的 token。
- 分块注意力:如 Reformer 的 LSH 注意力,将序列分块并在块内或块间进行注意力。
- 全局+局部注意力:如 BigBird 和 Longformer,结合全局 token(如 [CLS])与局部窗口。
- 随机注意力 :如 BigBird 中部分 token 随机连接,增加信息流动。
- 低秩近似:如 Linformer 通过投影将序列长度降维,复杂度 O(n)。
- 核化方法:如 Performer 使用随机特征映射(FAVOR+)近似注意力,复杂度 O(n)。
这些方法通过减少注意力矩阵的计算量或近似计算来降低复杂度。
13. 分析一下 Transformer 训练过程中显存占用和计算复杂度。
- 显存占用:主要包括模型参数、梯度、优化器状态和中间激活值。对于 Transformer 层,中间激活值(尤其是注意力权重矩阵形状为 [batch, heads, seq_len, seq_len])是长序列下的主要瓶颈。此外,FFN 的中间层激活也占用显存。例如,对于批次大小 b、序列长度 n、隐层维度 d、头数 h,单层注意力权重占用 b×h×n² 个浮点数,在长序列时极大。
- 计算复杂度:每层自注意力为 O(n²d)(计算 QK 乘积和加权求和),FFN 为 O(nd²)。总体每层复杂度 O(n²d + nd²)。对于大模型,d 较大,但长序列时 n² 项主导。
显存占用拆解(训练时)
模型状态(Model States)- ZeRO 论文分类:
- 参数(Parameters) :\(2 \times \text{params}\) 字节(FP16/BF16)
- 梯度(Gradients) :\(2 \times \text{params}\) 字节
- 优化器状态(Optimizer States) :Adam 需要 \(12 \times \text{params}\) 字节(FP32 拷贝 + 动量 + 二阶矩)
激活值(Activations)- 与 batch size 和序列长度相关:
- Attention 矩阵:\(O(N^2 \cdot B \cdot L)\),\(B\)=batch size, \(L\)=层数
- 每层激活:\(O(B \cdot N \cdot d_{model})\)
具体计算(以 7B 模型为例):
| 组件 | 显存估算 |
|---|---|
| 参数(BF16) | 14 GB |
| 梯度 | 14 GB |
| Adam 优化器状态 | 84 GB |
| 激活值(\(B=1, N=2048, L=32\)) | ~20-40 GB |
| 总计 | ~130-150 GB(需模型并行) |
计算复杂度(FLOPs)
前向传播每层:
- Self-Attention:\(4 \cdot B \cdot N^2 \cdot d + 2 \cdot B \cdot N \cdot d^2\)(投影+Attention计算+输出投影)
- FFN:\(8 \cdot B \cdot N \cdot d^2\)(通常 \(d_{ff}=4d\))
- 总计 :\(O(B \cdot N \cdot d^2 + B \cdot N^2 \cdot d)\)
关键结论:
- 短序列(\(N < d\)):FFN 主导,\(O(N \cdot d^2)\)
- 长序列(\(N > d\)):Attention 主导,\(O(N^2 \cdot d)\)
- 训练时反向传播额外 2 倍计算量
14. Self-Attention 机制在多模态对齐上是否存在瓶颈?有没有实际场景里注意力权重完全偏掉的情况?
- 多模态对齐瓶颈:Self-Attention 处理单一模态内部的依赖,无法直接建模跨模态对应关系。多模态任务通常需要跨模态注意力(cross-attention)或专用融合模块。此外,不同模态特征分布、位置编码方式差异大,直接拼接后使用 self-attention 难以有效对齐,且长序列(如图像 patch)会加剧计算负担。
- 注意力权重偏掉的情况:实际训练中可能因初始化不当、数据分布不均或训练不稳定,导致注意力权重集中在少数 token 上,甚至完全偏向某一位置(如 [CLS] 或 [SEP]),造成信息丢失。例如,模型过拟合或容量不足时,注意力可能坍塌为稀疏分布。
多模态对齐的瓶颈
1. 模态异构性(Modality Gap)
- 视觉特征(CNN/ViT 输出)与文本特征(Token Embedding)分布差异大
- 直接拼接导致注意力"选择性失明":某一模态主导,另一模态被忽略
2. 粒度不匹配
- 图像:全局特征([CLS])或 patch 级(16x16 区域)
- 文本:token 级(词/子词)
- 注意力权重在不对齐的粒度上难以建立有效关联
3. 训练目标冲突
- 对比学习(CLIP)拉近跨模态距离,但生成任务(VQA)需要细粒度对齐
- 单一注意力机制难以同时满足两种需求
实际场景:注意力权重完全偏掉的案例(不确定是不是 LLM 生成的幻觉)
案例 1:CLIP 的"bag of words"问题
- 图像中有"红色球在蓝色盒子旁边",文本问"球在哪里"
- 注意力权重均匀分布在所有物体上,无法精确定位空间关系
- 原因:全局对比学习缺乏细粒度监督
案例 2:多模态大模型(BLIP-2/LLaVA)的幻觉
- 图像实际内容:一只猫在沙发上
- 模型生成:"猫在桌子上"(错误)
- 注意力分析:文本生成时,视觉 token 的注意力权重被语言先验压制,模型依赖训练记忆而非图像内容
案例 3:视频-文本对齐的时间偏置
- 视频理解任务中,模型过度关注开头帧,忽略后续关键信息
- 原因:位置编码累积 + 自回归生成导致的注意力漂移
解决方案:
- 跨模态注意力:Q 来自文本,KV 来自视觉(Flamingo 的 Gated Cross-Attention)
- 细粒度对齐:区域-词级别匹配(GLIP)
- 对比学习+生成联合训练:BLIP 的 ITC+ITM+LM 三任务
15. 如何解决梯度消失和梯度爆炸问题?
常用方法包括:
- 权重初始化:如 Xavier 或 He 初始化,使各层输出方差稳定。
- 激活函数:使用 ReLU、Leaky ReLU 等避免梯度饱和。
- 归一化层:BatchNorm 或 LayerNorm 稳定前向传播和梯度。
- 残差连接:允许梯度直接跳过非线性层,缓解消失。
- 梯度裁剪:限制梯度范数防止爆炸。
- 优化器:如 Adam 自适应调整学习率,稳定训练。
- 预训练 :通过预训练获得良好初始化,减少梯度问题。
在 Transformer 中,残差连接和 LayerNorm 是核心手段。
梯度消失(Vanishing Gradient)
原因:激活函数导数 < 1(Sigmoid/Tanh),多层连乘后梯度指数级减小
解决方案:
| 方法 | 原理 | 应用 |
|---|---|---|
| 残差连接(Residual Connection) | \(x + F(x)\),梯度可直接回传 | Transformer 每层必备 |
| LayerNorm | 稳定每层的分布,防止激活值过小 | 放在残差前或后(Pre/Post Norm) |
| 更好的初始化 | Xavier/Glorot、He 初始化,保持方差恒定 | 第一层 embedding |
| ReLU/GELU/Swish | 导数在正区间为 1 或接近 1 | 替代 Sigmoid |
| 门控机制 | LSTM/GRU 的遗忘门控制信息流 | RNN 时代方案 |
梯度爆炸(Exploding Gradient)
原因:梯度 > 1,多层连乘后指数级增大
解决方案:
| 方法 | 原理 | 关键参数 |
|---|---|---|
| 梯度裁剪(Gradient Clipping) | 设定阈值,超过则缩放 | max_norm=1.0 常见 |
| 权重衰减(Weight Decay) | L2 正则化限制权重大小 | \(\lambda=0.01\) |
| 更小的学习率 | 直接限制参数更新幅度 | Warmup 策略 |
Transformer 中的具体实践
Pre-Norm vs Post-Norm:
- Post-Norm (原始):\(x + \text{LayerNorm}(\text{Attention}(x))\),深层易梯度消失
- Pre-Norm (主流):\(\text{LayerNorm}(x + \text{Attention}(x))\),训练更稳定,但可能表达能力略降
关键背诵点:现代 LLM(GPT-3/LLaMA)都用 Pre-Norm + 梯度裁剪 + Warmup 组合。
16. 介绍一下 LayerNorm 和 BatchNorm 的区别?
- 计算维度:BatchNorm 对每个特征维度在 batch 上归一化(计算 batch 均值和方差);LayerNorm 对每个样本的所有特征维度归一化(计算样本内均值和方差)。
- 适用场景:BatchNorm 适用于 CV 等固定尺寸输入,对 batch size 敏感;LayerNorm 适用于 NLP 等变长序列,不依赖 batch,因此 Transformer 采用 LayerNorm。
- 训练与推理:BatchNorm 在训练时使用 batch 统计量,推理时使用全局统计量;LayerNorm 训练和推理一致。
- 依赖关系:BatchNorm 依赖 batch 内样本,LayerNorm 不依赖 batch。
| 维度 | BatchNorm | LayerNorm |
|---|---|---|
| 归一化维度 | 跨 batch(N)和空间(H,W) | 跨特征维度(C) |
| 计算统计量 | \(\mu_B, \sigma_B\)(依赖 batch) | \(\mu_L, \sigma_L\)(单样本独立) |
| 序列数据 | ❌ batch 变长时统计不稳定 | ✅ 适合变长序列 |
| 训练和推理 | 需维护 running statistics | 训练和推理一致 |
| 并行性 | 需跨设备同步 batch 统计 | 完全独立,易并行 |
| Transformer | 不适用 | 标准配置 |
数学对比:
BatchNorm:
\[y = \gamma \cdot \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} + \beta \]
LayerNorm:
\[y = \gamma \cdot \frac{x - \mu_L}{\sqrt{\sigma_L^2 + \epsilon}} + \beta \]
其中 \(\mu_L = \frac{1}{H} \sum_{i=1}^H x_i\)(对特征维度求平均)
为什么 Transformer 不用 BN?
- 序列长度可变:不同样本长度不同,batch 统计无意义
- 自回归生成:推理时逐个生成 token,无法预计算 batch 统计
- 独立同分布假设破坏:序列中不同位置 token 分布不同
RMSNorm(LLaMA 使用):
- 去掉均值中心化,只保留方差归一化:\(y = \frac{x}{\sqrt{\text{Mean}(x^2)}} \cdot \gamma\)
- 更快,效果相当
17. 在 Agent 多轮对话任务中,Attention 的局限性体现在哪些方面?
- 长程依赖:标准 self-attention 复杂度高,难以处理超长对话历史,导致早期信息丢失。
- 记忆能力不足:注意力缺乏显式记忆机制,关键信息可能被遗忘,尤其在多轮中。
- 上下文漂移:注意力易偏向近期对话,忽略早期上下文,造成状态不一致。
- 推理效率低:每次生成需重新计算整个历史,延迟高。
- 状态管理困难:难以维护动态更新的对话状态,需结合外部记忆或状态追踪。
- 知识更新局限:无法动态整合新知识,需借助检索增强生成等方法。
核心局限
1. 上下文长度限制(Context Window Limitation)
- 标准 LLM 4K-128K token,多轮对话 + 工具调用历史 + 长文档容易溢出
- 表现:早期对话信息被挤出窗口,模型"失忆"
2. 注意力稀释(Attention Dilution)
- 长序列中,Softmax 归一化导致每个 token 的注意力权重被稀释
- 表现:关键决策信息(如用户初始需求)在后续轮次中被大量中间 token 淹没
3. 位置编码的远程衰减
- RoPE/ALiBi 等相对位置编码,远距离 token 的相对位置表示能力弱
- 表现:模型更关注近期对话,忽略早期关键约束
4. 缺乏显式状态管理
- 每轮都重新计算全量 Attention,没有 RNN 的隐状态压缩机制
- 表现:重复信息反复计算,无法像人类一样形成"记忆摘要"
5. 工具调用历史的噪声干扰
- Agent 执行多步工具调用,返回的中间结果(如 API 返回的 JSON)包含大量噪声
- 表现:注意力被无关字段分散,难以聚焦关键结果
解决方案(前沿方向)
| 方案 | 原理 |
|---|---|
| RAG / 外部记忆 | 将历史对话编码存入向量库,按需检索 |
| Summarization 压缩 | 定期将早期对话摘要化为 system prompt |
| Memory Transformer | 显式记忆槽(如 \(M\) 个可学习的记忆 token) |
| Streaming Attention | 滑动窗口 + 全局摘要 token(如 LongLLaMA) |
| Hierarchical Attention | 先段内、后段间的层次化注意力 |
面试背诵要点速查(供参考)
| 问题 | 一句话核心 |
|---|---|
| Transformer 优势 | 并行计算 + 全局依赖,用 \(O(n^2)\) 空间换 RNN 的时序瓶颈 |
| 非线性来源 | FFN 的激活函数(GELU/SwiGLU)+ Attention Softmax |
| 多头作用 | 多子空间并行,类似 CNN 多通道,增强表达能力 |
| 除以 \(\sqrt{d_k}\) | 控制点积方差,防止 Softmax 饱和、梯度消失 |
| 位置编码演进 | Sinusoidal → Learned → RoPE/ALiBi(外推性优先) |
| QKV 解耦 | Q 查询、K 索引、V 内容,去掉 K 丧失检索灵活性 |
| Decoder-only 胜利 | 因果性匹配生成、参数高效、Scaling 友好、KV-Cache 加速 |
| 复杂度 | Attention \(O(N^2d)\) |
| 归一化 | LayerNorm 单样本独立,适合序列;RMSNorm 更快 |
| Agent | 长度限制 + 注意力稀释,需外部记忆或层次化注意力 |
| 多模态 | 模态 gap + 粒度不匹配,用 Cross-Attention 解决 |
| 显存 | 模型状态(参数+梯度+优化器)+ 激活值 |