让Transformer模型更小、更快的一系列技术?—— 一份关于注意力优化、条件计算与搜索的综合论述

98 阅读19分钟

Transformer模型虽然在自然语言处理等领域取得了巨大成功,但其计算复杂度和参数规模也带来了显著的挑战。让Transformer更小、更快主要围绕三个方面展开:优化注意力机制引入条件计算以及改进搜索策略。这些方法旨在减少模型的计算量(FLOPs)、降低内存占用,同时尽可能保持模型性能。

因为该话题涉及的技术比较广,本次先梳理一个大纲,了解一些基本的概念和分类,后续再深入研究某一技术点。

1. 注意力机制优化:减少计算复杂度

Transformer模型中的标准自注意力机制(Self-Attention)需要计算输入序列中每个token与其他所有token之间的关联,其计算和内存复杂度随序列长度呈平方级增长(O(n²))。这使其难以高效处理长序列。

缩小注意力查找规模的核心目标,就是在尽可能保持模型原始性能(如精度)的前提下,通过减少每个查询(Query)需要交互的键(Key)值(Value)对数量,来显著降低计算和内存开销

以下是几类主流的注意力优化算法:

1.1. 固定模式 (Fixed Patterns)

核心思想:人为地预先定义好一种固定的、规则的稀疏注意力模式,每个token只关注根据该模式选定的一小部分token,而非全部。这是一种最直观的启发式方法。典型方法如下:

1.1.1 局部窗口注意力 (Local Window Attention)

模仿CNN,每个token只关注其左右相邻的k个token(一个固定窗口)。这是最常用的模式,能有效捕获局部依赖。

  • 优点:计算复杂度降至 O(k*n),实现简单高效。
  • 缺点:无法建模长程依赖,窗口边界可能割裂重要联系。
  • 代表Longformer的滑动窗口模式、Swin Transformer中的窗口划分。

1.1.2 膨胀注意力 (Dilated Attention)

模仿膨胀卷积,在局部窗口的基础上,每隔一定距离(膨胀率)取一个token进行关注。以此在保持计算量不变的情况下扩大感受野。

  • 优点:用较少的计算量覆盖更广的范围。
  • 缺点:可能跳过重要邻近信息,模式不够灵活。

1.1.3 全局注意力 (Global Attention)

指定少量特殊的全局token(如 [CLS]  token或句首token)。这些全局token关注所有token,所有token也关注它们。它们充当了“信息中转站”,使得任意两个token可以通过全局token间接交互。

  • 优点:保证了理论上的全局建模能力。
  • 缺点:全局token的数量需要精心设计。
  • 代表LongformerBigBird都采用了 [CLS] +滑动窗口的模式。

1.1.4 随机注意力 (Random Attention)

每个token随机关注其他一些token。

  • 优点:引入随机性,有可能偶然捕获到重要的长程连接。
  • 缺点:非常不稳定,效果通常不佳,极少单独使用。
  • 代表BigBird中将其作为组件之一,以提供随机连接。

特点总结:固定模式实现简单、计算高效,但灵活性和适应性较差,严重依赖先验知识。

1.2. 可学习模式 (Learnable Patterns)

核心思想:让模型根据具体的输入数据,动态地、自动地学习每个token应该关注哪些位置。注意力模式不再是预设的,而是数据驱动的。典型方法如下:

1.2.1 可学习阈值/门控 (Learnable Threshold/Gating)

为每个查询-键(QK)对计算一个重要性分数,然后通过一个可学习的阈值或门控机制,只保留分数最高的那部分对进行计算。

  • 代表Routing TransformerBlockwise Attention

1.2.2 聚类与哈希 (Clustering & Hashing)

将所有的查询(Q)和键(K)映射到某个空间并进行聚类哈希,让每个query只和同一聚类或同一哈希桶内的key进行交互。

  • 优点:复杂度可降至 O(n log n) 或甚至 O(n)。
  • 缺点:聚类/哈希过程本身可能带来额外开销,且是近似计算。
  • 代表Reformer 使用的 LSH (局部敏感哈希) Attention 是这一类的典范。它通过LSH函数将相似的Q和K高概率映射到同一个桶中。

1.2.3 动态位置 (Dynamic Position)

不依赖原始位置,而是学习一个“内容—位置”联合的函数来决定注意力范围。

