Hugging Face 阅读会,2021 年 2 月——长程 Transformer

由 Teven Le Scao、Patrick Von Platen、Suraj Patil、Yacine Jernite 和 Victor Sanh 共同撰写。
每个月,我们将选择一个主题进行深入阅读,阅读该主题的四篇最新论文。然后,我们将撰写一篇简短的博客文章,总结它们的发现、共同趋势以及我们阅读后对后续工作的疑问。2021 年 1 月的第一个主题是稀疏性和剪枝,2021 年 2 月我们探讨了 Transformer 中的长程注意力。
简介
2018 年和 2019 年大型 Transformer 模型兴起后,很快出现了两种趋势来降低其计算要求。首先,条件计算、量化、蒸馏和剪枝为计算受限环境中的大型模型推理提供了可能性;我们已在上次阅读小组帖子中部分提及。然后,研究社区开始着手降低预训练的成本。
特别是,一个问题一直是工作的核心:Transformer 模型在内存和时间上随序列长度呈二次方成本。为了高效训练超大型模型,2020 年涌现了大量论文来解决这个瓶颈,并将 Transformer 扩展到年初 NLP 领域默认的 512 或 1024 序列长度之外。
这个主题从一开始就是我们研究讨论的关键部分,我们自己的 Patrick Von Platen 已经为 Reformer 撰写了 4 部分系列文章。在这个阅读小组中,我们不会试图涵盖所有方法(太多了!),而是将重点放在四个主要思想上:
- 自定义注意力模式(使用 Longformer)
- 循环(使用 Compressive Transformer)
- 低秩近似(使用 Linformer)
- 核函数近似(使用 Performer)
有关该主题的详尽观点,请查阅 高效 Transformer:一项调查 和 长程竞技场。
摘要
Longformer - 长文档 Transformer
Iz Beltagy, Matthew E. Peters, Arman Cohan
Longformer 通过将传统的自注意力机制替换为窗口化/局部/稀疏(参考 稀疏 Transformer (2019))注意力与全局注意力的组合,解决了 Transformer 的内存瓶颈,使其计算复杂度随序列长度线性增长。与之前的长程 Transformer 模型(例如 Transformer-XL (2019)、Reformer (2020)、自适应注意力跨度 (2019))不同,Longformer 的自注意力层被设计为标准自注意力的直接替代品,从而可以利用预训练的检查点进行进一步的预训练和/或在长序列任务上进行微调。
标准自注意力矩阵(图 a)随输入长度呈二次方增长。

