想象你是一座藏书百万册的图书馆馆长。读者想找一本关于“星际旅行”的书,标准做法是:这位读者走到书架前,把每一本书都抽出来快速翻阅封面,才能判断哪本最相关——如果书有 n 本,每位读者都要翻 n 次,来 n 位读者就是 n×n 次翻阅。当图书馆从 1 万册增长到 10 万册,翻阅次数不是涨 10 倍,而是暴涨 100 倍!这就是 Transformer 面对长序列时的困境:注意力机制需要把每个词和所有词两两比较,复杂度是平方级。 Performer 的解法非常巧妙:图书馆里来了一位聪明的新管理员,他不再让读者逐本翻书,而是提前为每本书制作一张“简介卡”,卡上写着几个随机抽取的关键词。读者只需要快速比对关键词,就能锁定候选书籍。更妙的是,管理员还把所有的简介卡汇总成一本“主题索引册”,读者直接查索引,连逐张翻卡都省了。于是,原本 n×n 次的翻书变成了 n 次的查表——复杂度从平方级降到了线性级。这就是 Performer 的核近似魔法。本文将用这座“智慧图书馆”的故事,带你彻底理解 Performer 的工作原理、数学细节与工程价值。

岗位关联

掌握 Performer 核近似,你就能让 Transformer 处理超长文本、蛋白质序列等大规模数据时保持线性效率,这是高效 NLP 与多模态模型工程师的核心技能,也是从“会用 Transformer”迈向“能改 Transformer”的关键一步。

目录
  1. 可视化演示
  2. 问题背景:标准注意力的平方瓶颈
  3. 核近似思想:用简介卡代替逐本翻书
  4. 随机特征映射:简介卡怎么制作
  5. 计算顺序:先合成索引表再查询
  6. 正交特征:关键词去重降方差
  7. 精度权衡:卡片精度与制作成本
  8. 性能效率:指数差距的实测
  9. 应用场景:长序列的主场之战
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示Performer通过随机特征将softmax注意力从O(n²)降至O(n)的核近似过程,对比标准Transformer与Performer的复杂度曲线与长序列加速效果。

本节配有交互动效(进入视口后自动加载,约 3KB)。

注意力矩阵:O(n²) vs O(nM)对比 红色为标准注意力n×n矩阵 青色为Performer线性分解 浅青为随机特征映射 softmax(QK^T)V -> phi(Q) phi(K)^T V (M << N) 标准注意力需计算n×n矩阵,Performer通过随机特征分解为n×M,当M远小于N时复杂度从O(n²)降至O(nM)

问题背景:标准注意力的平方瓶颈

在传统的“直接翻书”图书馆里,读者找书的方式很笨拙:他们必须把书架上的每本书依次抽出来,和书背上的“需求标签”比对一遍,才能确定这本书值不值得读。Transformer 的注意力机制干的正是这件事——每个词(读者)都要与序列中的每一个词(书)计算相似度(翻封面),然后按相似度加权提取信息(读内容)。序列中有 n 个词,每个词都要执行 n 次比对,总工作量就是 n×n 次。这听起来还算合理,直到序列变长:处理一篇 1000 字的短文需要 100 万次比对,而处理一篇 10 万字的报告就需要 100 亿次——笔记本的计算力瞬间告急。

这个“逐本翻书”的过程在数学上就是 Softmax 注意力公式。它分为三步:每个查询(Query)去匹配所有键(Key)得到分数,分数经过软组织归一化成权重,最后按权重混合值(Value)的内容。问题恰恰出在第一步和第三步之间的那个 n×n 的矩阵上。

回到我们的图书馆:当藏书量 n 从 1 万涨到 10 万,读者的翻书次数从 1 亿次暴涨到 100 亿次——这就是平方级增长的可怕之处。Performer 要做的,就是派来一位聪明的新管理员,彻底改变这套“翻书”流程。

Attention(Q,K,V)=softmax ⁣(QK⊤d)V\text{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) = \mathrm{softmax}\!\left(\frac{\mathbf{Q}\mathbf{K}^{\top}}{\sqrt{d}}\right)\mathbf{V}
这个公式描述:用 Q 和 K 算出 n×n 个两两匹配分数,归一化后作为权重,去加权求和 V 的内容。
  1. 查询与键点积把每个查询向量和所有键向量做点积,得到匹配分矩阵,这一步产生 n² 个分数。
    QK⊤\mathbf{Q}\mathbf{K}^{\top}
  2. 缩放约束除以 √d(d 为向量维度),防止分数过大导致 Softmax 梯度消失,让匹配分保持在合理区间。
    QK⊤d\frac{\mathbf{Q}\mathbf{K}^{\top}}{\sqrt{d}}
  3. 归一化权重Softmax 沿每行把分数转成和为 1 的概率分布,表示“这个内容该分多少注意力”。
    softmax(⋅)\mathrm{softmax}(\cdot)
  4. 加权聚合内容权重矩阵左乘 V,按权重把各位置的内容信息汇总到每个位置上。
    ⋅V\cdot\mathbf{V}

