共计 2042 个字符,预计需要花费 6 分钟才能阅读完成。
从计算瓶颈到稀疏优化
当我们在 NLP 任务中使用标准 Transformer 时,全连接注意力机制的计算复杂度是 O(n²)。这意味着随着序列长度的增加,计算量会呈平方级增长。举个例子,BERT-base 模型在处理 512 长度的序列时,单层注意力需要约 235M FLOPs,而 Longformer 通过稀疏注意力将这一数字降到了 47M FLOPs——节省了 80% 的计算资源却保持了 95% 的模型精度。

稀疏注意力的三大范式
1. 局部注意力(Local Attention)
数学表达:
$$A_{ij}^{local} = \begin{cases}
Q_iK_j^T & \text{if} |i-j| \leq w \
-\infty & \text{otherwise}
\end{cases}$$
- 只计算当前位置前后 w 个 token 的注意力
- 超参数选择:文本任务通常 w =32~256,蛋白质序列 w =64~512
2. 全局注意力(Global Attention)
数学表达:
$$A^{global} = Q[g_1,…,g_m]K^T$$
- 设计 m 个特殊 token 关注整个序列
- 经验值:m 通常取序列长度的 1%~5%
3. 随机注意力(Random Attention)
数学表达:
$$A_{ij}^{random} = \begin{cases}
Q_iK_j^T & \text{with probability} p \
-\infty & \text{otherwise}
\end{cases}$$
- 每个 token 随机关注 r 个其他位置
- 典型设置:p=0.1~0.3
PyTorch 实现详解
class BlockSparseAttention(nn.Module):
def __init__(self, config):
super().__init__()
self.local_window = config.local_window
self.global_tokens = config.global_tokens
# 投影层
self.qkv = nn.Linear(config.hidden_size, 3*config.hidden_size)
self.proj = nn.Linear(config.hidden_size, config.hidden_size)
# 稀疏模式开关
self.use_local = config.use_local
self.use_global = config.use_global
def forward(self, x, mask=None):
B, N, C = x.shape
qkv = self.qkv(x).chunk(3, dim=-1)
q, k, v = map(lambda t: rearrange(t, 'b n (h d) -> b h n d', h=config.num_heads), qkv)
# 局部注意力计算
if self.use_local:
local_mask = torch.ones(N, N, device=x.device).triu(diagonal=-self.local_window).tril(diagonal=self.local_window)
attn_local = (q @ k.transpose(-2, -1)) * local_mask
# 全局注意力计算
if self.use_global:
global_q = q[:, :, :self.global_tokens]
attn_global = global_q @ k.transpose(-2, -1)
# 合并注意力
attn = attn_local + attn_global
attn = attn.masked_fill(mask == 0, -1e9)
attn = attn.softmax(dim=-1)
# 梯度检查点
if self.training:
output = checkpoint(self._project, attn @ v)
else:
output = self.proj(rearrange(attn @ v, 'b h n d -> b n (h d)'))
return output
性能实测分析
在 PG-19 数据集(平均长度 5k tokens)上的测试结果:
| 模型类型 | 显存占用 | 准确率 |
|---|---|---|
| Full Attention | 48GB | 82.3% |
| Local(256) | 11GB | 81.7% |
| Local+Global | 13GB | 82.1% |
实践避坑指南
- 模式匹配原则
- 文本分类:推荐 Local+Global
- 序列标注:纯 Local 效果更好
-
生成任务:需要加入 Random 注意力
-
混合精度训练
- 16bit 训练时需对 attention scores 做 logit 缩放
- 建议初始缩放因子设为 1 /√d_k
未来研究方向
动态稀疏注意力可以根据输入内容实时调整注意力模式,这种特性在在线学习场景中极具潜力。例如:
– 根据文本复杂度自动调整窗口大小
– 在对话系统中动态分配全局 token
– 基于内容重要性的自适应稀疏模式
稀疏注意力不是对原始 Transformer 的妥协,而是在计算效率和模型性能之间找到的优雅平衡点。随着硬件加速技术的发展,相信会有更多创新的稀疏模式涌现出来。
