一、稀疏注意力是什么?
1. 原始注意力的"痛点"
想象你在一个有10000人的大派对 上,你需要和每个人握手、聊天,才能了解整个派对的情况。
这就像 Transformer 的原始注意力机制:
- 每个"词"(Token)都要和所有其他词计算关系(注意力分数)。
- 如果句子长度是
L,计算量就是L × L(平方级)。 - 当
L很大时(比如 10000),计算量会爆炸(1亿次运算),速度超慢,还特别占内存。
2. 稀疏注意力的"聪明做法"
稀疏注意力的核心思想是:
不是所有人都需要认识,只和重要的人聊天就行!
比如:
- 只和身边的人聊(局部窗口):你只关注前后几个人,比如前后 50 人。
- 只找关键人物聊(全局Token):派对主持人、明星、领导这些人,你必须和他们聊。
- 随机认识几个陌生人(随机注意力):偶尔找几个不认识的人,扩大社交圈。
这样一来,计算量就从 L × L 降到了 L × 常数(比如 L × 100),速度大大提升。
3. 稀疏注意力的好处
- 更快:计算量减少,模型训练和推理速度提升。
- 更省内存:不需要存储巨大的注意力矩阵。
- 能处理更长的文本:比如一本书、一篇长论文,甚至整个代码库。
二、稍微深入一点:稀疏注意力的常见类型
现在我们用**"派对社交策略"**来类比几种常见的稀疏注意力:
1. 局部窗口注意力(Local Window)
- 做法 :每个词只关注它前后
w个词(比如w=256)。 - 类比:在派对上,你只和你桌子附近的人聊天。
- 优点 :简单、高效,适合处理有局部依赖的数据(比如语言、代码)。
- 缺点:长距离关系可能捕捉不到。
2. 全局注意力(Global Attention)
- 做法 :选几个"特殊词"(比如句子开头的
[CLS]、标题词),让它们能关注所有词;其他词只关注局部。 - 类比:派对主持人可以和所有人聊天,其他人只和周围人聊。
- 优点:既能处理局部依赖,又能捕捉全局关系。
- 缺点:特殊词的选择需要人工设计。
3. 随机注意力(Random Attention)
- 做法:每个词除了关注局部窗口,还随机选几个其他词关注。
- 类比:除了和身边人聊天,偶尔随机找几个人认识一下。
- 优点:增加长距离连接的机会,提高模型的表达能力。
- 缺点:随机性可能引入噪声。
4. 局部敏感哈希注意力(LSH Attention)
- 做法:用一种"哈希"方法,把相似的词分到同一个"小组",每个词只和同组的词计算注意力。
- 类比:派对按兴趣分组(比如"AI组"、"音乐组"),你只和同组的人聊天。
- 优点:能高效捕捉语义相似的长距离依赖。
- 缺点:哈希函数的设计比较复杂。
5. 低秩投影注意力(Linformer)
- 做法:用一个小矩阵把 Key 和 Value 压缩,减少计算量。
- 类比:派对上,你不需要记住每个人的名字,只需要记住几个"代表"的名字。
- 优点:理论优雅,完全兼容原始 Transformer。
- 缺点:压缩可能损失一些信息。
三、再深入一点:稀疏注意力的核心优势
1. 复杂度对比
- 原始注意力 :
O(L²)(平方级) - 稀疏注意力 :
O(L × w)(线性级,w是窗口大小或哈希桶数)
举例:
- 当
L = 10000,原始注意力需要10000 × 10000 = 1亿次运算。 - 稀疏注意力如果
w = 100,只需要10000 × 100 = 100万次运算(快 100 倍)。
2. 适用场景
- 长文本处理:比如一本书、一篇长论文、整个代码库。
- 高分辨率图像:每个像素点只关注周围区域。
- 语音识别:长音频序列的局部依赖建模。
四、常见稀疏注意力模型速查表
| 模型 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|
| Longformer | 局部窗口 + 全局Token | 简单高效,支持超长文本 | 长距离依赖较弱 |
| BigBird | 局部 + 全局 + 随机 | 兼顾局部和全局,效果好 | 随机部分可能引入噪声 |
| Reformer | LSH哈希分组 | 高效捕捉语义相似依赖 | 哈希函数设计复杂 |
| Linformer | 低秩投影压缩 | 理论优雅,兼容原始架构 | 压缩可能损失信息 |
| Sparse Transformer | 块稀疏 + 混合模式 | 灵活,可定制稀疏结构 | 实现复杂 |
五、总结
小白一句话总结:
稀疏注意力就是让模型"选择性地关注重要信息",而不是"和所有人都打交道",从而让模型在处理长文本时更快、更省内存。
技术一句话总结:
稀疏注意力通过限制注意力计算的范围(局部窗口、全局Token、哈希分组等),将复杂度从 O(L²) 降至 O(L × w),是处理超长序列的关键技术。