这是本文档旧的修订版!
第八章 注意力机制与Transformer
1. 概念定义与原理讲解
1.1 注意力机制的动机与起源
从RNN到注意力的演进
循环神经网络(RNN)及其变体LSTM、GRU在处理序列数据方面取得了显著成功,但它们存在几个根本性局限:
1. 顺序计算瓶颈:RNN的隐藏状态更新必须按时间顺序进行,无法充分利用现代硬件的并行计算能力。对于长序列,训练时间随序列长度线性增长。
2. 长距离依赖困难:尽管LSTM通过门控机制缓解了梯度消失问题,但在实际应用中,当序列长度超过100时,模型仍难以有效捕捉远距离的词之间的关系。
3. 信息瓶颈:在Seq2Seq模型中,编码器将所有输入信息压缩成一个固定维度的上下文向量,导致长序列的信息损失。
注意力机制(Attention Mechanism)正是为了解决这些问题而诞生的。其核心思想是:在生成每个输出时,模型应该能够“关注”输入序列中最相关的部分,而不是依赖于一个固定的上下文向量。
注意力的生物学启发
注意力机制的设计受到人类视觉注意力的启发。人类在观察复杂场景时,并不会同时处理整个视野的所有信息,而是将注意力集中在特定区域,忽略不相关信息。这种选择性注意机制使人类能够高效处理复杂视觉输入。
在神经网络中,注意力机制允许模型动态地分配计算资源,专注于输入中最相关的部分,从而提高模型的表达能力和效率。
1.2 注意力机制的基本原理
核心概念
注意力机制可以形式化为一个查询(Query)到一组键值对(Key-Value)的映射。给定查询$Q$、键$K$和值$V$,注意力机制计算输出为值的加权和,权重由查询与对应键的相似度决定。
数学形式化
注意力机制的通用框架包含三个组件:
1. 查询(Query):$Q \in \mathbb{R}^{d_q}$,表示当前需要关注什么
2. 键(Key):$K \in \mathbb{R}^{n \times d_k}$,表示输入内容可供检索的索引
3. 值(Value):$V \in \mathbb{R}^{n \times d_v}$,表示输入内容的实际表示
注意力计算过程:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
其中:
- $QK^T$计算查询与所有键的相似度分数
- 除以$\sqrt{d_k}$进行缩放,防止softmax进入梯度饱和区
- softmax将分数转换为概率分布(注意力权重)
- 权重与值相乘得到加权输出
直观理解
想象在图书馆查找资料:
- 查询(Q):你的问题或需求
- 键(K):书籍的目录和标签
- 值(V):书籍的实际内容
- 注意力权重:每本书对你问题的相关程度
1.3 注意力机制的主要类型
1.3.1 加性注意力(Additive Attention)
Bahdanau等人在2014年提出,使用一个前馈网络计算注意力分数:
$$e_{ij} = v_a^T \tanh(W_s s_{i-1} + W_h h_j)$$
$$\alpha_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^n \exp(e_{ik})}$$
特点:
- 使用可学习的参数$W_s, W_h, v_a$
- 理论上可以学习更复杂的相似度函数
- 计算复杂度较高
1.3.2 乘性注意力(Multiplicative Attention / Dot-Product Attention)
直接使用向量点积计算相似度:
$$e_{ij} = s_{i-1}^T h_j$$
特点:
- 计算简单高效,无需额外参数
- 当查询和键维度相同时可直接使用
- 实践中常与缩放因子结合使用
1.3.3 缩放点积注意力(Scaled Dot-Product Attention)
Transformer中使用的标准注意力形式:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
缩放因子$\sqrt{d_k}$的作用:
- 当$d_k$较大时,点积的数值可能很大
- 大值输入使softmax梯度极小,导致梯度消失
- 缩放使点积值保持在合理范围,保证梯度流动
1.3.4 自注意力(Self-Attention)
自注意力是注意力机制的特例,其中查询、键、值都来自同一序列:
$$\text{SelfAttn}(X) = \text{softmax}\left(\frac{XW_Q(XW_K)^T}{\sqrt{d_k}}\right)XW_V$$
其中$W_Q, W_K, W_V$是可学习的投影矩阵。
自注意力的优势: - 能够捕捉序列内部任意两个位置的关系 - 与距离无关,直接建模长距离依赖 - 高度并行化,计算效率高
1.4 Transformer架构详解
1.4.1 Transformer的总体结构
Transformer由Vaswani等人在2017年提出,完全基于注意力机制,摒弃了循环和卷积结构。它由编码器(Encoder)和解码器(Decoder)两部分组成。
编码器结构:
- 输入嵌入 + 位置编码
- N个相同的编码器层(原论文N=6)
- 每层包含:多头自注意力 + 前馈网络
- 每个子层后接层归一化和残差连接
解码器结构:
- 输出嵌入 + 位置编码
- N个相同的解码器层
- 每层包含:掩码多头自注意力 + 编码器-解码器注意力 + 前馈网络
- 每个子层后接层归一化和残差连接
1.4.2 多头注意力机制(Multi-Head Attention)
单一注意力机制可能只关注特定类型的关系。多头注意力通过多组不同的投影,让模型在不同表示子空间中捕捉不同类型的关系。
计算公式:
$$\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O$$
其中: $$\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)$$
参数说明:
- $h$:注意力头数(原论文h=8)
- $d_{model}$:模型维度(原论文512)
- $d_k = d_v = d_{model}/h = 64$
- $W_i^Q, W_i^K, W_i^V$:各头的投影矩阵
- $W^O$:输出投影矩阵
多头注意力的优势:
- 不同头可以学习不同的依赖模式
- 例如:一个头学习句法关系,另一个学习语义关系
- 增强模型的表达能力
1.4.3 位置编码(Positional Encoding)
由于自注意力是位置无关的(permutation invariant),需要显式注入位置信息。Transformer使用正弦和余弦函数生成位置编码:
$$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$:维度索引
- $d_{model}$:模型维度
位置编码的特性:
- 唯一性:每个位置有唯一的编码
- 相对位置:$PE_{pos+k}$可以表示为$PE_{pos}$的线性函数
- 有界性:值域在[-1, 1]之间
- 可学习位置编码也是可行的选择
1.4.4 前馈网络(Feed-Forward Network)
每个编码器和解码器层包含一个全连接前馈网络:
$$\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2$$
这是一个两层的线性变换,中间使用ReLU激活。特点:
- 对每个位置独立应用(位置间不交互)
- 隐藏层维度通常为$4 \times d_{model}$(原论文2048)
- 引入非线性,增强模型表达能力
1.4.5 层归一化与残差连接
残差连接(Residual Connection):
$$\text{LayerNorm}(x + \text{Sublayer}(x))$$
作用:
- 缓解梯度消失,使深层网络可训练
- 保留原始信息,帮助优化
层归一化(Layer Normalization):
$$\text{LayerNorm}(x) = \gamma \odot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta$$
与批归一化不同,层归一化对每个样本的所有特征进行归一化,不依赖批次统计量,更适合序列数据。
1.5 Transformer的变体与优化
1.5.1 编码器-only模型
BERT(Bidirectional Encoder Representations from Transformers):
- 仅使用Transformer编码器
- 双向上下文建模
- 预训练任务:掩码语言模型 + 下一句预测
- 适用于:文本分类、命名实体识别、问答等理解任务
1.5.2 解码器-only模型
GPT(Generative Pre-trained Transformer)系列:
- 仅使用Transformer解码器
- 自回归生成,从左到右
- 预训练任务:语言建模(预测下一个词)
- 适用于:文本生成、对话、代码生成
1.5.3 编码器-解码器模型
T5(Text-to-Text Transfer Transformer):
- 完整的编码器-解码器结构
- 所有任务统一为文本到文本的转换
- 适用于:机器翻译、摘要、问答等
1.5.4 高效Transformer变体
标准Transformer的自注意力计算复杂度为$O(n^2)$,对于长序列是瓶颈。主要改进方向:
稀疏注意力:
- Longformer:结合局部窗口注意力和全局注意力
- BigBird:随机注意力 + 窗口注意力 + 全局注意力
- 理论证明:稀疏注意力可以近似全注意力
线性注意力:
- 通过核技巧或矩阵分解,将复杂度降至$O(n)$
- Performer、Linear Transformer等
分层注意力:
- 先对token进行聚类或压缩
- 在粗粒度表示上进行注意力计算
1.6 注意力机制的可解释性
注意力可视化
注意力权重天然具有可解释性。通过可视化注意力矩阵,可以观察模型关注输入的哪些部分:
- 编码器自注意力:显示输入序列内部的关系
- 解码器自注意力:显示生成过程中的依赖
- 交叉注意力:显示输出与输入的对齐关系
注意力作为解释工具
注意力权重可以回答“模型在决策时关注了什么”。例如:
- 机器翻译中,可以看到源语言词与目标语言词的对应
- 情感分析中,可以看到影响分类的关键词
注意力的局限性
- 注意力权重不等于特征重要性
- 多头注意力的可解释性较复杂
- 注意力分布可能集中在特定token(如[CLS])
1.7 注意力机制的应用领域
自然语言处理:
- 机器翻译、文本摘要、问答系统
- 预训练语言模型(BERT、GPT、T5)
- 信息抽取、情感分析
计算机视觉:
- 视觉Transformer(ViT):将图像分割为patch,应用Transformer
- 目标检测(DETR):端到端目标检测
- 图像生成(DALL-E、Stable Diffusion)
多模态学习:
- 图像-文本对齐(CLIP)
- 视觉问答
- 文生图、图生文
其他领域:
- 语音识别
- 蛋白质结构预测(AlphaFold)
- 推荐系统
- 时间序列预测
2. 例题分析
例题1:缩放点积注意力计算
题目:给定查询$Q = [1, 0, 1]$,键矩阵$K = \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 1 \\ 1 & 1 & 0 \end{bmatrix}$,值矩阵$V = \begin{bmatrix} 2 & 3 \\ 1 & 4 \\ 5 & 2 \end{bmatrix}$,$d_k = 3$。计算注意力输出。
分析过程:
步骤1:计算$QK^T$
$$QK^T = [1, 0, 1] \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 1 \\ 1 & 1 & 0 \end{bmatrix}$$
$$= [1\times1 + 0\times0 + 1\times1,\; 1\times0 + 0\times1 + 1\times1,\; 1\times1 + 0\times1 + 1\times0]$$
$$= [2, 1, 1]$$
步骤2:缩放
$$\frac{QK^T}{\sqrt{d_k}} = \frac{[2, 1, 1]}{\sqrt{3}} \approx [1.155, 0.577, 0.577]$$
步骤3:Softmax
$$\text{softmax}([1.155, 0.577, 0.577])$$
计算指数:
- $\exp(1.155) \approx 3.174$
- $\exp(0.577) \approx 1.781$
- $\exp(0.577) \approx 1.781$
求和:$3.174 + 1.781 + 1.781 = 6.736$
注意力权重:
- $\alpha_1 = 3.174 / 6.736 \approx 0.471$
- $\alpha_2 = 1.781 / 6.736 \approx 0.264$
- $\alpha_3 = 1.781 / 6.736 \approx 0.264$
步骤4:加权求和
$$\text{Output} = 0.471 \times [2, 3] + 0.264 \times [1, 4] + 0.264 \times [5, 2]$$
$$= [0.942, 1.413] + [0.264, 1.056] + [1.320, 0.528]$$
$$= [2.526, 2.997]$$
结论:注意力输出约为$[2.53, 3.00]$,注意力主要集中在第一个键值对(权重0.471)。
例题2:多头注意力分析
题目:假设$d_{model} = 4$,头数$h = 2$,输入$X = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}$(2个token,每个2维,为简化假设已投影)。给定: - 头1:$W_1^Q = W_1^K = W_1^V = I$(单位矩阵) - 头2:$W_2^Q = W_2^K = W_2^V = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}$(交换矩阵) - $W^O = I$
计算多头注意力输出。
分析过程:
头1计算:
$Q_1 = K_1 = V_1 = X = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}$
$$Q_1K_1^T = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}$$
Softmax(按行): $$\text{softmax}\left(\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}\right) = \begin{bmatrix} 0.731 & 0.269 \\ 0.269 & 0.731 \end{bmatrix}$$
(假设$d_k=2$,不缩放简化计算)
$$\text{head}_1 = \begin{bmatrix} 0.731 & 0.269 \\ 0.269 & 0.731 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} 0.731 & 0.269 \\ 0.269 & 0.731 \end{bmatrix}$$
头2计算:
$Q_2 = K_2 = V_2 = X \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}$
$$Q_2K_2^T = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}$$
$$\text{head}_2 = \begin{bmatrix} 0.731 & 0.269 \\ 0.269 & 0.731 \end{bmatrix} \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} = \begin{bmatrix} 0.269 & 0.731 \\ 0.731 & 0.269 \end{bmatrix}$$
拼接与输出:
$$\text{Concat} = [\text{head}_1, \text{head}_2]$$
对于token 1:$[0.731, 0.269, 0.269, 0.731]$ 对于token 2:$[0.269, 0.731, 0.731, 0.269]$
由于$W^O = I$且假设输出维度匹配,多头注意力输出为上述拼接结果。
分析: - 头1保留了原始特征 - 头2交换了特征维度 - 多头机制允许模型同时学习不同视角的表示
例题3:位置编码计算
题目:计算位置编码,$d_{model} = 4$,位置$pos = 0, 1, 2$。
分析过程:
使用公式: - $PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})$ - $PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})$
对于$d_{model} = 4$,维度$i = 0, 1$。
位置0:
$i = 0$:$10000^{0/4} = 1$ - $PE_{(0,0)} = \sin(0/1) = 0$ - $PE_{(0,1)} = \cos(0/1) = 1$
$i = 1$:$10000^{2/4} = 100$ - $PE_{(0,2)} = \sin(0/100) = 0$ - $PE_{(0,3)} = \cos(0/100) = 1$
$PE_0 = [0, 1, 0, 1]$
位置1:
$i = 0$: - $PE_{(1,0)} = \sin(1/1) = \sin(1) \approx 0.841$ - $PE_{(1,1)} = \cos(1) \approx 0.540$
$i = 1$: - $PE_{(1,2)} = \sin(1/100) \approx 0.010$ - $PE_{(1,3)} = \cos(1/100) \approx 0.999$
$PE_1 \approx [0.841, 0.540, 0.010, 0.999]$
位置2:
$i = 0$: - $PE_{(2,0)} = \sin(2) \approx 0.909$ - $PE_{(2,1)} = \cos(2) \approx -0.416$
$i = 1$: - $PE_{(2,2)} = \sin(2/100) \approx 0.020$ - $PE_{(2,3)} = \cos(2/100) \approx 0.998$
$PE_2 \approx [0.909, -0.416, 0.020, 0.998]$
验证相对位置性质:
$PE_{pos+k}$应该是$PE_{pos}$的线性函数。对于维度0: - $\sin(pos + k)$可以表示为$\sin(pos)\cos(k) + \cos(pos)\sin(k)$ - 这验证了位置编码可以学习相对位置
3. 训练题
一、选择题
1. Transformer中引入$\frac{1}{\sqrt{d_k}}$缩放因子的主要目的是:
A. 提高计算速度 B. 防止softmax梯度消失 C. 增加模型容量 D. 减少内存使用
2. 自注意力机制中,查询、键、值来自:
A. 三个不同的输入序列 B. 同一输入序列的不同投影 C. 编码器、解码器和嵌入层 D. 随机初始化
3. 多头注意力的主要优势是:
A. 减少计算量 B. 在不同子空间学习多种依赖关系 C. 简化模型结构 D. 不需要位置编码
4. Transformer使用什么机制注入位置信息?
A. 循环连接 B. 卷积操作 C. 位置编码 D. 门控机制
5. 以下哪个是解码器-only架构的模型?
A. BERT B. GPT C. T5 D. ViT
二、填空题
6. 注意力机制的三个核心组件$\_\_\_\_$、$\_\_\_\_$和$\_\_\_\_$。
7. Transformer编码器包含$\_\_\_\_$个相同的层,每层有$\_\_\_\_$个子层。
8. 层归一化与批归一化的主要区别是层归一化对$\_\_\_\_$进行归一化,不依赖$\_\_\_\_$统计量。
9. 残差连接的公式是$\text{LayerNorm}(x + \text{________}(x))$。
10. 标准Transformer自注意力的计算复杂度是$O(n^{________})$。
三、计算题
11. 给定$Q = [2, 1]$,$K = \begin{bmatrix} 1 & 2 \\ 2 & 1 \end{bmatrix}$,$V = \begin{bmatrix} 3 & 1 \\ 2 & 4 \end{bmatrix}$,$d_k = 2$。计算注意力输出。
12. 计算位置编码:$d_{model} = 4$,$pos = 1$,维度索引$i = 0$的$PE_{(1,0)}$和$PE_{(1,1)}$。
13. 假设注意力权重为$[0.5, 0.3, 0.2]$,对应的值为$\begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix}$,计算加权输出。
4. 答案与解析
一、选择题答案:
1. 答案:B
解析:缩放因子防止点积值过大,避免softmax进入梯度极小的饱和区域。
2. 答案:B
解析:自注意力中,Q、K、V来自同一序列,通过不同的投影矩阵$W_Q, W_K, W_V$得到。
3. 答案:B
解析:多头注意力允许模型在不同表示子空间中学习不同类型的依赖关系。
4. 答案:C
解析:Transformer使用正弦/余弦位置编码显式注入位置信息,替代RNN的隐式位置建模。
5. 答案:B
解析:GPT仅使用Transformer解码器,BERT仅使用编码器,T5使用完整的编码器-解码器。
二、填空题答案:
6. 答案:查询(Query);键(Key);值(Value)
解析:注意力机制的核心三元组,查询与键计算相似度,值提供实际内容。
7. 答案:6(或N);2
解析:原论文使用6层编码器,每层包含多头自注意力和前馈网络两个子层。
8. 答案:每个样本的所有特征;批次
解析:层归一化沿特征维度归一化,批归一化沿批次维度归一化。
9. 答案:Sublayer
解析:残差连接将子层输出与输入相加,再经过层归一化。
10. 答案:2
解析:自注意力需要计算$n \times n$的注意力矩阵,复杂度为$O(n^2)$。
三、计算题答案:
11. 解答:
$QK^T = [2, 1] \begin{bmatrix} 1 & 2 \\ 2 & 1 \end{bmatrix} = [2\times1 + 1\times2,\; 2\times2 + 1\times1] = [4, 5]$
缩放:$[4, 5] / \sqrt{2} \approx [2.828, 3.536]$
Softmax:
- $\exp(2.828) \approx 16.92$
- $\exp(3.536) \approx 34.31$
- 和 $\approx 51.23$
- $\alpha_1 = 16.92 / 51.23 \approx 0.330$
- $\alpha_2 = 34.31 / 51.23 \approx 0.670$
输出:$0.330 \times [3, 1] + 0.670 \times [2, 4] = [0.990, 0.330] + [1.340, 2.680] = [2.330, 3.010]$
12. 解答:
对于$i = 0$:$10000^{0/4} = 1$
$PE_{(1,0)} = \sin(1/1) = \sin(1) \approx 0.841$
$PE_{(1,1)} = \cos(1/1) = \cos(1) \approx 0.540$
13. 解答:
$\text{Output} = 0.5 \times [1, 2] + 0.3 \times [3, 4] + 0.2 \times [5, 6]$
$= [0.5, 1.0] + [0.9, 1.2] + [1.0, 1.2]$
$= [2.4, 3.4]$