前言
今天要与你们分享的是AllenAI今年发表的最新工做,Longformer——一种可高效处理长文本的升级版Transformer。做者团队提供了开源代码,你们可快速复现,直接用于本身的任务。git
传统Tranformer-based模型在处理长文本时有着自然的劣势。由于传统模型采用的是“全链接”型的attention机制,即每个token都要与其余全部token进行交互。其attention复杂度高达。此前的解决办法是将长文切分为若干个较短的text span,而后逐个处理。这就致使不一样的text span之间没法进行交互,于是必然存在大量information loss。固然,咱们也能够经过添加一些其余机制来增强这种text span之间的交互。但这种新增机制实现起来一般比较复杂,并且每每是task-specific的,通用性不强。github
本文提出的Longformer,改进了Transformer的传统attention机制:对于每个token,只对固定窗口大小的附近token计算local attention,并结合具体任务,计算少许的global attention。该方法的优势包括:ide
原文连接:
https://arxiv.org/pdf/2004.05150.pdf
Github:
https://github.com/allenai/longformer
Arxiv访问慢的小伙伴也能够在订阅号 「夕小瑶的卖萌屋」 后台回复关键词 【0716】下载论文PDF~
模型
做者共提出了三种新的attention pattern,来下降传统self-attention的复杂度,分别是滑窗机制、膨胀滑窗机制、融合全局信息的滑窗机制。下图展现了传统attention与这三种attention pattern的示意图。接下来将为你们分别讲解。
1. 滑窗机制(Sliding window): 对于每个token,只对其附近的w个token计算attention计算复杂度与文本序列长度成线性关系,为。做者认为,根据应用任务的不一样能够对Transformer每一层施以不一样的窗口大小,对模型表示能力可能有潜在帮助。性能
读到这里的,你们可能和我同样,误认为这个窗口应该比较小,估计在16~64这个量级。但看到实验部分会发现,做者在具体实现的时候,设置的窗口大小为512,和Bert的Input限制彻底同样。因此,你们不要存有“Longformer比Bert还要更轻量”的错觉。学习
2. 膨胀滑窗机制(Dilated sliding window): 在对每个进行token编码时,普通滑窗机制只能考虑到长度为的上下文。做者进一步提出膨胀滑窗机制,在不增长计算负荷的前提下,拓宽模型“视场”。其作法借鉴了空洞卷积的思想[1]。以下图所示,在滑动窗口中,被attend到的两个相邻token之间会存在大小为d的间隙。当transformer的层数为l时,则视场范围可达到。实验代表,因为考虑了更加全面的上下文信息,膨胀滑窗机制比普通的滑窗机制表现更佳。测试
3. 融合全局信息的滑窗机制(Global+sliding window): 咱们知道Bert一类的语言模型在应用于具体任务时,实现方式略有不一样。好比,对于文本分类任务,咱们会在文本序列前添加[CLS]这一特殊token;而对于QA类任务,则会将问题与文本进行拼接后输入。在Longformer中,做者也但愿可以根据具体任务的不一样,在local attention的基础上添加少许的global attention。好比,在分类任务上就会在[CLS]处添加一个global attention,而在QA任务上会对question中的全部token添加global attention。以下图所示,对于添加了global attention的token,咱们对其编码时要对整个序列作attention。而且,编码其余全部token时,也都要attend到它。
实验
自定义CUDA内核
因为现有的深度学习库中并无能直接实现膨胀滑窗机制的接口,为此做者直接自定义了CUDA内核操做,用于实现Longformer的attention pattern[2]。以下图所示,Longformer的内存消耗与文本长度成线性关系(红线)。用自定义CUDA来实现Longformer,相比于用Naive Pytorch来实现(蓝线),运行速度加快了六倍。片
Longformer在字符级别任务上的表现
做者在text8和enwik8两个字符级任务上对Longformer进行实验。实验中,模型每一层采用了不一样的窗口大小:底层使用较小的滑窗,以建模局部信息;在高层使用较大的滑窗,以扩大感觉野。训练时,理想情况下固然是但愿使用GPU所能承受的最大的window size和sequence len。但为了加快训练速度,做者采用的是一种阶段式的训练方式:在学习更长的上下文以前,先学好局部的上下文。在第一阶段,先设置较短的序列长度和窗口大小。在后续阶段,window size和sequence length增长一倍,学习率减半 实验结果以下图所示,Longformer在这两个数据集上皆达到了SOTA效果(注:测试指标为BPC,bits-per-character;BPC越小,性能越优)。编码
做者经过实验,对滑窗机制的设置进行了进一步的讨论。以下表所示:spa