
自注意力(Self-Attention)的计算复杂度问题

Local Attention
🌟 一、为什么需要 Local Attention?
先回忆一下普通的 Self-Attention:
每个词都要对序列中 所有其他词 计算注意力权重。
如果句子长度是 n,
则计算量是 \(O(n^2)\)。
比如句子 2000 个词,那要算 4,000,000 次注意力分数!
—— 这在长序列任务(如文档理解、语音、视频)中太慢太占显存。
于是,就有了 Local Attention(局部注意力)。
⚙️ 二、Local Attention 的核心思想
每个词只关注它附近的词(一个窗口范围),而不是整个句子。
换句话说,
模型不再全局计算 \(QK^T\),而是只在一个“局部窗口”内计算。
🧠 举个例子
假设句子有 10 个词,窗口大小(window size)= 3
那么第 5 个词只会关注:
第 4、5、6 个词
也就是说,
注意力矩阵不再是全密集的,而是稀疏的(只保留邻近元素)。
🧮 三、公式区别
标准 Attention:
\(\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V\)
Local Attention:
\(\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + M_{\text{local}}\right)V\)
其中$ M_{\text{local}}$是一个 mask(掩码矩阵),
用于屏蔽掉超出窗口范围的元素(用 \(-\infty\)表示)。
📊 四、直观图解(文字版)
| 类型 | 注意力范围 | 复杂度 | 说明 | 
|---|---|---|---|
| Global (标准) | 全部词 | O(n²) | 每个词都看全局 | 
| Local | 邻近词(窗口 w) | O(n·w) | 每个词只看局部 | 
| Sparse / Longformer 等 | 局部 + 选定全局 | 介于两者之间 | 更高效又保留上下文 | 
🔍 五、Local Attention 的几种实现形式
| 类型 | 描述 | 
|---|---|
| Fixed window | 每个词看固定窗口(如前后各 32 个词) | 
| Sliding window | 使用滑动窗口覆盖整段文本(Longformer 用的) | 
| Dilated window | 跳跃式关注(如每隔 k 个词取一个) | 
| Block local | 将句子分块,每个块内部自注意力,块之间偶尔通信(如 BigBird) | 
🚀 六、优缺点总结
| 优点 | 缺点 | 
|---|---|
| ✅ 大幅减少计算量和显存占用 | ❌ 无法捕捉长距离依赖 | 
| ✅ 可以处理更长的序列 | ❌ 需要窗口设计得合理 | 
| ✅ 更容易并行化 | ❌ 某些任务(如翻译)全局上下文仍然重要 | 
🧩 七、与其他注意力的对比
| 类型 | 描述 | 代表模型 | 
|---|---|---|
| Full Attention | 每个词都看全部 | Transformer | 
| Local Attention | 每个词只看邻近词 | Transformer-XL(部分层)、Longformer | 
| Sparse Attention | 只看部分重要词 | BigBird, Sparse Transformer | 
| Global Attention | 部分“关键词”能看全局 | Longformer, BigBird | 