核近似思想:用简介卡代替逐本翻书

新管理员提出了一个大胆的想法:与其让每位读者翻遍所有书,不如先为每本书做一张“简介卡”,卡上只写几个最能代表书本主题的关键词。读者拿需求标签与简介卡上的关键词做快速比对,就能判断这本书是否值得深读。这里的关键洞察是:Softmax 注意力中那套复杂的相似度计算,本质上是一个“内核函数”(kernel function),它衡量两个向量的相似程度。管理员发现,这个内核函数可以被拆解成“简介卡”的匹配形式——用两个低维特征的普通点积,去近似那个昂贵的相似度计算。

这个“拆解”在数学上就是核近似:把 Softmax 的内核 exp(x·y) 分解成两个特征向量 φ(x) 和 φ(y) 的内积。φ 就像一个“关键词提取器”,把一本书(向量 x)浓缩成一张简介卡(特征向量 φ(x))。两张卡片的内积,就近似等于两本书原本的相似度。

管理员意识到,只要简介卡做得足够好,读者就再也不需要逐本翻书了。但一个新问题摆在眼前:这张“简介卡”究竟应该怎么写?写哪些关键词?这引出了 Performer 的核心技术——随机特征映射。

κ(x,y)=exp⁡(x⋅y)≈ϕ(x)⊤ϕ(y)\kappa(\mathbf{x},\mathbf{y}) = \exp(\mathbf{x}\cdot\mathbf{y}) \approx \phi(\mathbf{x})^{\top}\phi(\mathbf{y})
这个公式说明:原本需要复杂计算的核函数,可以被两个简单的特征向量点积近似替代。
  1. 精确内核exp(x·y) 是 Softmax 注意力底层的相似度函数,值越大表示两个向量越相似。
    exp⁡(x⋅y)\exp(\mathbf{x}\cdot\mathbf{y})
  2. 特征提取映射φ(x) 把高维向量 x 映射到一个新的特征空间,相当于给书制作简介卡。
    ϕ(x)\phi(\mathbf{x})
  3. 点积近似两张简介卡的内积 φ(x)ᵀφ(y) 近似等于原内核值,复杂度从“翻整本书”降为“比对关键词”。
    ϕ(x)⊤ϕ(y)\phi(\mathbf{x})^{\top}\phi(\mathbf{y})

随机特征映射:简介卡怎么制作

管理员翻阅了大量图书分类学著作,最终找到一套巧妙的方案:随机抽取关键词。他准备了一组随机主题词(比如“恒星”、“深海”、“量子”、“烘焙”),每本书都和这些主题词做内积,得到一个“该主题的相关度得分”。得分高就记在卡上。为了让卡片信息完整,他还会减去每个关键词的“噪声基底”(书的自身长度),最后套上一个指数函数保证所有得分为正——毕竟“不相关”和“稍有关联”都是正面信号,不能出现负数。这就是 FAVOR+ 的随机特征构造方法。

数学上,随机特征 φ(x) 的构造方式如下:先生成一个随机矩阵 W(相当于那组随机主题词),把向量 x 投影到 m 个随机方向上,再经过指数变换。最关键的性质是:如果我们抽取足够多的随机方向,这些简介卡的内积在期望意义下恰好等于原版的内核值——这就是无偏性。抽的关键词越多(m 越大),简介卡越接近原书。

简介卡制作完成了,但管理员立刻发现了一个新机会:既然所有书都有了简介卡,为什么还要让每个读者逐张翻卡呢?为什么不把所有卡片汇总成一本“主题索引册”?