Longformer 对自回归语言建模、编码器预训练和微调以及序列到序列任务使用不同的注意力模式。
- 对于自回归语言建模,通过将因果自注意力(如 GPT2)替换为膨胀窗口式自注意力(图 c)获得最佳结果。其中 是序列长度, 是窗口长度,这种注意力模式将内存消耗从 减少到 ,在 的假设下,内存消耗随序列长度线性增长。
- 对于编码器预训练,Longformer 将双向自注意力(如 BERT)替换为局部窗口化自注意力和全局双向自注意力(图 d)的组合。这将内存消耗从 减少到 ,其中 是全局关注的 token 数量,同样随序列长度线性增长。
- 对于序列到序列模型,只有编码器层(如 BART)被替换为局部和全局双向自注意力的组合(图 d),因为对于大多数 seq2seq 任务,只有编码器处理非常大的输入(例如摘要)。因此,内存消耗从 减少到 ,其中 和 分别是源(编码器输入)和目标(解码器输入)长度。为了使 Longformer 编码器-解码器高效,假定 远大于 。
主要发现
- 作者提出了膨胀窗口自注意力(图 c),并表明它在语言建模方面比单纯的窗口式/稀疏自注意力(图 b)能产生更好的结果。窗口大小在各层之间逐渐增加。这种模式在下游基准测试中进一步超越了以前的架构(如 Transformer-XL 或自适应跨度注意力)。
- 全局注意力允许信息流经整个序列,并且将全局注意力应用于任务相关令牌(例如 QA 中的问题令牌,句子分类的 CLS 令牌)可以带来更强的下游任务性能。使用这种全局模式,Longformer 可以成功应用于迁移学习设置中的文档级 NLP 任务。
- 可以通过简单地将标准自注意力替换为本文提出的长程自注意力,然后对下游任务进行微调,将标准预训练模型适应于长程输入。这避免了长程输入特定的昂贵预训练。
后续问题
- 膨胀窗口式自注意力(贯穿各层)的尺寸增加与计算机视觉中堆叠 CNN 感受野的增加相呼应。这两个发现之间有什么关系?有哪些可借鉴的经验?
- Longformer 的编码器-解码器架构对于不需要长目标长度的任务(如摘要)效果很好。然而,对于需要长目标长度的长程 seq2seq 任务(如文档翻译、语音识别等),特别是考虑到编码器-解码器模型的交叉注意力层,它将如何工作?
- 在实践中,滑动窗口自注意力依赖于许多索引操作以确保对称的查询-键权重矩阵。这些操作在 TPU 上非常慢,这凸显了此类模式在其他硬件上的适用性问题。
用于长程序列建模的压缩 Transformer
Jack W. Rae, Anna Potapenko, Siddhant M. Jayakumar, Timothy P. Lillicrap
Transformer-XL (2019) 表明,在内存中缓存先前计算的层激活可以提高语言建模任务的性能(例如 *enwik8*)。模型不仅可以关注当前的 个输入 token,还可以关注过去的 个 token,其中 是模型的内存大小。Transformer-XL 的内存复杂度为 ,这表明对于非常大的 ,内存成本会显著增加。因此,当缓存的激活数量大于 时,Transformer-XL 最终不得不从内存中丢弃过去的激活。压缩 Transformer 通过添加额外的压缩内存来解决这个问题,以有效地缓存原本会最终被丢弃的过去激活。通过这种方式,模型可以更好地学习长程序列依赖性,因为它能够访问显著更多的过去激活。

选择一个压缩因子 (图中为 3)来决定过去激活的压缩速率。作者实验了不同的压缩函数 ,例如最大池化/平均池化(无参数)和一维卷积(可训练层)。压缩函数通过时间反向传播或局部辅助压缩损失进行训练。除了当前长度为 的输入外,模型还关注常规内存中 个缓存激活,以及 个压缩内存激活,从而实现 的长时序依赖,其中 是注意力层的数量。这使 Transformer-XL 的范围增加了额外的 个 token,内存成本为 。实验在强化学习、音频生成和自然语言处理领域进行。作者还引入了一个新的长程语言建模基准,名为 PG19。
主要发现
- 压缩 Transformer 显著超越了语言建模领域的最新困惑度(perplexity),尤其是在 enwik8 和 WikiText-103 数据集上。特别地,压缩内存对于建模长序列中出现的稀有词汇起着至关重要的作用。
- 作者们展示了模型通过越来越多地关注压缩内存而不是常规内存来学习保留显著信息,这与旧内存被访问频率降低的趋势相反。
- 所有压缩函数(平均池化、最大池化、一维卷积)都产生了相似的结果,证实了内存压缩是存储过去信息的有效方式。
后续问题
- 压缩 Transformer 需要一种特殊的优化策略,其中有效批量大小逐渐增加,以避免较低学习率下显著的性能下降。这种影响尚未被很好理解,需要更多的分析。
- 与 BERT 或 GPT2 等简单模型相比,压缩 Transformer 具有更多超参数:压缩率、压缩函数和损失、常规内存和压缩内存大小等。目前尚不清楚这些参数是否能在不同任务(除了语言建模之外)中很好地泛化,或者像学习率一样,使训练变得非常脆弱。
- 探测常规内存和压缩内存以分析通过长序列记忆了哪些信息将是很有趣的。阐明最显著的信息片段可以为诸如 Funnel Transformer 等方法提供信息,该方法旨在减少维持全长 token 级序列的冗余。
Linformer:具有线性复杂度的自注意力
Sinong Wang, Belinda Z. Li, Madian Khabsa, Han Fang, Hao Ma
目标是将自注意力机制相对于序列长度 )的复杂度从二次方降低到线性。本文观察到注意力矩阵是低秩的(即它们不包含 的信息),并探索使用高维数据压缩技术来构建更内存高效的 Transformer 的可能性。
所提方法的理论基础基于 Johnson-Lindenstrauss 引理。考虑高维空间中的 个点。我们希望将它们投影到低维空间,同时以误差 的余量来保留数据集的结构(即点之间的相互距离)。Johnson-Lindenstrauss 引理指出,我们可以选择一个小的维度 ,并通过简单地尝试随机正交投影,在多项式时间内找到合适的投影到 Rk 中。
Linformer 通过学习注意力上下文矩阵的低秩分解,将序列长度投射到更小的维度。然后,自注意力的矩阵乘法可以巧妙地重写,使得无需计算和存储大小为 的矩阵。
标准 Transformer
(n * h) (n * n) (n * h)
Linformer
(n * h) (n * d) (d * n) (n * h)
主要发现
- 自注意力矩阵是低秩的,这意味着其大部分信息可以通过其前几个最高特征值恢复,并且可以用低秩矩阵进行近似。
- 许多工作都专注于降低隐藏状态的维度。本文表明,通过学习投影来减小序列长度是一种强有力的替代方案,同时将自注意力的内存复杂度从二次方缩小到线性。
- 增加序列长度不影响 Linformer 的推理速度(时钟时间),而 Transformer 则呈线性增长。此外,Linformer 的自注意力不影响收敛速度(更新次数)。

