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站是哪个号呢?
数学家是我理想