ϕ(x)=1mexp⁡ ⁣(Wx−∥x∥22),E ⁣[ϕ(x)⊤ϕ(y)]=exp⁡(x⋅y)\phi(\mathbf{x}) = \frac{1}{\sqrt{m}}\exp\!\left(\mathbf{W}\mathbf{x} - \frac{\|\mathbf{x}\|^2}{2}\right), \qquad \mathbb{E}\!\left[\phi(\mathbf{x})^{\top}\phi(\mathbf{y})\right] = \exp(\mathbf{x}\cdot\mathbf{y})
这个公式说明:通过随机投影加指数变换构造的特征,其内积的期望值恰好等于原 Softmax 内核——随机抽取足够多主题词后,简介卡统计上等价于原书。
  1. 随机投影W 是一个随机矩阵,Wx 把向量 x 投影到 m 个随机主题方向上,得到 m 个相关度得分。
    Wx\mathbf{W}\mathbf{x}
  2. 去偏置项减去 ||x||²/2(向量模长平方的一半),消除向量自身长度对相似度的影响,让卡片更纯净。
    −∥x∥22- \frac{\|\mathbf{x}\|^2}{2}
  3. 指数变换exp 函数把所有得分变成正数,保证特征内积能够恢复出原来的内核表达式。
    exp⁡(⋅)\exp(\cdot)
  4. 归一化因子1/√m 让多个随机方向的贡献取平均,保证期望值不随 m 增大而发散。
    1m\frac{1}{\sqrt{m}}
  5. 无偏期望当随机方向足够多时,特征内积的期望恰好等于精确内核 exp(x·y),简介卡的统计信息与原书等价。
    E ⁣[ϕ(x)⊤ϕ(y)]=exp⁡(x⋅y)\mathbb{E}\!\left[\phi(\mathbf{x})^{\top}\phi(\mathbf{y})\right] = \exp(\mathbf{x}\cdot\mathbf{y})

计算顺序:先合成索引表再查询

传统流程中,即使有了简介卡,读者还是要逐一比对每张卡片(对应计算完整的 n×n 近似注意力矩阵)。管理员灵机一动:矩阵乘法满足结合律——就像 3×(4×5) 和 (3×4)×5 结果一样,我们可以改变乘法的先后顺序!如果先把所有书的内容(V)按关键词(φ(K))汇总成一本“主题索引册”(一个很小的 m×d 矩阵),读者只需要把自己的需求标签(φ(Q))与索引册做一次比对,就能直接得到答案。这样,书的数量 n 再大,读者也只需要查索引,而不是翻遍 n 张卡。

这就是 Performer 最核心的计算技巧:把 (φ(Q)φ(K)ᵀ)V 重写为 φ(Q)(φ(K)ᵀV)。先算 φ(K)ᵀV,得到一个维度仅为 m×d 的小矩阵(m 是关键词数量,通常几百),再让 φ(Q) 与这个小矩阵相乘。整个流程的计算量从 n² 降到了 n·m。

主题索引册制度让图书馆的效率突飞猛进。但管理员并不满足,他注意到随机抽取关键词有个隐患:有时会抽出两个意思重复的词(比如“巴黎”和“法国首都”),白白浪费卡片空间。有没有办法让每张卡都是独一无二的呢?

(ϕ(Q) ϕ(K)⊤)V=ϕ(Q)(ϕ(K)⊤V),O(n2d)⟶O(nmd)\left(\phi(\mathbf{Q})\,\phi(\mathbf{K})^{\top}\right)\mathbf{V} = \phi(\mathbf{Q})\left(\phi(\mathbf{K})^{\top}\mathbf{V}\right), \qquad \mathcal{O}(n^2 d) \longrightarrow \mathcal{O}(n m d)
这个公式说明:利用矩阵乘法的结合律,改变计算顺序——先让键与值聚合,再让查询与聚合结果匹配,复杂度从平方级降为线性级。
  1. 原始顺序先算 φ(Q)φ(K)ᵀ 得到 n×n 的近似注意力矩阵,再乘 V,中间矩阵大到无法承受。
    (ϕ(Q) ϕ(K)⊤)V\left(\phi(\mathbf{Q})\,\phi(\mathbf{K})^{\top}\right)\mathbf{V}
  2. 结合律换序把括号移到后面,先计算 φ(K)ᵀV——这是 m×d 的小矩阵,体积只有原来的 m/n 分之一。
    ϕ(Q)(ϕ(K)⊤V)\phi(\mathbf{Q})\left(\phi(\mathbf{K})^{\top}\mathbf{V}\right)
  3. 先聚合KVφ(K)ᵀV 把“键与值”按关键词维度预先融合,生成索引册——每个关键词对应一列浓缩内容。
    ϕ(K)⊤V\phi(\mathbf{K})^{\top}\mathbf{V}
  4. 再匹配Qφ(Q) 左乘索引册,每个查询只需与 m 个关键词列比对,不再需要与全部 n 个位置比对。
    ϕ(Q)⋅(索引册)\phi(\mathbf{Q}) \cdot (\text{索引册})
  5. 复杂度对比从 O(n²d) 降到 O(nmd),其中特征数 m 是固定常数,序列长度 n 再大也只线性增长。
    O(n2d)→O(nmd)\mathcal{O}(n^2 d) \to \mathcal{O}(n m d)

正交特征:关键词去重降方差

随机抽取主题词时,管理员发现了一个问题:随机方向之间常常“撞车”。比如随机选了 64 个方向,其中 10 个都指向“欧洲城市”这个主题,真正覆盖新主题的方向只有 54 个——这就像简介卡上塞满了重复的关键词,信息密度大大降低。更糟的是,随机方向之间的相关性会让简介卡的估计结果忽高忽低(方差大),同样的书今天做出这样的卡,明天做出那样的卡。