Stride Attention
Stride Attention(步进注意力) 是一种在 长序列建模 或 高效 Transformer 中常用的注意力机制变体。
它的核心思想是:
不是每个 token 都与所有 token 计算注意力,而是“隔一定步长”地关注部分 token。
这样能降低计算量、节省显存,同时保留序列的全局感知能力。
🌟 一、为什么需要 Stride Attention?
在标准 Self-Attention 中:
- 每个词都要与所有词交互;
- 计算量是\(O(n^2)\);
- 对于超长序列(几千、上万 token),几乎不可行。
于是出现了各种“稀疏注意力”机制(Sparse Attention):
- Local Attention:只看邻居(局部窗口)
- Stride Attention:隔固定步长采样
- Block Attention:划块后在块内/块间注意
- Global Attention:只让部分 token 全局可见(如长文摘要)
⚙️ 二、Stride Attention 的核心思想
Stride Attention 让注意力只发生在“每隔 s 个 token”之间,
其中 sss 就是 stride(步长)。
📘 举例:
假设序列是:
[ x₁, x₂, x₃, x₄, x₅, x₆, x₇, x₈ ]
如果 stride = 2
则:
- x₁ 关注
- x₂ 关注
换句话说,每个 token 只和某个“分组”内的点计算注意力。
🧮 三、数学表达
对于第 i 个 token,
它的注意力范围是:
\(S_i = \{ j \mid j \equiv i \ (\text{mod } s) \}\)
然后只在这个集合内计算:
\(\text{Attention}(Q_i, K_{S_i}, V_{S_i}) = \text{softmax}\left(\frac{Q_i K_{S_i}^T}{\sqrt{d_k}}\right)V_{S_i}\)
🧠 四、直观理解
| 类比 | 说明 | 
|---|---|
| 👀 Local Attention | 每个词只看“身边的邻居” | 
| 🪜 Stride Attention | 每个词隔一定距离“采样性地看”其他词 | 
| 🧠 结合效果 | 既能看局部,又能跨距获取部分全局信息 | 
⚡ 五、优缺点
| 优点 | 缺点 | 
|---|---|
| 🚀 大幅减少计算量 | 可能丢失部分依赖信息 | 
| 💾 占用显存少 | 不能捕获所有细节 | 
| 🔗 适合长序列任务(语音、视频、文档) | 需设计合适的 stride | 
🧩 六、常见应用
- Longformer / BigBird:结合 Local + Stride + Global Attention(形成混合稀疏模式)
- Transformer-XL / Sparse Transformer:通过步进或块稀疏模式加速
- 视频理解 / 音频信号处理:token 间高度冗余,用 stride 节点采样最关键特征
🧮 七、和 Local Attention 的区别
| 对比项 | Local Attention | Stride Attention | 
|---|---|---|
| 关注范围 | 当前词周围窗口 | 隔固定步长的词 | 
| 感知模式 | 连续局部 | 离散抽样 | 
| 捕获信息 | 细节丰富 | 稀疏但覆盖更广 | 
| 常用于 | 文本、图像 patch | 音频、长序列稀疏采样 | 
💬 八、一句话总结
Stride Attention 就是“隔点看世界”的注意力机制。
它通过跳步关注,降低计算复杂度,同时保留跨距离的信息联系。

Global Attention
🌍 一、Global Attention 是什么?
Global Attention(全局注意力) 让一部分 特殊的 token(例如标题、摘要、分类标记)
可以“看到”整个序列中的所有 token,
同时,也允许其他 token 去关注这些全局 token。
简单说:
局部 token 看局部,全局 token 看全局。
⚙️ 二、为什么需要 Global Attention?
标准 Self-Attention 的计算量是:
\(O(n^2)\)
→ 太大,不适合几千上万长度的输入。
\(Local / Stride Attention\) 虽然降了复杂度,但它们只能看到“附近”或“采样点”,
会丢失全局语义,比如:
- 文档主题;
- 段落间依赖;
- 全局情感走向。
于是我们引入 Global Attention,
让一小部分 token 充当“信息中心”,帮助信息在全局传播。
🔢 三、工作机制(以 Longformer 为例)
假设序列是:
[CLS]  A  B  C  D  E  F  G  [SEP]
🔹 Local Attention:
- 每个词(如 B)只看附近窗口(例如 {A,B,C})
🔹 Global Attention:
- 特定 token(如 [CLS]、[SEP])
 可以:- 看见所有 token;
- 被所有 token 看见。
 
换句话说:
- [CLS]↔ 全部单词都能互相注意;
- 普通词之间仍然是局部窗口。
🧮 四、数学表达
若将所有 token 分为两组:
- 普通 token:局部注意力区域 \(L_i\)
- 全局 token:全局注意力区域 \(G\)
则注意力矩阵变成:
\(A_{ij} = \begin{cases} \text{attention}(i, L_i), & i \notin G \\ \text{attention}(i, \text{all tokens}), & i \in G \end{cases}\)
同时,所有 token 都能看到 G。
💡 五、直观理解(比喻)
| 类型 | 比喻 | 说明 | 
|---|---|---|
| Local Attention | 👂 “每个人只听附近几个人说话” | 节省计算,但信息传播慢 | 
| Stride Attention | 🧩 “每隔几个人听一次” | 信息稀疏传播 | 
| Global Attention | 🗣 “有几个人能对全场讲话,大家都能听到” | 信息中心 / 汇总节点 | 
⚡ 六、优缺点
| 优点 | 缺点 | 
|---|---|
| 🚀 信息可跨全局传播 | 仍需为全局 token 计算全连接(略贵) | 
| 💬 保留全局语义(文档主题、总结等) | 需手动指定哪些 token 是“全局” | 
| 💾 与 Local/Stride 结合后效率高 | 单独使用仍昂贵 | 
🧩 七、典型应用
| 模型 | 说明 | 
|---|---|
| Longformer (2020) | 结合 Local + Global Attention 处理长文档 | 
| BigBird (Google) | 结合 Block + Global + Random Attention(稀疏近似全局) | 
| Transformer-XL / ETC | 使用记忆机制实现跨段全局依赖 | 
| BERT (CLS token) | [CLS]实际上就是一种全局注意力机制! | 
📘 八、总结对比表
| 注意力类型 | 范围 | 典型用途 | 计算复杂度 | 
|---|---|---|---|
| Local Attention | 附近窗口 | 局部上下文、细节 | \(O(n \cdot w)\) | 
| Stride Attention | 隔点采样 | 稀疏全局信息 | \(O(n \cdot s)\) | 
| Global Attention | 全序列 | 主题 / 汇总信息 | \(O(n \cdot g)\)(g为全局token数) | 
🧠 九、一句话总结
Global Attention 就是“全局视野的节点”。
它让少数 token(如[CLS])能看见并影响整个序列,
解决长序列中信息传递受限的问题。