1.2.4 低秩近似 (Low-Rank Approximation)

核心思想: 低秩近似基于一个关键的观察:尽管标准注意力矩阵是 n×n 的,但它在很大程度上是“低秩”的。这意味着,这个庞大的矩阵中所包含的信息,实际上可以用两个更小的矩阵(其乘积的秩远小于 n)来近似表示,而不会丢失太多信息。

想象一下:你要描述一幅由100万像素组成的图片,但图片内容其实只是一片纯色天空。你不需要记录每一个像素的值,只需要说“这是一片RGB(135, 206, 235)的天空”就够了。这就是低秩的直觉——有效信息远小于其表面规模。

工作原理:以 Linformer 为例

Linformer 是低秩近似的代表作。它通过一个简单的线性投影,将序列长度维度从 n 压缩到一个固定的低维 k 。

标准注意力

 Attention(Q, K, V) = softmax(Q·Kᵀ / √d)   · V 

计算  Q·Kᵀ  会产生一个 n×n 的矩阵,这是复杂度瓶颈。

Linformer 的改造

  • 它不改变 Query (Q) 矩阵。
  • 它对 Key (K) 和 Value (V) 矩阵的序列长度维度(n) 进行投影,将其从  n  维压缩到  k  维(k << n,例如 k=256)。
  • 它引入了两个投影矩阵  E  和  F (维度为 n×k):  K' = K · Eᵀ  (维度从  n×d  变为  k×d )  V' = V · Fᵀ  (维度从  n×d  变为  k×d )