解决方案来自线性代数:管理员把随机方向矩阵做了一次 QR 分解——就像把一堆杂乱无章的抽签棒理成互相垂直的坐标轴。正交矩阵中的每一列都与其他所有列垂直,保证每个关键词覆盖完全独立的主题,互不重叠。实验表明,同样的关键词数量下,正交方案产生的简介卡信息量更大、估计更稳定,方差大幅降低。

有了正交的关键词体系,同样的卡片数量能承载更多独立信息。那么问题来了:关键词数量 m 到底取多少才合适?抽取太多,制作卡片成本高;抽取太少,简介卡又不够准确。这就进入了工程权衡的领域。

Worth=QR(Wgauss),Worth⊤Worth=I\mathbf{W}_{\mathrm{orth}} = \mathcal{QR}(\mathbf{W}_{\mathrm{gauss}}), \qquad \mathbf{W}_{\mathrm{orth}}^{\top}\mathbf{W}_{\mathrm{orth}} = \mathbf{I}
这个公式说明:对随机高斯矩阵做 QR 分解,得到列与列之间互相正交的矩阵——每个特征方向独立,互不重复。
  1. 高斯随机矩阵开始时生成一个元素服从标准正态分布的随机矩阵,各方向随机但可能相关。
    Wgauss\mathbf{W}_{\mathrm{gauss}}
  2. QR分解把矩阵分解成正交矩阵 Q 和上三角矩阵 R,取 Q 部分作为新的投影矩阵。
    QR(⋅)\mathcal{QR}(\cdot)
  3. 正交化结果正交矩阵满足 WᵀW = I,任何两列的点积为 0,方向完全独立,互不干扰。
    Worth⊤Worth=I\mathbf{W}_{\mathrm{orth}}^{\top}\mathbf{W}_{\mathrm{orth}} = \mathbf{I}

精度权衡:卡片精度与制作成本

管理员的简介卡制度虽然高效,但并非没有代价。每张卡片上的关键词数量 m 直接决定了信息的完整度:m 越大,简介卡越接近原书,读者判断越准确;但 m 越大,制作和比对卡片的时间成本也越高。这就像为一个 1000 页的巨著写简介——写 10 个关键词省时省力但可能漏掉关键情节,写 500 个关键词面面俱到却失去了“简介”的意义。

数学上,核近似的误差与特征数量 m 的关系非常优雅:均方误差以 O(1/m) 的速度递减。也就是说,m 每翻一倍,近似误差就减半。但由于 Performer 使用了正交随机特征,误差的常数因子大大缩小——论文实验显示,正交方案下 m 取几百维就能达到令人满意的精度,而普通高斯特征可能需要数千维。误差公式如下:

给 1000 本书做 10 个关键词的简介卡,能快速给读者一个大致方向;给 100 本重点书做 100 个关键词的精读卡,则能保证高精度检索。Performer 的使用者正是这样:面对不同长度的序列和精度要求,灵活调节特征数 m,在速度与质量之间走出最经济的路线。

E ⁣[(exp⁡(x⋅y)−ϕ(x)⊤ϕ(y))2]=O ⁣(1m)\mathbb{E}\!\left[\left(\exp(\mathbf{x}\cdot\mathbf{y}) - \phi(\mathbf{x})^{\top}\phi(\mathbf{y})\right)^2\right] = O\!\left(\frac{1}{m}\right)
这个公式说明:核近似的均方误差与特征数量 m 成反比——m 越大误差越小,但收益递减,需要在精度与速度间寻找平衡点。
  1. 均方误差衡量真实内核值 exp(x·y) 与近似值 φ(x)ᵀφ(y) 之间的平均偏差平方,误差越小近似越准。
    (exp⁡(x⋅y)−ϕ(x)⊤ϕ(y))2\left(\exp(\mathbf{x}\cdot\mathbf{y}) - \phi(\mathbf{x})^{\top}\phi(\mathbf{y})\right)^2
  2. 数学期望对所有随机采样取平均,代表平均意义上的误差水平,避免单次采样运气的影响。
    E[⋅]\mathbb{E}[\cdot]
  3. 反比关系O(1/m) 表示误差随特征数增加线性下降,m 翻倍误差减半。
    O ⁣(1m)O\!\left(\frac{1}{m}\right)

性能效率:指数差距的实测

