====== 第八章 注意力机制与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]$