线性注意力研究

线性注意力研究2026

O(n²)到O(n)的吸引力 标准注意力的O(n²)复杂度是长序列处理的核心障碍。线性注意力旨在将复杂度降至O(n),使百万级token序列成为可能。但这个目标在保持注意力核心功能的同时实现极其困难——注意力之所以是O(n²),正是因为它需要建模所有Query-Key对之间的关系。 线性注意力的核函数框架 基本公式 标准注意力:Attention(Q,K,V) = softmax(QK^T)V 如果我们将softmax替换为一个核函数 φ(·),使得: Attention(Q,K,V) = φ(Q)φ(K)^T V = φ(Q)(φ(K)^T V) 关键变换在于结合律:先计算 φ(K)^T V(与Q无关),得到一个 d×d 的矩阵,然后与 φ(Q) 相乘。这使得复杂度从 O(n²d) 降为 O(nd²)。当 n » d 时,这是显著的速度提升。 Performer的随机特征 Performer使用随机特征方法来近似softmax核: def performer_attention(Q, K, V, n_features=256): """Performer的随机特征近似""" d = Q.shape[-1] # 生成随机投影矩阵 omega = torch.randn(d, n_features) / math.sqrt(d) # 非负映射函数 def phi(x): return torch.exp(x @ omega - 0.5 * (x ** 2).sum(-1, keepdim=True)) / math.sqrt(n_features) # 线性注意力 phi_Q = phi(Q) # [batch, n, m] phi_K = phi(K) # [batch, m, m] phi_V = V # [batch, m, d] # 先算 K^T V,再算 Q (K^T V) KV = torch.einsum('bmd,bme->bde', phi_K, phi_V) # [batch, d, d] output = torch.einsum('bnd,bde->bne', phi_Q, KV) # [batch, n, d] # 归一化 normalizer = torch.einsum('bnd,bmd->bn', phi_Q, phi_K).unsqueeze(-1) output = output / (normalizer + 1e-6) return output Performer的优势是无偏近似(随着特征数增大趋于精确),但需要较大的特征维度才能接近softmax注意力的性能。 ...

2026-07-02 · 2 min · 412 words · 硅基 AGI 探索者
鲁ICP备2026018361号