让我们回到那座图书馆,用数字感受新人管理员的改革成果。假设图书馆有 n 本书,每本书有 d 个主题类别,管理员制作 m 个关键词(m 是固定常数,如 256)。传统“逐本翻书”制度的总工作量是 n²d 次操作——书一多就爆炸;新制度的总工作量是 nmd 次操作——书再多也只是线性增长。以 n=1024、d=64、m=64 为例:旧制度需要约 6700 万次操作,新制度只需约 420 万次,快了 16 倍。当 n 变成 1 万时,差距将扩大到 156 倍!

同时,内存占用也天差地别。标准注意力需要在内存中存储 n×n 的注意力矩阵——n=1 万时,光是这个矩阵就需要 400MB 内存;而 Performer 只需要保存 m×d 的索引矩阵,仅 16KB。内存的大幅节省让训练更深的模型、处理更长的序列成为可能。

新制度的优越性在藏书量大的图书馆里体现得淋漓尽致。1000 本的小图书馆里,逐本翻书和查索引的差别不大;但当藏书量达到百万级,查索引几乎是唯一可行的方案——这正是 Performer 在超长序列场景中不可替代的原因。

O(n2d)O(nmd)=nm≫1\frac{\mathcal{O}(n^2 d)}{\mathcal{O}(n m d)} = \frac{n}{m} \gg 1
这个公式说明:Performer 相对标准注意力的加速比约为 n/m——序列长度 n 远大于特征数 m 时,加速效果随 n 增长而愈加显著。
  1. 时间对比n²d 除以 nmd 得到 n/m,即序列长度与特征数的比值,这个比值越大加速越明显。
    n2dnmd\frac{n^2 d}{n m d}
  2. 化简结果约去 d 和 n 后,加速比等于 n/m——长序列场景下,这个比值轻松达到几十上百。
    nm\frac{n}{m}
  3. 远大于一当 n 是 1 万、m 是 256 时,加速比约 39 倍,且 n 越长优势越极端。
    ≫1\gg 1

应用场景:长序列的主场之战

简介卡制度很快从普通图书馆推广到了各个专业分馆。在医学文献馆,研究人员需要对上万字的论文进行阅读理解与摘要生成——Performer 能线性处理这些长文本,而标准 Transformer 早已因内存爆炸而崩溃。在基因序列馆,生物信息学家用 Performer 对长达数万 token 的蛋白质序列进行结构预测,每个氨基酸都能高效地与全序列的其他氨基酸建立关联。在地图馆(图数据场景),图 Transformer 用 Performer 处理包含上百万节点的大图,每个节点都能感知全图信息而无需逐对计算。

这些场景有一个共同点:序列长度 n 远大于特征数 m,Performer 的加速比 n/m 极其可观。更令人惊喜的是,Performer 的核近似在理论上保证了无偏性,加上正交特征的低方差,其精度在许多任务上非常逼近标准 Transformer。论文中的实验表明,在蛋白质序列建模、文本分类等任务上,Performer 的准确率与标准 Transformer 相差无几,而训练和推理速度却快了一个数量级。

从逐本翻书到查索引册,Performer 的核近似从根本上改变了长序列处理的游戏规则。当然,简介卡制度也并非万能——它牺牲了部分精度换来了效率,理解这种权衡才能在实际项目中作出正确选择。

Q↦ϕ(Q)(ϕ(K)⊤V)⏟线性时间withϕ from orthogonal random features\mathbf{Q} \mapsto \underbrace{\phi(\mathbf{Q})\left(\phi(\mathbf{K})^{\top}\mathbf{V}\right)}_{\text{线性时间}} \quad \text{with} \quad \phi \text{ from orthogonal random features}
这个公式总结:Performer 的整体流程——用正交随机特征把 Q、K 映射后再先聚合后匹配,实现线性时间的注意力计算。
  1. 查询变换Q 先经过特征映射 φ,变成低维特征空间中的查询表示。
    Q↦ϕ(Q)\mathbf{Q} \mapsto \phi(\mathbf{Q})
  2. 线性注意力计算φ(Q) 与预聚合的索引矩阵 φ(K)ᵀV 相乘,整个计算在 O(nmd) 时间内完成。
    ϕ(Q)(ϕ(K)⊤V)\phi(\mathbf{Q})\left(\phi(\mathbf{K})^{\top}\mathbf{V}\right)
  3. 核心要点φ 使用正交随机特征构造,保证无偏性的同时降低方差,让线性近似足够精准。
    ϕ from orthogonal random features\phi \text{ from orthogonal random features}

AI 应用场景

超长文档智能摘要

阶段:模型推理与部署

解决的问题:传统 Transformer 处理数万字的法律文书或科研论文时,注意力矩阵的 O(n²) 内存占用会让 GPU 直接崩溃。Performer 的线性注意力机制让长文档的全局语义建模成为可能,模型可以一次性读完整个文档,生成高质量摘要。

