Performer:用随机投影将Attention的复杂度线性化

Performer是Google提出的一项技术,旨在通过随机投影将Attention机制的复杂度从指数级降低到线性级,同时保持精度。这种方法基于标准的Attention,通过找到特定的映射方案,将原本高复杂度的Self Attention转换为线性Attention,理论上有望在不牺牲性能的前提下显著提升处理长序列的效率。然而,Performer在短序列任务上可能表现不佳,并且与某些Transformer增强技术不兼容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

©PaperWeekly 原创 · 作者|苏剑林

单位|追一科技

研究方向|NLP、神经网络

Attention 机制的 复杂度是一个老大难问题了,改变这一复杂度的思路主要有两种:一是走稀疏化的思路,比如我们以往介绍过的 Sparse Attention 以及 Google 前几个月搞出来的 Big Bird [1] ,等等;二是走线性化的思路,这部分工作我们之前总结在线性 Attention 的探索:Attention 必须有个 Softmax 吗?中,读者可以翻看一下。

本文则介绍一项新的改进工作 Performer,出自 Google 的文章 Rethinking Attention with Performers,它的目标相当霸气:通过随机投影,在不损失精度的情况下,将 Attention 的复杂度线性化。

论文标题:

Rethinking Attention with Performers

论文链接:

https://arxiv.org/abs/2009.14794

说直接点,就是理想情况下我们可以不用重新训练模型,输出结果也不会有明显变化,但是复杂度降到了 !看起来真的是“天上掉馅饼”般的改进了,真的有这么美好吗?

Attention

我们知道,Attention 的一般定义为:

对于标准的 Scaled-Dot Attention 来说, (有时候指数部分还会多个缩放因子,这里我们就不显式写出来了),将整个序列的运算写成矩阵形式就是:

我们主要关心 Self Attention 场景,所以一般有 。在上式中, 这一步相当于要对 个向量对做内积,得到 个实数,因此不管时间还是空间复杂度都是 的。

而对于线性 Attention 来说, ,其中 是值域非负的激活函数。这样一来,Attention 的核心计算量(式(1)中的分子部分)就变成了:

上式左端的复杂度依然是 的,由于矩阵乘法满足结合律,我们可以先算后面两个矩阵的乘法,这样复杂度就可以降为

Performers 是一种高效的 Transformer 变体,设计目的是解决传统 Transformer 中计算复杂度高的问题。虽然 Performers 的核心理念在于通过随机化方法近似注意力矩阵来降低计算成本,但具体的结构图通常会展示其内部组件如何协作完成高效注意力计算。 以下是关于 Performer 的一些关键概念和技术细节: ### 1. **Performer 的核心思想** Performer 使用 FAVOR+ 方法(Fast Attention Via Positive Orthogonal Random Features)替代传统的 softmax 注意力机制[^5]。FAVOR+ 将原始的 softmax 注意力重新表达为核函数的形式,并通过随机特征映射技术对其进行近似。这种方法使得 Performer 能够在线性和常数时间复杂度下运行,而不是像标准 Transformer 那样具有二次方的时间复杂度。 ```python import torch def favor_plus_attention(query, key, value, random_features): """ 实现 Performer 的 FAVOR+ 注意力机制。 参数: query (Tensor): 查询张量形状为 [batch_size, seq_len, d_model]. key (Tensor): 键张量形状为 [batch_size, seq_len, d_model]. value (Tensor): 值张量形状为 [batch_size, seq_len, d_model]. random_features (Callable): 随机特征映射函数. 返回: Tensor: 输出张量形状为 [batch_size, seq_len, d_model]. """ phi_q = random_features(query) # 映射查询到随机特征空间 phi_k = random_features(key) # 映射键到随机特征空间 kernel_matrix = torch.matmul(phi_q, phi_k.transpose(-2, -1)) # 计算核矩阵 attention_weights = kernel_matrix / torch.sum(kernel_matrix, dim=-1, keepdim=True) # 归一化权重 output = torch.matmul(attention_weights, value) # 加权求和得到最终输出 return output ``` 上述代码展示了 Performer 如何利用随机特征映射实现快速注意力计算的过程。 --- ### 2. **Performer 的结构特点** #### (1)**随机特征映射** Performer 的一大特点是使用正交随机特征映射将高维向量投影到较低维度的空间中。这样可以在保留重要信息的同时显著减少计算开销[^6]。 #### (2)**线性缩放特性** 由于采用了 FAVOR+ 技术,Performer 的时间和内存需求仅与序列长度呈线性关系,而非平方关系。这对于处理超长序列的任务尤为重要。 #### (3)**支持多种核函数** Performer 支持不同的核函数形式(如 RBF 核、Laplace 核等),这赋予了模型更大的灵活性以适应不同类型的输入数据分布[^7]。 --- ### 3. **可视化 Performer 的结构图** 尽管无法直接提供图片链接或图形文件,下面描述了一个典型的 Performer 架构图可能包含的内容: - 输入嵌入层:负责将原始输入转换成适合后续操作的形式; - 多头注意力模块:基于 FAVOR+ 方法构建,执行高效注意力建模; - 前馈网络子层:类似于常规 Transformer,由两层全连接层组成; - 层规范化单元:放置在每个子层之后,帮助稳定训练过程。 如果需要绘制这样的图表,可以借助工具如 Matplotlib 或 Graphviz 来创建流程框图。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值