前言
这篇博文记录了longformer论文的主要思想、代码实现和结果复现方面的一些工作,相关链接如下:
原longformer论文地址
github上原作者公开的代码
huggingface上原作者编辑的longformer模块
原论文解读
其时transformer-xl已经突破了transformer对处理文本长度的限制,那longformer的意义是什么呢?原作者的解释是这样的:
transformer-xl处理长文本时按从左到右的方式自回归处理,这样每一个segment只能看到其所在的segment和其之前的segment,而看不到其后方的内容。这对于需要双向信息的任务是不利的(比如QA),而longformer将整个长文本直接输入,避免了transformer-xl的问题。
longformer的核心技术
longformer本质上是一种sparse attention的方法,也就是每个token不是attend到整个输入文本,而仅attend一个窗口大小的范围。这个窗口在此token附近。 根据前人的工作[1],这种处理是合理的。并且将模型运行的时间复杂度从与文本长度的二次相关降到了一次相关。
需要注意的是,这里的一次相关不是如下形式: r e q u i r e d _ t i m e = k ∗ l e n ( c o n t e x t ) + b required\_time=k*len(context)+b required_time=k∗len(context)+b而是这样的: r e q u i r e d _ t i m e = k ∗ T ∗ ⌈ ( l e n ( c o n t e x t ) l e n ( s l i d i n g _ w i n d o w ) ) ⌉ + b required\_time=k*T*\lceil (\frac{len(context)}{len(sliding\_window)})\rceil+b required_time=k∗T∗⌈(len(sliding_window)len(context))⌉+blongformer将输入文本长度截断/填充到了滑动窗口长度的整数倍,对应了向下取整/向上取整(上面公式只列出一种情况)。上述公式中的参数