具体案例:某法律科技公司使用 Performer 作为底层模型处理平均 5 万字的合同文本。过去需要将文档切成 512 token 的碎片分别处理,丢失了大量跨段落语义;改用 Performer 后,模型可直接输入完整合同,摘要准确率提升 12%,推理耗时反而降低 8 倍。用户体验从“等半小时”变成了“喝口咖啡的功夫”。

蛋白质序列结构预测

阶段:模型训练与特征工程

解决的问题:蛋白质序列通常包含数千个氨基酸,每个位点都需要与全序列其他位点建立依赖关系。标准 Transformer 的二次复杂度使训练难以收敛,Performer 让模型能够在单条 GPU 上处理完整蛋白质序列,捕捉远距离的氨基酸相互作用。

具体案例:某生物信息学团队用 Performer 构建蛋白质语言模型,输入长度从 1024 扩展到 8192,能够直接编码完整蛋白质链。在二级结构预测任务上,模型在保持与标准 Transformer 相当精度的同时,训练时间从 72 小时缩短至 9 小时,使得团队能够快速迭代实验多种模型架构。

大规模图数据节点分类

阶段:模型架构设计与训练

解决的问题:Graph Transformer 需要对图中所有节点对计算注意力,面对百万节点的大图根本无法计算。Performer 的核近似让每个节点通过“索引表”感知全图信息,将计算复杂度降为与节点数线性相关,实现全局图建模。

具体案例:某社交平台用 Performer 对 200 万用户的关系图进行社区发现与兴趣推荐。标准 Graph Transformer 需要 16 张 A100 显卡才能勉强训练,Performer 只需 2 张显卡即可完成,同时推荐准确率提升了 3 个百分点,因为每个用户节点如今能真正看到全图的结构信息,而不再局限于局部邻居。

Python 演示

python46 行
import numpy as npimport time def softmax_attention(Q, K, V):    """标准 Softmax 注意力:复杂度 O(n^2)"""    d = Q.shape[-1]    scores = np.matmul(Q, K.transpose(0, 2, 1)) / np.sqrt(d)    weights = np.exp(scores - scores.max(axis=-1, keepdims=True))    weights /= weights.sum(axis=-1, keepdims=True)    return np.matmul(weights, V) class RandomFeatureAttn:    """Performer 线性注意力:正交随机特征 + 结合律换序"""    def __init__(self, d_model, m=64, seed=42):        rng = np.random.RandomState(seed)        W = rng.randn(d_model, m)        Q, _ = np.linalg.qr(W)        self.W = Q.astype(np.float32)        self.m = m     def phi(self, X):        proj = np.matmul(X, self.W)        norm = 0.5 * np.sum(X * X, axis=-1, keepdims=True)        return np.exp(proj - norm) / np.sqrt(self.m)     def __call__(self, Q, K, V):        phi_q = self.phi(Q)        phi_k = self.phi(K)        kv = np.matmul(phi_k.transpose(0, 2, 1), V)        return np.matmul(phi_q, kv) if __name__ == "__main__":    np.random.seed(0)    head = RandomFeatureAttn(d_model=64, m=64)    for n in [64, 128, 256, 512]:        d = 64        X = np.random.randn(1, n, d).astype(np.float32)        t0 = time.perf_counter()        out_std = softmax_attention(X, X, X)        t1 = time.perf_counter()        out_fast = head(X, X, X)        t2 = time.perf_counter()         err = np.abs(out_std - out_fast).mean()        print(f"n={n:4d}  标准={t1-t0:.4f}s  Performer={t2-t1:.4f}s  "              f"加速={(t1-t0)/max(t2-t1,1e-6):.1f}x  平均误差={err:.4f}")
目的:实现标准 Softmax 注意力与 Performer 线性注意力,对比不同序列长度下的耗时与近似误差。
  1. scores = np.matmul(Q, K.transpose(0, 2, 1)) / np.sqrt(d)标准注意力计算 n×n 相似度矩阵,这就是平方复杂度的来源
  2. Q, _ = np.linalg.qr(W)对随机矩阵做 QR 分解,得到正交随机特征矩阵,降低方差
  3. proj = np.matmul(X, self.W)把输入的 Q/K 投影到 m 个正交随机方向上
  4. norm = 0.5 * np.sum(X * X, axis=-1, keepdims=True)计算 ||x||²/2 去偏置项,保证无偏性
  5. return np.exp(proj - norm) / np.sqrt(self.m)指数变换 + 归一化,构造正随机特征 φ(x)
  6. kv = np.matmul(phi_k.transpose(0, 2, 1), V)关键一步:先聚合 K 与 V,得到 m×d 的“索引表”
  7. return np.matmul(phi_q, kv)查询与索引表相乘,复杂度与 n 线性相关
  8. for n in [64, 128, 256, 512]:扫描不同序列长度,观察标准版的耗时增速远快于 Performer