后续问题
- 尽管投影矩阵在各层之间共享,但此处提出的方法与 Johnson-Lindenstrauss 定理相悖,后者指出随机正交投影就足够了(在多项式时间内)。随机投影在这里会起作用吗?这让人想起 Reformer,它在局部敏感哈希中使用随机投影来降低自注意力的内存复杂度。
使用 Performer 重新思考注意力机制
Krzysztof Choromanski, Valerii Likhosherstov, David Dohan, Xingyou Song, Andreea Gane, Tamas Sarlos, Peter Hawkins, Jared Davis, Afroz Mohiuddin, Lukasz Kaiser, David Belanger, Lucy Colwell, Adrian Weller
目标(再次!)是将自注意力机制相对于序列长度 )的复杂度从二次方降低到线性。与其他论文不同,作者指出自注意力的稀疏性和低秩先验可能不适用于其他模态(语音、蛋白质序列建模)。因此,本文探讨了在不预设注意力矩阵任何先验的情况下,减轻自注意力内存负担的方法。
作者观察到,如果能通过 softmax 执行矩阵乘法 (),我们就无需计算大小为 的 矩阵,这是内存瓶颈。他们使用随机特征映射(又称随机投影)来近似 softmax,如下所示:
,其中 是一个非线性函数。然后
受 2000 年代早期机器学习论文的启发,作者引入了 **FAVOR+**(**F**ast **A**ttention **V**ia **O**rthogonal **R**andom positive (**+**) **F**eatures),该程序旨在找到自注意力矩阵的无偏或近乎无偏估计,具有均匀收敛性和低估计方差。
主要发现
- FAVOR+ 过程可以高精度地近似自注意力矩阵,而无需预设注意力矩阵的形式,使其可以作为标准自注意力的直接替代品,并在多个应用和模态中带来强大的性能。
- 对 softmax 如何近似以及不该如何近似的深入数学研究,凸显了即使在深度学习时代,2000 年代早期开发的原则性方法仍然具有重要意义。
- FAVOR+ 也可应用于除了 softmax 之外的其他可核化注意力机制的有效建模。
后续问题
- 即使注意力机制的近似是紧密的,小误差也会通过 Transformer 层传播。这就提出了使用 FAVOR+ 作为自注意力近似的预训练网络微调的收敛性和稳定性问题。
- FAVOR+ 算法是多个组件的组合。目前尚不清楚这些组件中哪个对性能影响最大,尤其是在考虑到这项工作中涉及的各种模态的情况下。
阅读小组讨论
基于 Transformer 的预训练语言模型在自然语言理解和生成方面的进展令人印象深刻。使这些系统高效用于生产目的已成为一个非常活跃的研究领域。这强调了我们仍有许多东西需要学习和构建,无论是在方法论还是实践方面,以实现高效和通用的基于深度学习的系统,特别是对于需要建模长程输入的应用程序。
上述四篇论文提供了不同的方法来处理自注意力机制的二次内存复杂度,通常通过将其降低到线性复杂度。Linformer 和 Longformer 都依赖于自注意力矩阵不包含 信息量(注意力矩阵是低秩和稀疏的)的观察结果。Performer 提供了一种原则性方法来近似 softmax-attention 核(以及任何可核化的注意力机制,超越 softmax)。压缩 Transformer 提供了一种基于递归来建模长程依赖关系的正交方法。
这些不同的归纳偏置在计算速度和训练设置之外的泛化能力方面都有影响。特别是,Linformer 和 Longformer 带来了不同的权衡:Longformer 明确设计了自注意力的稀疏注意力模式(固定模式),而 Linformer 学习了自注意力矩阵的低秩分解。在我们的实验中,Longformer 的效率低于 Linformer,并且目前高度依赖于实现细节。另一方面,Linformer 的分解仅适用于固定上下文长度(训练时固定),并且在没有特定适应的情况下无法泛化到更长的序列。此外,它无法缓存先前的激活,这在生成设置中可能非常有用。有趣的是,Performer 在概念上是不同的:它学习近似 softmax 注意力核,而不依赖于任何稀疏性或低秩假设。这些归纳偏置在不同训练数据量下如何相互比较的问题仍然存在。
所有这些工作都强调了自然语言中长程输入建模的重要性。在工业界,经常会遇到诸如文档翻译、文档分类或文档摘要等用例,这些用例需要以高效且稳健的方式建模非常长的序列。最近,零样本示例预热(类似 GPT3)也成为标准微调的一种有前景的替代方案,并且增加预热示例的数量(从而增加上下文大小)稳步提高了性能和鲁棒性。最后,在语音或蛋白质建模等其他模态中,通常会遇到超过标准 512 个时间步长的长序列。
对长输入进行建模并非与对短输入进行建模相互对立,而应将其视为从短序列到长序列的一个连续过程。Shortformer、Longformer 和 BERT 都提供了证据,表明在短序列上训练模型并逐渐增加序列长度可以加速训练并提高下游性能。这一观察与以下直觉相符:在数据量很少时获得的长程依赖关系可能依赖于虚假相关性,而不是可靠的语言理解。这与 Teven Le Scao 在语言建模方面进行的一些实验相呼应:与 Transformer 相比,LSTM 在低数据状态下是更强的学习器,并且在诸如 Penn Treebank 等小规模语言建模基准上提供了更好的困惑度。
从实践角度来看,位置编码问题也是一个关键的方法论方面,涉及计算效率的权衡。相对位置编码(在 Transformer-XL 中引入并在压缩 Transformer 中使用)具有吸引力,因为它们可以很容易地扩展到尚未见过的序列长度,但同时,相对位置编码计算成本高昂。另一方面,绝对位置编码(在 Longformer 和 Linformer 中使用)对于比训练期间见过的序列更长的序列灵活性较低,但计算效率更高。有趣的是,Shortformer 引入了一种简单的替代方案,通过将位置信息添加到自注意力机制的查询和键中,而不是将其添加到 token 嵌入中。该方法被称为位置注入注意力(position-infused attention),被证明非常高效,同时产生强大的结果。
@Hugging Face 🤗:长程建模
Longformer 的实现及相关开源检查点可通过 Transformers 库和 模型中心 获取。Performer 和 Big Bird(一种基于稀疏注意力的长程模型)目前正在开发中,作为我们模型征集的一部分,这是一项旨在促进开源贡献的社区工作。如果您想知道如何为 `transformers` 做贡献但不知道从何开始,我们非常期待您的来信!
如需进一步阅读,我们建议查看 Patrick Platen 关于 Reformer 的博客、Teven Le Scao 关于 Johnson-Lindenstrauss 近似 的帖子、《高效 Transformer:一项调查》以及《长程竞技场:高效 Transformer 的基准》。
下个月,我们将介绍自训练方法和应用。三月再见!