Introduction
Longformer 是一种可高效处理长文本的模型,出自 AllenAI 2020 年 4 月 10 日。目前已经开源,而且可以通过 huggingface 快速使用
传统 Transformer-based 模型在处理长文本时存在一些问题,因为它们均采用 "我全都要看" 型的 attention 机制,即每一个 token 都要与其他所有 token 进行交互,无论是空间还是时间复杂度都高达 $O (n^2)$。为了解决这个问题,之前有些工作是将长文本切分为若干个较短的 Text Segment,然后逐个处理,例如 Transformer-XL。但这会导致不同的 Text Segment 之间无法进行交互,因而必然存在大量的 information loss(信息丢失)。当然,我们也可以通过添加一些其它机制来加强 Text Segment 之间的交互,但这种新机制实现起来要么很复杂,要么是 task-specific 的,通用性不强
本文提出的 Longformer,改进了 Transformer 传统的 self-attention 机制。具体来说,每一个 token 只对固定窗口大小附近的 token 进行 local attention(局部注意力)。并且 Longformer 针对具体任务,在原有 local attention 的基础上增加了一种 global attention(全局注意力)
Longformer 在两个字符级语言建模任务上都取得了 SOTA 的效果。并且作者用 Longformer 的 attention 方法继续预训练 RoBERTa,训练得到的语言模型在多个长文档任务上进行 fine-tune 后,性能全面超越 RoBERTa
Related Work
作者共提出了三种新的 attention 机制,这三种方法都很好的降低了传统 self-attention 的复杂度,它们分别是滑窗机制、空洞滑窗机制、融合全局信息的滑窗机制,对应于下图的 $b,c,d$
滑窗机制 (Sliding window attention)
对于每一个 token,只对其附近的 $w$ 个 token 计算 attention,复杂度为 $O (n\times w)$,其中 $n$ 为文本的长度。作者认为,根据应用任务的不同,可以对 Transformer 每一层施以不同的窗口大小 $w$
读到这里,大家可能和我一样,误认为这个窗口 $w$ 的值比较小,估计在 8-64 的量级。但看到实验部分会发现,作者在具体实现的时候,设置的窗口大小 $w=512$,与 BERT 的 input 限制完全一样,所以大家不要存有 "Longformer 比 BERT 更轻量" 的错觉
空洞滑窗机制 (Dilated sliding window)
对每一个 token 进行编码时,普通的滑窗机制只能考虑到长度为 $w$ 的上下文。作者进一步提出空洞滑窗机制(实际上空洞滑窗是 CV 领域中很早就有的一项技术),在不增加计算负荷的前提下,拓宽视野范围。在滑动窗口中,被 attented 到的两个相邻 token 之间会存在大小为 $d$ 的间隙,因此每个 token 的视野范围可达到 $d\times w$。实验表明,由于考虑了更加全面的上下文信息,空洞滑窗机制比普通的滑窗机制表现更佳
实际上我个人认为,空洞滑窗的效果存在一定的运气成分,凭什么 attend 某个间隔之外的词,效果就一定比单纯 attend 周围的词效果更好呢?举个反例说明:
I lost some money at the casino yesterday
传统滑窗,窗口大小 $w=5$,那么
lost
这个词就可以 attend 到casino
空洞滑窗,窗口大小 $w=5,d=5$,那么
lost
这个词就没办法 attend 到casino
是否 attend 到
casino
这个词,对于这句话意思的理解有着至关重要的影响再回到空洞滑窗本身,其实相比于传统滑窗,它看到 token 的数量并没有增加,无非是通过间隔一定数量的 token 来达到视野范围扩大的效果。然而就像我上面举的例子,这些被间隔的 token 是否就不重要呢?似乎要打一个问号
融合全局信息的滑窗机制 (Global+sliding window)
我们知道 BERT 类的语言模型在 fine-tune 时,实现方式略有不同。比如,对于文本分类任务,我们会在整个输入的前面加上 [CLS]
这个 token;而对于 QA 任务,我们则会将问题与文本进行拼接后进行输入。在 Longformer 中,作者也希望能够根据具体任务的不同,在原本 local attention 的基础上添加少量的 global attention。例如,在分类任务中会在 [CLS]
初添加一个 global attention(对应下图第一行第一列全绿);而在 QA 任务上会对 question 中的所有 token 添加 global attention。如下图所示,对于添加了 global attention 的 token,我们对其编码时要对整个序列做 attention,并且编码其它 token 时,也都要 attend 到它
Results
作者在 text8 和 enwiki8 两个字符级任务上对 Longformer 进行了实验。实验中每一层采用了不同的窗口大小,具体来说:底层使用较小的滑窗,以构建局部信息;越上层滑窗越大,以扩大感受野。训练时,理想状况当时是希望使用 GPU 所能承受最大的 $w$ 和 sequence length,但为了加快训练速度,作者采用的是多阶段训练法:从较短的序列长度和窗口大小开始,后续每个阶段将窗口大小和训练长度增加一倍,并将学习率减半。作者一共训练了 5 个阶段,第一个阶段 sequence length 是 2048,最后一个阶段是 23040
实验结果如下所示,Longformer 在这两个数据集上皆达到了 SOTA(注:测试指标为 BPC,bits-per-character,BPC 越小性能越好)
作者通过实验,对滑窗机制的设置进行了进一步讨论,如下表所示
- 第一组实验(前三行)讨论的是:如果不同层采用不同的窗口大小,是否可以提高性能?结果表明,由底至高层递增窗口大小,可以提升性能;反之则降低
- 第二组实验(后两行)讨论的是:采用空洞滑窗机制是否可以提高性能?结果是肯定的
MLM Pretraining
作者以 RoBERTa 为基础,采用 Longformer 的方法在以下四个文档级语料上进行预训练,并且设定每一层都采用固定大小为 512 的滑动窗口,暂时不添加 global attention。为支持长文本,论文中作者把 position embedding 扩展到了 4096 的大小
预训练结束后,作者在多个文档级任务上进一步对预训练模型做 fine-tuning。fine-tune 时会根据任务增加 global attention,同时设置两套映射矩阵,一套用于局部自注意力,另一套用于全局注意力。实验结果 Longformer 全面超越了 RoBERTa
Ablation Study
为了证明 Longformer 更优异的性能并不是因为对 RoBERTa 额外的训练带来的,作者做了一组消融实验。下表中 Longformer (seqlen:512, attention: n^2)
采用的是和 RoBERTa 完全相同的序列长度和 attention 机制,但是在继续预训练之后效果却并没有变得更好
自从知道这个网站后,感觉自己开始成长了 @(红领巾)。还有 UP 在 B 站配套的视频,爱了爱了 @(大拇指)
感谢,各位的支持就是我学习的动力
写的非常不错,B 站是哪个号呢?
数学家是我理想