整体架构
Transformer 采用 Encoder-Decoder 架构,但两者都由相同的 Layer 堆叠而成。
输入部分 :包括输入嵌入(Input Embedding) 和位置编码(Positional Encoding)。
Encoder(编码器):
- 由 � 个相同的 Encoder Layer 堆叠(原论文 �=6)
- 每个 Encoder Layer = Multi-Head Self-Attention + Feed-Forward Network (FFN)(两层的全连接层,第一层激活函数为 ReLU 即 max(0,x),第二层没有激活函数,不改变矩阵维度) + 两个残差连接 + LayerNorm(即 AddNorm)
Decoder(解码器):
- 由 � 个相同的 Decoder Layer 堆叠
- 每个 Decoder Layer = Masked Multi-Head Self-Attention + Cross-Attention (使用 Encoder 的输出)+ FFN + 三个残差连接 + LayerNorm
输出部分:包括一个线性层(Linear)和 Softmax 层,用于计算下一个 token 的概率分布。
各部件作用与原理
| 组件 | 作用 | 底层原理 |
|---|---|---|
| Self-Attention | 建立序列内任意位置的直接依赖,捕获全局上下文 | 通过 Q/K/V 计算相似度加权,实现"全连接"的序列建模,时间复杂度 �(�2) |
| Multi-Head | 将高维空间切分为多个子空间,并行学习不同语义关系 | 类似 CNN 的多通道,增强表达能力,H 个 head 关注不同 aspect(语法/语义/指代等) |
| FFN | 对 Attention 输出进行非线性变换,增强模型容量 | 两个线性层夹激活函数:���(�)=max(0,��1+�1)�2+�2,逐位置独立计算 |
| 残差连接 | 缓解梯度消失,支持深层堆叠 | ���������(�+��������(�)),保留浅层信息,梯度可直接回传 |
| LayerNorm | 稳定训练,加速收敛 | 对单样本特征维度归一化:��(�)=��−��+�,比 BN 更适合变长序列 |
| Positional Encoding | 注入位置信息(模型本身无位置感知) | 正弦/余弦函数或学习式嵌入,编码绝对/相对位置 |
各部分作用及底层原理:
- 位置编码 :由于 Attention 机制本身是位置无关的(即对打乱的序列会产生相同的结果),位置编码的作用是注入序列的顺序信息。
- 多头自注意力 :核心是让序列中的每个位置都能关注到序列中所有其他位置的信息,从而捕捉全局依赖关系。底层通过计算 Query(查询)、Key(键)和 Value(值)之间的相似度来实现。
- 前馈网络(FFN) :这是一个两层的全连接网络,对每个位置的向量独立地进行非线性变换。其作用是对注意力层输出的特征进行进一步的处理和投影,增强模型的表达能力。
- 残差连接 & 层归一化:残差连接帮助梯度在深层网络中直接流动,防止梯度消失;层归一化则稳定了每一层的输入分布,加速模型收敛。
- 掩码多头自注意力:在解码器中,为了防止模型在预测当前词时"看到"未来的信息,掩码机制将当前位置之后的位置的注意力分数设置为负无穷(经过Softmax后变为0)。
- cross-attention :它接收解码器前一层的输出作为 Query,接收编码器的输出作为 Key 和 Value。这使得解码器在生成每个词时,都能关注到输入序列的哪些部分与之最相关,起到了信息交互的作用。
关键原理总结
- Attention Is All You Need:完全抛弃 RNN/CNN,仅靠 Attention 机制建模序列关系
- 并行计算:相比 RNN 的时序依赖,Self-Attention 可一次性计算整个序列,充分利用 GPU 并行性
2. Transformer 的 forward 计算包含哪些部件?非线性由什么提供?
Forward 计算包含的部件:
- 输入部件:Token 嵌入查找和位置编码叠加。
- 多头注意力部件:���线性投影、点积相似度计算、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(���/��) | 提供概率分布的"软性选择"非线性 |
| LayerNorm | 含可学习参数的缩放/偏移 | 轻微非线性,主要起稳定作用 |
重点 :FFN 的激活函数是主要非线性来源,没有它模型退化为线性变换的堆叠。
3. Transformer 为什么能替代 RNN?核心优势是什么?
Transformer 能替代 RNN 的核心在于它解决了 RNN 的两大痛点:无法并行 和长距离遗忘。
RNN 的致命缺陷
- 长距离依赖困难:梯度需经过长链反向传播,存在梯度消失/爆炸,难以建模远距离关系
- 串行计算:时间步 � 依赖 �−1 的隐状态,无法并行,GPU 利用率低
- 计算复杂度高:序列长度 �,计算复杂度 �(�⋅�2),但常数因子大且无法加速
Transformer 的核心优势
| 优势 | 具体表现 |
|---|---|
| 全局依赖建模 | Self-Attention 任意两位置直接交互,距离为 �(1),彻底解决长程依赖 |
| 完全并行化 | Attention 计算可矩阵化,整个序列一次性处理,�(1) 时间步(忽略 Softmax 规约) |
| 计算效率 | 虽然复杂度也是 �(�2⋅�),但矩阵乘法高度优化,实际速度远超 RNN |
| 可解释性强 | Attention 权重直观展示模型"关注"位置,便于调试和分析 |
| 堆叠扩展性 | 残差连接 + LayerNorm 支持深层网络(100+ 层),表达能力随深度指数增长 |
一句话总结 :Transformer 用 空间换时间 ,通过 �(�2) 的 attention 计算换取了并行性 和长程建模能力,在硬件加速时代这是更优的 trade-off。
4. 详细介绍 Self-Attention 机制,包括本质、数学解释、具体计算步骤,及时间复杂度。
本质 :Self-Attention 的本质是 "用序列中的其他元素来增强目标元素的语义表示",通过计算序列中每个元素与所有元素之间的相关性(注意力权重),然后基于这些权重对相关信息进行聚合,从而让模型更好地理解上下文。
将序列中每个位置与所有位置进行相似度比较,根据相似度加权聚合信息,实现"动态全连接图"的构建。
数学解释及具体计算步骤 :
给定输入序列 �=[�1,�2,...,��],其中 �� 是维度为 ������ 的向量。
-
计算 Q, K, V :通过三个可训练的权重矩阵 ��,��,��∈�������×�� 对输入 � 进行线性变换,得到 Query、Key、Value 矩阵。
�=���,�=���,�=���
-
计算相似度(点积):计算 Query 矩阵与 Key 矩阵的点积,得到一个 �×� 的注意力分数矩阵 �。���=��⋅��� 表示第 � 个词对第 � 个词的关注程度。
-
缩放(Scale) :将注意力分数除以 ��,防止点积结果过大导致 Softmax 梯度消失。
�������=�����
-
应用 Softmax :对缩放后的矩阵在最后一个维度(即对每个 Query 对应的所有 Key 的分数)进行 Softmax 归一化,得到最终的注意力权重矩阵 �(概率分布)。
�=�������(�����)
-
加权求和 :将注意力权重矩阵 � 与 Value 矩阵 � 相乘,得到最终的输出矩阵 �。
�=��
时间复杂度 :
Self-Attention 的时间复杂度是 �(�2⋅�),其中 � 是序列长度,� 是向量维度。
- �⋅�� 计算量为 �(�2⋅�)。
- 加权求和 �⋅� 计算量为 �(�2⋅�)。
时间复杂度分析:
这里直接利用结论:m×n 矩阵与 n×k 矩阵相乘的时间复杂度是 O(mnk),因为最终结果矩阵里有 m×k 个元素,每个元素是通过 n 次乘法 + (n-1) 次加法得到的。
| 操作 | 计算复杂度 | 说明 |
|---|---|---|
| Q/K/V 投影 | �(3⋅�⋅������⋅��) | 三个矩阵乘法 |
| ��� | �(�2⋅��) | 核心瓶颈,序列长度的平方 |
| Softmax | �(�2) | 逐行计算 |
| 加权 V | �(�2⋅��) | (一般)假设 ��=��=������/ℎ |
| 总计 | �(�2⋅�) | 与 RNN 的 �(�⋅�2) 对比,�≪� 时更优 |
空间复杂度:�(�2) 存储 Attention 矩阵,这是长文本(如 100K token)的主要挑战。
5. 为什么要用 Multi-Head Attention?切分为多头的作用是什么?
使用 Multi-Head Attention 的核心原因是 让模型能够从不同角度、关注不同子空间的信息。
切分为多头的作用:
- 捕获多维度的特征关系:类似于卷积神经网络(CNN)中多个卷积核的作用,不同的注意力头可以学习到不同类型的依赖关系。例如,一个头可能主要关注语法结构(如名词-动词关系),另一个头可能关注长距离的语义指代(如代词与其先行词),还有一个头可能关注相邻词的局部信息。
- 降低单次注意力的偏重风险:如果不切分多头,整个模型只能在一个单一的语义空间内计算平均的注意力权重,这可能导致模型过度关注自身或其他一两个词,而忽略了其他有用的信息。
- 增强模型表达能力:多头机制允许模型联合处理来自不同表示子空间的信息。最后将所有头的信息拼接起来,通过一个线性变换融合成一个更丰富、更强大的特征表示。
实现上:Multi-Head 并不是循环计算多个头,而是通过对 ������ 维度的切分,将原来的大矩阵乘法变成多个小矩阵的并行乘法,从而保持计算效率与单头相似。
核心动机:单头 Attention 的表达能力有限,难以同时捕捉不同类型的语义关系。
具体作用
| 作用 | 解释 |
|---|---|
| 多子空间并行学习 | 将 ������ 维空间切分为 ℎ 个 �� 维子空间(��=������/ℎ),每个 head 独立学习不同 aspect |
| 增强表达能力 | 类似 CNN 的多通道特征,不同 head 可关注:语法关系、语义相似、指代消解、位置邻近等 |
| 计算效率 | 虽然总参数量相同,但每个 head 的矩阵更小,可并行计算,且注意力矩阵更小(�×� 但维度降低) |
计算流程
|---|--------------------------------------------------------------------------------------------------|
| | 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⋅������2(Q/K/V/O 各 ������×������),与单头相同,但分布更优。
实际观察
- 不同 head 确实学到不同模式:有的关注局部(相邻词),有的关注全局(远距离依赖),有的关注特定语法关系
- Head Pruning:可裁剪冗余 head 而不显著损失性能,证明存在分工
6. 计算 Attention 的 Softmax 之前为什么要除以根号 ��?
这是为了防止梯度消失,也被称为缩放点积注意力(Scaled Dot-Product Attention)。
原因:假设 � 和 � 是独立的随机变量,均值为0,方差为1。那么它们的点积 �⋅�=∑�=1������ 的均值为0,但方差变为 ��。
- 未缩放时:当 �� 很大时,点积结果会非常大(方差大),导致 Softmax 函数的输入落入梯度极小的饱和区域。这意味着 Softmax 之后,正确的词概率接近1,错误的词概率接近0,但反向传播时梯度会非常小,模型几乎无法学习。
- 缩放后:除以 ��,可以将点积的方差拉回 1,使得 Softmax 的输入落在梯度敏感的区域,保证了训练过程的稳定性。
7. 介绍一下 Transformer 的位置编码(Positional Encoding),还了解其他位置编码吗?
原始 Transformer 的位置编码 :
原论文使用了三角函数的绝对位置编码(Sinusoidal Positional Encoding)。
��(���,2�)=���(���/100002�/������)
��(���,2�+1)=���(���/100002�/������)
其中 ��� 是位置索引,� 是维度索引。
- 作用 :通过不同频率的正余弦函数,为每个位置生成一个唯一的向量。这种设计的优势在于,它能够让模型轻易地学习到相对位置关系,因为对于固定的偏移量 �,�����+� 可以表示为 ����� 的线性变换。
其他位置编码 :
随着发展,出现了很多更先进的编码方式,主要分为绝对编码和相对编码:
- 可学习位置编码(Learned Positional Embedding) :将位置编码视为可训练的参数矩阵。如 BERT、GPT 等模型使用。优点是灵活,但缺点是外推性差,即无法处理比训练时更长的序列。
- 旋转位置编码(RoPE) :是目前大模型(如 LLaMA, ChatGLM)最常用的方法之一。它通过旋转矩阵乘法将相对位置信息直接注入到 Query 和 Key 的向量表示中。RoPE 具有良好的相对位置感知能力 和较好的外推性。
- ALiBi(Attention with Linear Biases) :这种方法不直接对 Embedding 加位置信息,而是在 Attention 分数计算完成后,根据 Query 和 Key 的距离加上一个预设的、不可学习的线性偏置项 。其优点是极强的外推能力和极高的计算效率,广泛应用于 BLOOM 等模型中。
8. 介绍 QKV 的计算。如果在 Transformer 中去掉 K,变成 QQV,会有什么问题?(仅考虑编码器内部)
QKV 计算详解
在 Transformer 中,�,�,� 是通过输入矩阵 � 分别与三个不同的权重矩阵 ��,��,�� 相乘得到的。
- �=���:代表当前词在询问什么。
- �=���:代表当前词有什么特征被询问。
- �=���:代表当前词实际提供的信息内容。
如果去掉 K,变成 QQV(仅考虑 Encoder 内部)
计算形式:Attention=softmax(�����)�
问题分析:
| 问题 | 具体说明 |
|---|---|
| 对称性过强 | ��� 是对称矩阵,���=���,强制双向关系对称,但语言中关系常不对称(A 关注 B ≠ B 关注 A) |
| 缺乏内容索引 | Q 既当"查询"又当"索引",导致查询与内容耦合。无法区分"我要找 X"和"我有 X",检索逻辑混乱 |
| 表达能力骤降 | 参数量减少(少一个 ��),且 ��� 的秩受限(rank ≤ ��),无法建模复杂关系 |
| 训练不稳定 | ��� 的数值动态范围更难控制,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 模型由于对输入和输出的处理方式不同,实现这种能力相对复杂。
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 层,中间激活值(尤其是 attention 权重矩阵 ��� 形状为 [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×params 字节(FP16/BF16)
- 梯度(Gradients):2×params 字节
- 优化器状态(Optimizer States):Adam 需要 12×params 字节(FP32 拷贝 + 动量 + 二阶矩)
激活值(Activations)- 与 batch size 和序列长度相关:
- Attention 矩阵:�(�2⋅�⋅�),�=batch size, �=层数
- 每层激活:�(�⋅�⋅������)
具体显存占用情况(以 7B 模型为例) :CSDN | LLM 微调基础:加载 / 微调一个 7B 模型,到底需要多少显存?
计算复杂度(FLOPs)
前向传播每层:
- Self-Attention:4⋅�⋅�2⋅�+2⋅�⋅�⋅�2(投影+Attention计算+输出投影)
- FFN:8⋅�⋅�⋅�2(通常 ���=4�)
- 总计:�(���2+��2�)
关键结论:
- 短序列(�<�):FFN 主导,�(�⋅�2)
- 长序列(�>�):Attention 主导,�(�2⋅�)
- 训练时反向传播额外 2 倍计算量
14. Self-Attention 机制在多模态对齐上是否存在瓶颈?有没有实际场景里注意力权重完全偏掉的情况?
总之是存在的。不同模态之间,特征分布差异大,直接 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. 如何解决梯度消失和梯度爆炸问题?
梯度消失(Vanishing Gradient)
原因:激活函数的导数 < 1(Sigmoid/Tanh),多层连乘后梯度指数级减小
解决方案:
| 方法 | 原理 | 应用 |
|---|---|---|
| 残差连接(Residual Connection) | �+�(�),梯度可直接回传 | Transformer 每层必备 |
| LayerNorm | 稳定每层的分布,防止激活值过小 | 放在残差前或后(Pre/Post Norm) |
| 更好的初始化 | Xavier/Glorot、He 初始化,保持方差恒定 | 第一层 embedding |
| ReLU/GELU 替代 Sigmoid | 导数在正区间为 1 或接近 1 | 替代 Sigmoid |
| 门控机制 | LSTM/GRU 的遗忘门控制信息流 | RNN 时代方案,不过最近也有 Gated Attention(没看过 不懂) |
梯度爆炸(Exploding Gradient)
原因:梯度 > 1,多层连乘后指数级增大
解决方案:
| 方法 | 原理 | 关键参数 |
|---|---|---|
| 梯度裁剪(Gradient Clipping) | 设定阈值,超过则缩放 | max_norm=1.0 常见 |
| 权重衰减(Weight Decay) | L2 正则化限制权重大小 | �=0.01 |
| 更小的学习率 | 直接限制参数更新幅度 | Warmup 策略 |
Transformer 中的具体实践
常用方法包括:
- 激活函数:使用 ReLU、Leaky ReLU 等避免梯度饱和。
- 残差连接:允许梯度直接跳过非线性层,缓解消失。
- 归一化层:BatchNorm 或 LayerNorm 稳定前向传播和梯度。
- 权重初始化:如 Xavier 或 He 初始化,使各层输出方差稳定。
- 梯度裁剪:限制梯度范数防止爆炸。
- 优化器:如 Adam 自适应调整学习率,稳定训练。
- 预训练:通过预训练获得良好初始化,减少梯度问题。
在 Transformer 中,残差连接和 LayerNorm 是核心手段。
Pre-Norm vs Post-Norm:
- Post-Norm(原始):�+LayerNorm(Attention(�)),深层易梯度消失
- Pre-Norm(主流):LayerNorm(�+Attention(�)),训练更稳定,但可能表达能力略降
关键背诵点:现代 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。
为什么 Transformer 不用 BN?
- 序列长度可变:不同样本长度不同,batch 统计无意义
- 自回归生成:推理时逐个生成 token,无法预计算 batch 统计
- 独立同分布假设破坏:序列中不同位置 token 分布不同
RMSNorm(LLaMA 使用):
- 去掉均值中心化,只保留方差归一化:�=�Mean(�2)⋅�
- 更快,效果相当
17. 在 Agent 多轮对话任务中,Attention 的局限性体现在哪些方面?
- 长程依赖:标准 self-attention 复杂度高,难以处理超长对话历史,导致早期信息丢失。
- 记忆能力不足:注意力缺乏显式记忆机制,关键信息可能被遗忘,尤其在多轮中。
- 上下文漂移:注意力易偏向近期对话,忽略早期上下文,造成状态不一致。
- 推理效率低:每次生成需重新计算整个历史,延迟高。
- 状态管理困难:难以维护动态更新的对话状态,需结合外部记忆或状态追踪。
- 知识更新局限:无法动态整合新知识,需借助检索增强生成等方法。
核心局限
1. 上下文长度限制(Context Window Limitation)
- 标准 LLM 支持 4K-128K token,多轮对话 + 工具调用历史 + 长文档容易溢出
- 表现:早期对话信息被挤出窗口,模型"失忆"
2. 注意力稀释(Attention Dilution)
- 长序列中,Softmax 归一化导致每个 token 的注意力权重被稀释
- 表现:关键决策信息(如用户初始需求)在后续轮次中被大量中间 token 淹没
- 令我联想到 Gated Attention 解决到 attention sink 问题。
3. 位置编码的远程衰减
- RoPE/ALiBi 等相对位置编码,远距离 token 的相对位置表示能力弱
- 表现:模型更关注近期对话,忽略早期关键约束
4. 缺乏显式状态管理
- 每轮都重新计算全量 Attention,没有 RNN 的隐状态压缩机制
- 表现:重复信息反复计算,无法像人类一样形成"记忆摘要"
5. 工具调用历史的噪声干扰
- Agent 执行多步工具调用,返回的中间结果(如 API 返回的 JSON)包含大量噪声
- 表现:注意力被无关字段分散,难以聚焦关键结果
解决方案(前沿方向)
| 方案 | 原理 |
|---|---|
| RAG / 外部记忆 | 将历史对话编码存入向量库,按需检索 |
| Summarization 压缩 | 定期将早期对话摘要化为 system prompt |
| Memory Transformer | 显式记忆槽(如 � 个可学习的记忆 token) |
| Streaming Attention | 滑动窗口 + 全局摘要 token(如 LongLLaMA) |
| Hierarchical Attention | 先段内、后段间的层次化注意力 |