小孩子才做选择
Longformer 使用了3个
Big Bird 使用了4个

Clustering(分类)
同一类的才计算Attention


Learnable Patterns
这张图展示了基于 Sinkhorn 排序网络的 “可学习注意力模式(Learnable Patterns)”,核心是让模型自主学习 “哪些注意力交互需要计算,哪些可以跳过”,从而优化自注意力的效率。
- 
左图:可学习的注意力稀疏模式
- Query 与 Key:传统自注意力中,每个 Query 要与所有 Key 计算相似度(形成(\(N \times N\))的全连接注意力矩阵)。但在这张图中,注意力矩阵是稀疏的(只有深蓝色格子表示需要计算的注意力对,其他格子可跳过)。
- Sinkhorn 排序网络的作用:通过可微分的排序机制,让模型学习到 “哪些 Query-Key 对是重要的,需要计算注意力;哪些是无关的,可以跳过”。这种稀疏化是数据驱动、可学习的,而非人工预设的固定模式(如局部窗口)。
- 
右图:输入序列的处理流程
- Input sequence:原始输入序列(如文本、图像特征序列)。
- NN(神经网络):输入序列先经过一个神经网络模块,该模块的作用是学习生成注意力的稀疏模式—— 即决定哪些 Query-Key 交互需要保留,哪些可以跳过。
- 输出的稀疏表示:经过 NN 处理后,序列的注意力交互被转换为稀疏形式(不同深浅的蓝色块表示不同的注意力权重或是否被保留),从而大幅减少不必要的计算。
- 
核心思想:让模型自主学习稀疏注意力
传统自注意力的(\(O(N^2)\))复杂度是瓶颈,而 Sinkhorn 排序网络的 “可学习模式” 通过以下方式解决:
- 动态稀疏化:不是人工指定 “哪些位置需要计算注意力”,而是让模型通过训练自主学习最优的稀疏模式(如根据数据的语义相关性,只保留关键的 Query-Key 交互)。
- 可微分学习:基于 Sinkhorn 算法的可微分特性,这种稀疏模式的学习可以融入端到端的训练流程,梯度可以反向传播以更新模型参数。
4. 优势
- 效率提升:减少不必要的 Query-Key 计算,将自注意力的复杂度从(\(O(N^2)\))降低到接近(\(O(N)\))或(\(O(N \log N)\))。
- 适应性强:学习到的稀疏模式与数据本身的特性(如语义、结构)强相关,比人工预设的固定模式(如局部窗口)更灵活、更精准。

Compressed Attention
🌟 一、背景
标准 Self-Attention 计算复杂度为:
\(O(n^2 \cdot d)\)
其中 n 是序列长度,d 是特征维度。
当 n 很大(如长文本、视频帧、基因序列)时:
- 内存消耗高
- 计算非常慢
于是出现了 Compressed / Efficient Attention 技术,目标是:
在保留重要上下文信息的同时,降低计算复杂度。
🧩 二、核心思想
Compressed Attention 核心是:
- 压缩 Key/Value
- 将原本长度为 nnn 的 Key/Value 序列压缩为长度 \(m≪n\) 的表示
- 方法包括:
- 池化(Pooling)
- 随机采样(Random Projection)
- 低秩分解(Low-Rank Approximation)
 
 
- 计算注意力
- Query 仍然长度 n
- Key/Value 长度降低到 m
- 计算复杂度从$ O(n^2) $降到 \(O(nm)\)
 
