目的

为避免一学就会、一用就废,这里做下笔记

说明

  1. 本文内容紧承前文-Transformer架构1-整体介绍Transformer架构2-自注意力Transformer架构3-嵌入和位置编码,欲渐进,请循序
  2. 本文重点介绍Transformer架构中的多种注意力,它们在编码器堆栈和解码器堆栈中都有用到
    在这里插入图片描述

概述

在前文Transformer架构2-自注意力中,讲到上图中的1号、2号注意力都是自注意力,而在详细架构图中,他们又被描述为多头注意力、掩码注意力等。诸多概念容易让人混淆,必须澄清:这些注意力的类型并非互斥,他们只是从不同的角度对注意力机制进行的分类

  • 按Q、K、V的不同来源分类

    • 自注意力:Q、K、V来自同一个序列
    • 交叉注意力:Q、K、V来自不同的序列,上图3号编码器-解码器注意力是一种具体的交叉注意力,它的Q来自解码器(的输出序列),K、V来自编码器(的输出序列)
  • 按Q、K、V的数量分类

    • 多头注意力:将 Q、K、V 投影到多个子空间,并行计算多个注意力,然后拼接
    • 单头注意力:只有一个注意力头,即只有一组Q、K、V
  • 按信息可见性进行分类

    • 掩码注意力:通过掩码矩阵限制某些 token 对之间的注意力权重(通常设为 -∞),使其在 softmax 后接近 0。目的是控制信息流动,防止信息泄漏。架构图中,2号注意力是掩码注意力的一个子类-因果掩码注意力,它只能看到当前及之前的 token(因为解码器下一刻的输出还不知道)
    • 非掩码注意力:所有 token 对之间都可以自由计算注意力,无访问限制。如上图中1号和3号都是非掩码注意力

按照上述说明,上图1-3号注意力详细分类如下

  1. 1号注意力,属于多头注意力、自注意力、非掩码注意力
  2. 2号注意力,属于多头注意力、自注意力、掩码注意力
  3. 3号注意力,属于多头注意力、交叉注意力、非掩码注意力

多头注意力详解

在这里插入图片描述

什么是多头注意力

从本质上看:多头注意力是一种将信息的表示空间进行分解的注意力。 它将一个标准的注意力过程分解为多个并行的"头",每个头在不同的表示子空间中学习不同的注意力模式,最后将所有头的输出拼接并线性变换。
从形式上看:多头注意力使用多组 W Q W^Q WQ W K W^K WK W V W^V WV矩阵,标准单头注意力则仅使用一组。

多头注意力的每个头是什么

每个"头"本质上是一个独立的注意力计算单元,包含三个关键部分:

1. 独立的参数投影Q、K、V

2. 独立的注意力计算过程:

head_i = Attention(head_i_Q, head_i_K, head_i_V)
  • 每个头在自己的子空间中计算注意力权重
  • 计算公式相同: s o f t m a x ( Q K T / √ d k ) V softmax(QKᵀ/√d_k)V softmax(QKT/√dk)V

3. 独立的信息聚焦

不同的头可能会自发地学习关注不同类型的信息

  • 头1:可能关注语法结构(如主谓关系)
  • 头2:可能关注语义角色(如施事、受事)
  • 头3:可能关注长距离依赖
  • 头4:可能关注局部短语结构

示例(翻译任务:“The animal didn’t cross the street because it was too tired”):

头1关注 "it" → "animal" (指代关系)
头2关注 "didn't" → "cross" (否定修饰)
头3关注 "cross" → "street" (动宾关系)
头4关注 "tired" → "animal" (属性描述)

多头注意力的优缺点

方面 优点 缺点
🎯 表示能力 1. 多视角学习:同时捕捉语法、语义、指代等多种关系
2. 特征多样性:类似CNN多滤波器,提取不同模式特征
3. 表达能力增强:超越单头注意力的表示上限
1. 冗余风险:多个头可能学习相似模式,造成参数浪费
2. 协调困难:不同头之间需要良好配合,优化难度增加
⚡ 计算效率 1. 并行加速:多个头可完全并行计算,GPU利用率高
2. 维度分解:单头维度降低(d_k = d_model/h),矩阵乘法更高效
3. 复杂度优化:理论复杂度从 O(n²·d_model²) 降至 O(n²·d_model²/h)
1. 实际开销:拼接、投影、数据移动增加额外开销
2. 内存消耗:需存储所有头的中间结果,内存占用显著增加
3. 通信成本:分布式训练时,多头的梯度同步成本高
🔄 模型性能 1. 泛化提升:类似集成学习效应,减少过拟合
2. 收敛加速:多路径学习有助于梯度流动
3. 鲁棒性增强:部分头失效时,其他头可补偿
1. 僵尸头问题:部分头学习不到有效模式,成为"死头"
2. 不稳定训练:多头竞争可能导致训练波动
3. 过参数化:小数据集上容易过拟合
🔍 可解释性 1. 模式可视化:可分析不同头关注的语义/语法模式
2. 调试友好:通过头分析定位模型问题
3. 结构洞察:揭示模型学习到的语言学结构
1. 解读误导:注意力权重≠重要性,可能被过度解读
2. 模式混合:实际中头常学习混合特征,边界模糊
3. 分析复杂度:需要专门工具分析多头注意力模式
🔧 工程实现 1. 模块化设计:结构清晰,易于实现和扩展
2. 兼容性好:与各种优化技术(混合精度、梯度检查点)兼容
3. 社区支持:主流框架均有优化实现
1. 实现复杂度:比单头注意力实现更复杂
2. 批处理限制:不同头可能对批大小敏感
3. 部署挑战:边缘设备上多头计算资源要求高
📊 资源消耗 1. 计算分解:大矩阵分解为小矩阵,适合硬件优化
2. 灵活配置:可根据资源调整头数
1. 参数量增加:增加约 (3h+1)/4 倍参数(相比单头)
2. 激活值存储:前向传播需存储多头中间结果,内存峰值高
3. 能耗增加:移动端/边缘设备能耗显著增加
🎓 学习动态 1. 多目标优化:不同头可专注不同子任务
2. 避免局部最优:多起点搜索提高找到全局最优概率
1. 优化冲突:不同头的梯度方向可能冲突
2. 学习不平衡:某些头学习快,某些学习慢
3. 超参数敏感:头数选择对性能影响大,需精细调参

掩码注意力详解

什么是掩码注意力

掩码注意力是在注意力计算中,通过一个掩码矩阵强制让某些位置的注意力权重变为零(或接近零),从而限制信息流动方向的注意力机制。
下图分别呈现了1-3号注意力的权重关系特征,其中2号掩码自注意力中,每个token只能向前关注,无法向后关注,因为后面的token还没有生成。
在这里插入图片描述

为什么用掩码注意力

  • 保证自回归性(因果掩码):防止解码时看到未来信息,确保逐词生成
  • 处理变长序列(填充掩码):忽略padding位置,聚焦有效内容
  • 预训练任务需求(随机掩码):如BERT的MLM任务,随机遮盖部分token
  • 提升计算效率(稀疏掩码):减少注意力计算量,处理长序列

掩码自注意力怎么计算

计算公式如下图:
在这里插入图片描述
掩码逻辑示意如下:

在这里插入图片描述

注意:之所以这里用 − ∞ -∞ ,是因为后续softmax函数中的 e x e^x ex,当x是 − ∞ -∞ e x e^x ex趋近于0

编解码注意力

即传统的注意力机制,只是它的K和V来自于编码器的输出,Q来自于解码器自身之前的输出,传统注意力机制的说明,详见前文-注意力机制

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