常见误区

误区“Performer 就是把激活函数从 Softmax 换成 ReLU 之类的线性激活,所以精度肯定会大幅下降。”

正解Performer 并没有简单替换激活函数,而是通过随机特征映射在数学上无偏近似 Softmax 内核。它用随机投影 + 指数变换构造特征 φ,使得 E[φ(x)ᵀφ(y)] = exp(x·y)。这就像管理员不是随口写几个关键词,而是严格证明这些关键词的统计信息与整本书等价。当特征数 m 足够大(配合正交特征),近似误差很小,模型在多数任务上精度与标准 Transformer 相当。

为何常见:很多人看到“核近似”就直觉认为是粗糙的线性化,忽略了背后的无偏性数学保证,也忽略了正交特征如何显著降低方差。

误区“线性注意力为了省计算,肯定丢弃了序列中相距较远的位置之间的关联,只能看到局部上下文。”

正解Performer 是全局注意力机制,每个位置仍然可以感知序列中所有其他位置的信息。它没有丢弃任何 token 对,而是把精确的 n×n 相似度矩阵替换成了低秩的近似表示——相当于把“逐本翻书”换成“查索引”,索引里囊括了所有书的关键信息。远距离依赖依然被建模,只是计算方式更加高效。这与稀疏注意力(确实会丢远距离联系)有本质区别。

为何常见:人们容易把“计算量减少”误认为“信息量减少”,忽略了核近似是统计意义上的全局近似,而非局部采样。

误区“反正 m 越大误差越小,直接把 m 设成 2048 甚至 4096,总能逼近标准注意力。”

正解m 增大时误差 O(1/m) 确实下降,但计算量 O(nmd) 同时线性上升,内存占用也随之增加。当 m 超过某个阈值(通常在数百量级),边际精度收益微乎其微,但计算开销却实打实地增长。更关键的是,正交随机特征显著降低了误差常数,几百维就已足够——盲目堆 m 反而是对正交特征优势的浪费。工程上应当先测误差曲线,再选性价比最高的 m。

为何常见:直觉上“越多越准”在无成本假设下成立,但忽略了 m 带来的计算成本,以及正交特征已经大幅压缩了所需 m 的事实。

误区“Performer 是更先进的架构,任何任务都应该无脑替换,速度一定更快。”

正解Performer 的优势在于长序列。当序列长度 n 较小时(例如 n < 512),标准 Transformer 的矩阵运算高度优化,而 Performer 需要额外的特征映射步骤和 m 维矩阵乘法,固定开销反而可能让它更慢。加速比 n/m 只有在 n 远大于 m 时才显著。这就像简介卡制度对 10 万册藏书的大图书馆是福音,对只有 20 本书的社区图书角反而多此一举。选型时必须评估实际序列长度。

为何常见:只看复杂度的大 O 符号,忽略了常数因子和小规模场景下的实际开销,导致盲目替换。

误区“既然是随机特征,每次运行的结果肯定都不一样,模型预测不可靠,简直像掷骰子。”

正解虽然特征来自随机投影,但多个随机方向的期望值恰好等于精确内核(无偏性),且正交特征把方差压到了很低的水平。实际训练中,随机特征矩阵通常在初始化时固定一次(如代码中的 seed),训练和推理全程保持不变。更重要的是,训练过程本身也会适应特征空间的表示。论文实验显示,Performer 多次运行的结果差异极小,远达不到“掷骰子”的程度。这就像简介卡的关键词虽然是随机抽的,但只要抽得够多且正交,卡片内容就相当稳定可靠。

为何常见:望文生义地抓住“随机”二字,忽略了概率论中大数定律和正交化手段对随机性的驯服作用。

面试题

Q1. Performer 主要解决了标准 Transformer 的什么问题?

单选题 · easy

  • A.注意力计算的二次复杂度← 正确答案
  • B.训练过程的梯度消失问题
  • C.模型的严重过拟合问题
  • D.词表爆炸式增长的难题

答案:A。Performer 通过核近似把注意力复杂度从 O(n²) 降到 O(n),核心解决的就是长序列下注意力矩阵平方级增长的问题。梯度消失、过拟合、词表爆炸都不是 Performer 的设计目标。

Q2. Performer 将注意力计算的复杂度从 O(n²) 降到了什么级别?

单选题 · easy

  • A.线性复杂度 O(n)·m← 正确答案
  • B.对数复杂度 O(log n)
  • C.根号复杂度 O(√n)
  • D.保持平方复杂度不变

答案:A。Performer 的复杂度是 O(nmd),其中 m 是特征数(固定常数),因此整体随序列长度 n 线性增长。对数或根号复杂度在注意力机制中不现实,保持平方则与 Performer 的设计初衷相悖。