修改后的注意力计算: LinearAttention(Q, K', V') = softmax(Q·  K'ᵀ / √d) · V' 

  •  Q·K'ᵀ  的维度是:(n×d) · (d×k) =  n×k 。计算这个矩阵的复杂度是 O(n*k)。
  • 之后的 softmax 和乘以  V'  的复杂度也是 O(n*k)。
  • 总复杂度从 O(n²) 降为 O(n*k) 。因为 k 是固定常数,所以是线性复杂度 O(n)。

优点

  • 理论优美:严格将复杂度降至线性,非常适合处理超长序列的编码任务(如文档分类)。
  • 实现相对简单:在标准注意力基础上增加投影即可。
  • 性能保持较好:在很多任务上,其近似效果几乎与全注意力无异

缺点

  • 参数引入:投影矩阵  E  和  F  是可学习参数,增加了模型参数量。
  • 投影可能损失信息:强制压缩可能会丢失一些细节信息,特别是在 k 设置得过小时。
  • 主要适用于编码器:由于其序列间进行全局压缩的特性,很难直接应用于自回归生成的解码器(因为解码需要因果掩码,会破坏投影的全局性)。

1.2.5 稀疏注意力机制优化

一种技术实现路径或目标而非具体方法,可归类固定模式(如:局部窗口,膨胀注意力)和可学习模式(如:LSH,路由)

核心思想:认为不是所有token之间都需要进行交互。通过一些预定义模式学习到的策略,只计算所有可能token对中的一个子集,而将其他部分的注意力权重直接设为0,从而避免计算。

实现方式

1. 基于模式(Pattern-based) :人工设计注意力范围。

  • 局部注意力:像CNN一样,每个token只关注其邻近的一个窗口(如Sliding Window)。
  • 全局注意力:设置少量全局token,它们关注所有token,所有token也关注它们(如Longformer、BigBird)。

2. 随机注意力:随机选择一些token对进行计算(如BigBird中的随机注意力)。

  • 分层/膨胀注意力:类似扩张卷积,以扩大感受野。
  • 基于学习(Learning-based) :让模型自己学习哪些token对是重要的。
  • 可学习阈值:预测一个重要性分数,过滤掉低于阈值的连接。
  • 路由策略:使用类似聚类(如Reformer的LSH)或路由网络的方法,将token分配到不同的桶(bucket)中,只在桶内计算注意力。

复杂度:通常从 O(n²) 降低到 O(n log n) 或 O(n)(取决于具体模式)。

优点计算是精确的(在计算的范围内),更容易解释和理解。

缺点可能丢失全局信息(除非特意设计),实现复杂,通常需要自定义CUDA内核来高效实现稀疏计算。

1.2.6 特点总结

可学习模式灵活自适应,能更好地契合数据特性,但训练更复杂,且可能引入不稳定性和额外的超参数

1.3. 神经记忆 (Neural Memory)

核心思想:引入一个外部可读写的记忆模块(Memory Module) 。模型将历史信息压缩并存储到记忆体中,在需要时再从记忆体中检索相关信息。这样,当前token无需直接与所有历史token交互,只需与记忆体交互即可。

1.3.1 工作机制

  1. 写入 (Write) :网络将当前输入的有用信息总结、压缩后存入记忆单元。
  1. 读取 (Read) :对于新的输入,网络通过注意力机制查询记忆体,取出相关信息用于计算。
  1. 更新 (Update) :记忆体中的内容可以根据新输入不断更新。

1.3.2 典型方法

  • Memorizing Transformer:在标准Transformer旁增加一个大型外部记忆库,使用KNN最近邻搜索等方式来检索相关记忆。
  • Compressive Transformer:引入额外的“压缩记忆”槽,将过远的激活状态(历史信息)压缩后存储起来,而不是直接丢弃。

特点总结:神经记忆方法理论上可以处理极长甚至无限长的序列,显存效率高。但记忆的读取、写入和更新机制设计非常复杂,且如何保证记忆的稳定性和准确性是一大挑战。

1.4. 模式组合 (Pattern Combination)

核心思想没有一种单一的稀疏模式是完美的。因此,将上述多种基本模式(固定或可学习的)组合起来使用,取长补短,形成一种复合的注意力机制,以在效率和效果上取得更好的平衡。典型方法如下:

1.4.1 BigBird

这是模式组合的黄金范例。它提出了一个由三部分组成的通用近似框架

  1. 一组全局token (Global tokens) :负责全局信息交互。
  2. 局部窗口注意力 (Local window attention) :负责捕获局部连续性。
  3. 随机注意力 (Random attention) :负责提供随机连接,保证图的连通性。
  • 理论上证明,这种组合可以近似全注意力,并在多项长序列任务上达到SOTA。

1.4.2 Longformer

组合了滑动窗口注意力任务相关的全局注意力(如为QA任务中的问题token添加全局注意力)。

特点总结:模式组合是非常实用且强大的策略,它通过结合不同模式的优点,在实践中往往能取得1+1>2的效果,是目前许多主流长序列模型的基础。

1.5 线性注意力 (Linear Attention)

核心思想: 线性注意力采用了一种更为“颠覆性”的思路。它不像低秩近似那样去压缩注意力矩阵,而是利用数学恒等式,彻底改变计算顺序,从而避免计算 n×n 的注意力矩阵。

其核心在于为一个核函数 φ 找到一种映射,使得标准注意力中的 exp(Q·Kᵀ) 可以分解为 φ(Q)·φ(K)ᵀ 的形式。

工作原理:数学推导

1. 标准注意力可以写成更一般的形式:  

Output_i = ∑_{j=1}^{n} (sim(Q_i, K_j) /   ∑_l sim(Q_i, K_l)) · V_j 

其中, sim(Q, K) = exp(Q·Kᵀ / √d) 。

2. 线性注意力的关键一步

  • 如果我们能找到一个核函数  φ ,使得  sim(Q, K) ≈ φ(Q) · φ(K)ᵀ ,那么上式就可以重写:  Output_i ≈ ( ∑_{j=1}^{n} [ φ(Q_i) · φ(K  j)ᵀ ] · V_j ) / ( ∑{j=1}^{n} φ(Q_i) · φ(K_j)ᵀ ) 
  • 利用结合律,我们可以先计算括号内的部分:  Output_i ≈ φ(Q_i) · ( ∑_{j=1}^{n} φ(K_j  )ᵀ · V_j ) / ( φ(Q_i) · ∑_{j=1}^{n} φ(K_j)ᵀ ) 
  • 令  S = ∑_{j=1}^{n} φ(K_j)ᵀ · V_j (一个  d'×d  的矩阵)和  Z = ∑_{j=1}^{n} φ(K_j)ᵀ (一个  d'×1  的向量)。 S  和  Z  是可以循环累积计算的

3.计算流程

  • 初始化: S = 0 ,  Z = 0 。
  • 遍历序列 j from 1 to n:  S = S + φ(K_j)ᵀ · V_j   Z = Z + φ(K_j)ᵀ 
  • 对于每个查询 Q_i:  Output_i = φ(Q_i) · S / (φ(Q_i) · Z) 
  • 可以看到,计算  S  和  Z  的复杂度是 O(n),计算所有  Output_i  的复杂度也是 O(n)。总复杂度成功降为 O(n)

4.核函数的选择

核函数 φ 的设计是线性注意力的灵魂。不同的实现有不同的选择:

  • Linear Transformer:使用  φ(x) = elu(x) + 1 ,一种非线性激活函数。
  • Performer:使用随机特征映射来近似高斯核,从而无限逼近标准的 softmax 注意力,理论保障性更强。

5.优点:

  • 真正的线性复杂度:非常适合超长序列甚至无限长序列。
  • 具备全局视野:每个token都能间接地与所有历史token交互,不像稀疏注意力那样可能丢失信息。
  • 适用于自回归生成: S  和  Z  可以看作一种动态更新的记忆体,非常适合在解码时逐token生成。

6.缺点

  • 是近似方法:核函数无法完全精确地模拟 softmax,通常会带来一定的性能损失
  • 表达能力可能受限:复杂的核函数可能计算开销大,简单的核函数可能表达能力不足。
  • 训练-推理一致性:某些核函数(如随机特征)在训练和推理时可能表现略有不同。

2. 条件计算:动态分配计算资源

条件计算的核心思想是:并非所有输入都需要同等的计算量。让模型学会“因地制宜”地分配计算资源,跳过非必要的计算,可以大幅提升效率。

2.1 混合专家(MoE)与 MoEfication

MoEfication旨在将大型Transformer模型中的前馈网络(FFN)转换为混合专家(MoE) 版本。

工作原理

  1. 专家创建:将FFN的参数分割成多个部分,每个部分视为一个“专家”。
  2. 路由决策:引入一个轻量级的路由器(Router)。对于每个输入,路由器决定激活哪些专家(通常只是所有专家中的一小部分,如2个),而其他专家保持非激活状态。

效果:模型参数总量可能增加,但每个输入实际激活的参数(FLOPs)显著减少。例如,一个7亿参数的模型在推理时可能只激活20%的FFN参数,但在多项下游任务上性能并无明显损失。

动态演示思路

  • 展示一个标准的FFN层。
  • 将其转换为多个并行的专家(用不同颜色的方块表示)。
  • 对于不同的输入样本,通过动画演示路由器计算权重,并动态地“点亮”(激活)不同的专家组合(如只激活专家1和专家3),其他专家则灰显。

2.2 混合深度(MoD) - DeepMind

DeepMind提出的混合深度(Mixture-of-Depths, MoD) 将条件计算的概念从“宽度”(专家)扩展到了“深度”(层)。

工作原理:MoD在每一层为每个令牌动态决策:是正常经过该层的计算模块(自注意力或FFN),还是直接通过残差连接跳过该层的计算。这个决策由一个路由算法完成,并且总计算预算(每层可参与计算的令牌数量)是预先设定的静态值。

效果:MoD Transformer可以用比常规Transformer少最多50%的FLOPs 达到相当的训练损失,或者在同等FLOPs下获得更好的性能(训练目标提升可达1.5%)。

动态演示思路

  • 展示一个Transformer模型的多层结构。
  • 用一个令牌(如一个单词向量)的流动路径进行演示。
  • 在某一层,令牌到达一个“决策点”(路由器)。动画显示路由器计算一个标量权重。
  • 如果权重高,令牌进入该层的计算模块(点亮计算模块)。
  • 如果权重低,令牌直接通过一条跳过该层计算的捷径流向下一层(点亮跳过路径)。
  • 展示不同的令牌在同一层可能做出不同的决策。

3. 搜索策略:优化推理效率

在模型推理(特别是生成任务)阶段,搜索策略的选择至关重要,它决定了如何高效地找到最优或近似最优的输出序列。

3.1 集束搜索(Beam Search)

贪婪搜索(Greedy Search)每一步只选概率最高的词,容易错过全局最优解。集束搜索(Beam Search) 是其改进版,它在每一步保留多个( k ,束宽)可能性最大的候选序列。

工作原理

  1. 每一步扩展所有当前候选序列,计算下一个词的概率。
  2. 在所有可能的扩展中,选择总得分(通常是联合概率的对数和)最高的  k  个作为新的候选序列。
  3. 重复此过程,直到满足停止条件(如生成结束符  或达到最大长度)。

挑战与改进:直接使用联合概率会对长序列不公平(概率连乘导致得分天然偏低)。为此,Beam Search引入了长度惩罚(Length Penalty) 对长序列进行补偿。此外,还采用早停(Early Stopping) 机制:如果一个候选序列的当前得分已经远远低于当前最优序列,则停止对其的进一步扩展,以节省计算资源。

动态演示思路

  • 展示一个树状搜索图,根节点是起始符。
  • 每一步生成时,扩展所有可能的分支,但只高亮显示当前得分最高的top-k(如k=2)条路径。
  • 被淘汰的低分路径逐渐变淡消失。
  • 当某条路径生成  时,将其标记为完成。
  • 演示早停机制:一条得分极低的路径即使未生成  ,也被打上“×”并停止扩展。

4. 与知识蒸馏的区别

我们可以用一个比喻来理解:

注意力、条件计算、搜索优化:像是在对一辆跑车本身进行改装

  • 注意力优化:改进发动机的工作方式(让发动机更高效)。
  • 条件计算:让变速箱和气缸能智能关闭和开启(需要时才全力工作)。
  • 搜索优化:优化赛手的驾驶路线和换挡策略(更高效的驾驶方法)。
  • 目标:都是让这辆跑车(原始大模型)本身跑得更快、更省油

知识蒸馏:像是让一位顶尖赛车手(大模型,Teacher)去教一位新手学员(小模型,Student) ,希望学员能学到师傅的精湛技术,最终学员自己能独立跑出接近师傅的水平

  • 目标:是训练出一个全新的、更小、更快的模型。这个学生模型的结构可能与老师完全不同(例如,从Transformer蒸馏到CNN),它一旦训练完成,在推理时就完全独立,不再需要原来的大模型。

4.1 知识蒸馏为什么独特?

知识蒸馏的核心在于训练阶段的“知识迁移”,它要解决的是“如何让小模型学得更好”的问题。而其他三项主要是在模型结构推理过程上做文章。

1.优化的阶段不同

  • 注意力、条件计算等主要作用于模型的结构和推理过程
  • 知识蒸馏作用于模型的训练阶段

2.最终产物不同

  • 前三者的产出是一个优化后的、结构可能更复杂但计算更高效的大模型
  • 知识蒸馏的产出是一个完全独立的、体积更小、速度更快的“学生模型”

3.关注点不同

  • 前三者关注计算效率(FLOPs、内存、延迟)。
  • 知识蒸馏关注表征效率(如何用更少的参数存储和表达大模型所学到的知识)。

4.2 协同使用:1+1>2

虽然它们是不同的方向,但在实践中绝不会是二选一,而是协同使用、相辅相成的关系,共同构成模型压缩与加速的完整技术体系。

一个非常强大且现代的流程通常是:

1.架构优化:首先,你可以使用知识蒸馏,从一个庞大的教师模型(Teacher)中训练出一个已经变得更小、但性能不减的学生模型(Student)。

2.结构优化:然后,在这个学生模型的基础上,再应用注意力优化(如改为稀疏注意力)、条件计算(如引入MoE)等技术,进一步优化其计算图。

3.推理优化:最后,在部署推理时,应用搜索策略(如更高效的解码算法)以及量化(Quantization)等技术,极致地提升推理速度和减少资源占用。

结论:

知识蒸馏是模型“小型化”和“性能保持”的一个基础性、至关重要的方向,它与旨在提升计算效率的“注意力、条件计算、搜索”等优化技术平行且互补

你可以这样记忆:

  • 知识蒸馏 -> 模型级别的优化 (创造一个新模型)
  • 注意力/条件计算/搜索 -> 计算级别的优化 (改进现有模型的计算方式)

5.总结

让Transformer更小、更快是一个充满活力的研究领域。正如我们所见,通过优化注意力机制(如LSH、组合注意力、动态剪枝)、引入条件计算(如MoE, MoD)以及改进搜索策略(如Beam Search及其优化),在模型性能、计算效率和资源消耗之间找到更好的平衡点。这些优化技术使得在消费级硬件上部署和运行大型Transformer模型成为可能,推动了AI技术的民主化。

希望这份详细的介绍能为你深入学习Transformer优化技术提供一个清晰的路线图。