⚙️ 三、数学公式(简化版)
标准注意力:
\(\text{Attention}(Q, K, V) = \text{softmax}\Big(\frac{Q K^\top}{\sqrt{d}}\Big) V\)
压缩注意力:
\(Kc,Vc=Compress(K,V)(长度 m)\text{CompressedAttention}(Q, K, V) = \text{softmax}\Big(\frac{Q K_c^\top}{\sqrt{d}}\Big) V_c\)
通过压缩 K,V 来降低计算量。
🔍 四、直观理解
| 类比 | 说明 | 
|---|---|
| 普通注意力 | 每个人都和所有人交流 → O(n²) | 
| Compressed Attention | 每个人只和“代表性小组”交流 → O(n m) | 
| 核心 | 代表性小组可以用池化、随机采样或聚类得到 | 
💡 五、优缺点
| 优点 | 缺点 | 
|---|---|
| 🚀 计算量低,适合长序列 | 压缩可能丢失部分信息 | 
| 💾 内存消耗低 | 对压缩策略敏感,需要设计好方法 | 
| 🔄 可结合 Local/Global Attention | 压缩矩阵的学习方式影响性能 | 
🧩 六、应用场景
- Longformer / BigBird:长文档注意力优化
- 视频 Transformer:帧序列很长
- 音频信号处理:长音频序列建模
- 基因/生物序列:处理数千到上万长度序列
一句话总结:
Compressed Attention = 压缩 Key/Value 来降低 Self-Attention 的计算量和内存消耗,同时保留序列中最重要的信息。

synthesizer
把这些都当成要学习的参数
🌟 一、背景
标准 Self-Attention 的计算公式:
\(\text{Attention}(Q,K,V) = \text{softmax}\Big(\frac{QK^\top}{\sqrt{d}}\Big) V\)
- 每个 token 的注意力权重依赖于自身的 Query 与其他 token 的 Key 的交互
- 计算量为 \(O(n^2 \cdot d)\),长序列计算成本高
问题:
- Attention 的权重矩阵生成非常依赖输入序列
- 可不可以“预先生成”或者“用可学习模式生成”注意力矩阵?
这就是 Synthesizer 提出的方向。
🧩 二、核心思想
Synthesizer 用两种方式替代标准 Query-Key Attention:
- Learned Synthesizer(可学习权重)
- 注意力权重矩阵直接作为可训练参数
- 不依赖输入 Query 和 Key 的相似度
- 类似 “学习一个固定模式”,训练中优化矩阵,使模型仍能捕获序列依赖
 
- Random Synthesizer(随机权重)
- 注意力权重矩阵用随机初始化,训练过程中不更新
- 表明某些任务不一定需要精确 Query-Key 交互,也能学到有用特征
 
总结:Synthesizer 关注的是“权重模式生成”,而不是每次都通过 Query-Key 计算相似度。
⚙️ 三、公式示例
假设长度为 nnn 的序列:
- Learned Synthesizer
\(A \in \mathbb{R}^{n \times n}, \quad A = \text{learned parameters}\)
\(Output=softmax(A)⋅V\)
- Random Synthesizer
\(A \sim \text{Random Matrix}, \quad \text{Output} = \text{softmax}(A) \cdot V\)
区别于标准 Attention 的$ A = QK^\top / \sqrt{d}$
🔍 四、直观理解
| 类比 | 标准 Self-Attention | Synthesizer | 
|---|---|---|
| 谁决定注意力 | Query 与 Key 的交互 | 可学习权重或随机权重 | 
| 是否依赖输入 | 是 | 否(或部分依赖) | 
| 计算量 | 高,O(n²) | 可降低(固定矩阵或低秩矩阵) | 
| 灵活性 | 高 | 中,但训练可以适应任务 | 
💡 五、优缺点
| 优点 | 缺点 | 
|---|---|
| 🚀 减少 Query-Key 计算,提升效率 | 丢失输入依赖的动态注意力 | 
| 💾 可学习模式,训练中自适应 | 某些任务表现可能略差于标准 Attention | 
| 🔄 适合长序列或嵌入稀疏场景 | 对任务设计敏感,需要实验调整 | 
🧩 六、应用场景
- 长序列建模(如文档、视频)
- 高效 Transformer(减少 Attention 计算)
- 实验性研究:探索是否完全依赖 Query-Key Attention 是必要的
一句话总结:
Synthesizer = 用可学习或随机模式生成注意力矩阵,而不是每次都通过 Query-Key 相似度计算,从而简化 Self-Attention 并降低计算成本。