Q3. 核近似的核心思想是什么?

单选题 · mid

  • A.用特征向量点积近似核函数值← 正确答案
  • B.用小矩阵近似大矩阵的存储
  • C.用低精度浮点近似高精度运算
  • D.用稀疏图近似全连接的结构

答案:A。核近似的本质是找到特征映射 φ,使 φ(x)ᵀφ(y) 近似等于原内核 exp(x·y),把昂贵的核函数计算分解成廉价的内积。选项 B、C、D 描述的是存储优化、数值精度和稀疏化,与核近似无关。

Q4. FAVOR+ 随机特征的无偏性指的是什么?

单选题 · mid

  • A.特征内积的期望恰好等于精确内核← 正确答案
  • B.特征函数的取值恒定为非零值
  • C.随机采样过程不会产生任何方差
  • D.特征向量的所有分量都介于零和一之间

答案:A。无偏性指 E[φ(x)ᵀφ(y)] = exp(x·y),即随机特征内积的统计期望与 Softmax 内核完全一致。这保证了近似在平均意义上是精确的。特征非零、有方差、分量范围等都不构成无偏性的定义。

Q5. Performer 利用矩阵乘法结合律改变了计算顺序,先算哪一步?

单选题 · mid

  • A.先聚合 K 与 V 的乘积← 正确答案
  • B.先计算 Q 与 K 的相似度
  • C.先对 QK 结果做 Softmax
  • D.先对 V 做随机投影降维

答案:A。(φ(Q)φ(K)ᵀ)V 被重写为 φ(Q)(φ(K)ᵀV),核心是先计算 φ(K)ᵀV,得到 m×d 的小矩阵,避免构造 n×n 的大矩阵。B 和 C 是标准注意力的流程,D 中的 V 不需要随机投影。

Q6. 正交随机特征相比普通高斯随机特征的主要优势是什么?

单选题 · mid

  • A.降低估计方差,减少所需特征数← 正确答案
  • B.增加模型非线性的表达能力
  • C.直接加速矩阵乘法的底层运算
  • D.缓解深层网络训练时的梯度消失

答案:A。正交矩阵保证各特征方向互相独立、信息不重复,因此同数量特征下估计方差显著减小,能够用更少的 m 达到同等精度。它并不改变非线性形式、底层矩阵运算效率或梯度传播特性。

Q7. 核近似的均方误差随特征数 m 增大以什么速度下降?

单选题 · hard

  • A.与 m 成反比的线性速度下降← 正确答案
  • B.与 m 成反比的平方速度下降
  • C.与 m 的对数速度缓慢下降
  • D.与 m 的平方根的较慢速度下降

答案:A。误差公式为 O(1/m),即 m 每翻倍,误差减半,是典型的反比线性下降。平方反比、对数、平方根反比都不符合核近似误差的理论界。

Q8. 以下哪些场景适合使用 Performer?

多选题 · mid

  • A.超长文档的阅读理解与摘要← 正确答案
  • B.长序列的蛋白质结构建模← 正确答案
  • C.极短语句的情感分类任务
  • D.大规模图的节点分类任务← 正确答案

答案:ABD。Performer 的优势在长序列和大规模图场景中显著,如超长文档、蛋白质序列、大规模图。极短语句中序列长度很小,标准注意力的优化矩阵运算更快,Performer 的特征映射固定开销反而成为负担。

Q9. 关于 Performer 的复杂度与内存,以下说法正确的是?

多选题 · hard

  • A.总计算复杂度为 O(nmd) 线性阶← 正确答案
  • B.中间注意力矩阵内存占用为 O(n²)
  • C.正交特征可减少达到同等精度所需特征数← 正确答案
  • D.所有序列长度下都比标准注意力省内存

答案:AC。Performer 复杂度为 O(nmd),且无需存储 n×n 注意力矩阵,内存为 O(nm),因此 B 错误。正交特征降低了方差,同精度下确实需要更少的 m,C 正确。短序列下标准注意力内存占用同样可控,D 过于绝对。

Q10. 关于核近似的误差与权衡,下列哪些理解是正确的?

多选题 · hard

  • A.特征数量 m 越大模型速度就一定越快
  • B.核近似误差随特征数 m 增大而减小← 正确答案
  • C.正交特征相比高斯特征方差更小← 正确答案
  • D.长序列下标准注意力一定比 Performer 更省内存

答案:BC。误差 O(1/m) 随 m 增大而减小,B 正确;正交特征降低方差,C 正确。A 错误,m 增大会增加计算量,速度反而变慢;D 错误,长序列下 Performer 因免存 n×n 矩阵而大幅节省内存。