前言

这篇博文记录了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],这种处理是合理的。并且将模型运行的时间复杂度从与文本长度的二次相关降到了一次相关。

需要注意的是,这里的一次相关不是如下形式:required_time=k∗len(context)+brequired\_time=k*len(context)+b required_time=klen(context)+b而是这样的:required_time=k∗T∗⌈(len(context)len(sliding_window))⌉+brequired\_time=k*T*\lceil (\frac{len(context)}{len(sliding\_window)})\rceil+b required_time=kT(len(sliding_window)len(context))+blongformer将输入文本长度截断/填充到了滑动窗口长度的整数倍,对应了向下取整/向上取整(上面公式只列出一种情况)。上述公式中的参数TTTlen(sliding_window)len(sliding\_window)len(sliding_window)二次相关。在作者原代码中,为了和roberta做比较,len(sliding_window)=512len(sliding\_window)=512len(sliding_window)=512

Attention Pattern

Sliding Window

原始Transformer中的self attention矩阵如上图(a)所示,任何两个位置间都是有关联的。而sliding window是“缩水版”attention,每一个向量只和有限个其他位置的向量间有attention关联。这“有限个其他位置”排列在此向量左右(左右各一半),如上图(b)所示。

还记得在transformer-xl中Zihang Dai提到的vanilla model吗?也就是将长文本划分为一个个较短的、交集为空而并集为全集的segment,然后依次处理各segment,不同segment间没有信息传递[2]。按笔者理解,sliding window的思想和这种原始的方法很相似,只不过vanilla model是静态分割segment,sliding window是动态生成segment;vanilla model各segment间没有交集,而sliding window各segment间有交集。

这里对论文中的一段话再额外解释一下:

In a transformer with lll layers, the receptive field size at the top layer is l∗wl*wlw (assuming www is fixed for all layers)

如下图所示,假设下图所有的sliding window大小均为www。第一层中,token a2a_2a2的attention能覆盖的范围就是一个窗口大小www;第二层中,token b2b_2b2的attention在第二层能覆盖的范围也是www,即b1b_1b1b3b_3b3。但这一层的token都是从下面一层,也就是第一层传上来的,所以b1b_1b1包含了a2a_2a2捕获到的上下文信息,b3b_3b3包含了a4a_4a4捕获到的上下文信息,也就是说,b2b_2b2能利用到从a1a_1a1a5a_5a5的全部信息,而a1a_1a1a5a_5a5的context长度为2∗w2*w2w。同理可知,c2c_2c2能利用的context范围为3∗w3*w3wd2d_2d2能利用的context范围为4∗w4*w4w,第nnn层的token能利用的context范围为min(max_seq_len,n∗w)min(max\_seq\_len, n*w)min(max_seq_len,nw)。所以,longformer底层的layer仅能获取到局部信息,越上层的layer能获取到的信息越多。

Dilated Sliding Window

Dilated Sliding Window如前图c中所示,每一个token的sliding window不是紧密靠在token左右,而是在token左右两边分散开。比如说token aaa右边有m个需要attend到的对象[a1,a2...am][a_1,a_2...a_m][a1,a2...am]len(sliding_window)=2mlen(sliding\_window)=2mlen(sliding_window)=2m),那么a1a_1a1a2a_2a2间会空出ddd个token,这ddd个token和aaa之间没有attention连接。同理于任意的ana_nanan+1a_{n+1}an+1之间。

Global Attention

Global Attention如前图d中的水平、竖直标线所示。拥有global attention的token会通过global attention关联到输入的每一个token。而对称的,被关联到的token除了要attend到自己sliding window里的token,还要attend到所有使用了global attention的token。

Global Attention在下游任务中起到重要作用。比如QA中,为question的每个token都设置了global attention;在分类任务中,为[CLS]设置了global attention。

另外要注意的是,计算Global Attention的k,q,vk, q, vk,q,v时使用和计算Sliding Window的k,q,vk, q, vk,q,v不同的参数。

Pretrain-finetune

longformer引入了Pretrain-finetune机制。原作者在使用roberta参数初始化longformer模型参数的基础上,又通过mlm任务进行预训练,得到了longformer-base和longformer-large两个规模的预训练模型。预训练好的模型在原github项目和huggingface中都能找到(huggingface中使用YourAimedModel.from_pretrained("allenai/longformer-base-4096")即可加载base模型参数,large同理)

longformer代码解析

经过预训练的longformer在多个下游任务上取得了优秀的效果。这里不一一列举,请读者阅读原论文了解更多细节。我们这里只提一下复现论文效果时的一些注意事项。

https://github.com/allenai/longformer上的代码是基于pytorch-lightning和huggingface transformer实现的,笔者通过readme中的方法配环境没有成功,反倒是根据代码自己配的环境能让代码正常运行。

另外,https://github.com/allenai/longformer中scripts里的cheatsheet.txt写的是有问题的。如果读者按其命令运行,是得不到论文中提到的在triviaqa上的效果的。这个问题其实已经有大佬解决了,只是cheatsheet迟迟没有更新。此问题的解决办法见longformer论文中triviaqa上效果复现。由于有的人可能打不开链接或不清楚大佬是怎么做的,我将其截图如下并加以解释

首先,--save_prefix triviaqa-longformer-large并不能正确的加载预训练模型参数,导致测试结果极差。想要正确加载参数,我们需要用到--resume_ckpt path/to/triviaqa-longformer-large/checkpoints/ckpt_epoch_4_v2.ckpt。可是在github上下载的triviaqa-longformer-large/checkpoints/ckpt_epoch_4_v2.ckpt通过上述方法加载还会失败,所以我们要对checkpoint内容进行修改。这种修改在python terminal里进行即可。修改代码如下:

checkpoint = torch.load("path/to/triviaqa-longformer-large/checkpoints/ckpt_epoch_4_v2.ckpt")checkpoint["state_dict"]["model.embeddings.position_ids"] = torch.arange(4098).to('cuda').unsqueeze(0)
checkpoint["checkpoint_callback_best_model_path"]=""  # some versions of pytorch lightning may not need thistorch.save(checkpoint, "path/to/triviaqa-longformer-large/checkpoints/fixed_ckpt_epoch_4_v2.ckpt")

修改完后,使用--resume_ckpt path/to/triviaqa-longformer-large/checkpoints/fixed_ckpt_epoch_4_v2.ckpt就可以啦。我测试的效果如下:
{‘exact_match’: 73.16401851620168, ‘f1’: 77.782891117113}

Huggingface Longformer

https://huggingface.co/transformers/model_doc/longformer.html

Huggingface中实现了Longformer,并且是作者本人实现的。但是,上文中提到的Dilated Sliding Window并没有被实现,而且Huggingface中还给出了提示DISCLAIMER: This model is still a work in progress, if you see something strange, file a Github Issue.但不论怎样,这里给出的实现比github中原项目更易用。需要注意的是,longformer相关模型的forward函数都需要一个参数global_attention_mask用于标定需要使用global attention的token。虽然这个参数是可选的,但笔者建议大家用的时候加上这个参数。

对于Huggingface中Longformer的实现和原Longformer实现的区别,github上有一个相关的issue,但还没有答复。大家可以关注一下https://github.com/allenai/longformer/issues/210

最后提一点,longformer的最长处理长度不是4096。但是为了在可接受时间内得到结果,论文的作者在预训练longformer模型时,将输入的长度都限制在了4096个token内,超过4096个token的部分会被直接截断。
另外,longformer的时间复杂度虽然和输入长度线性相关,但这绝对不代表longformer对计算资源的需求小。恰恰相反,longformer对计算资源的需求远大于roberta。如果想在longformer上pretrain或finetune,v100是不错的选择。

Reference

[1] Olga V. Kovaleva, Alexey Romanov, Anna Rogers, and Anna Rumshisky. 2019. Revealing the dark secrets of bert. In EMNLP/IJCNLP.
[2] Zihang Dai, Zhilin Yang, Yiming Yang, William W Cohen, Jaime Carbonell, Quoc V Le, and Ruslan Salakhutdinov. Transformer-xl: Attentive language models beyond a fixed-length context. arXiv preprint arXiv:1901.02860, 2019.

Longformer论文解读和代码解析相关推荐

  1. 单目标跟踪算法:Siamese RPN论文解读和代码解析

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:周威 | 来源:知乎 https://zhuanlan.zhihu.com/p/16198364 ...

  2. Inception V3论文解读和代码解析

    目录 论文解读 代码解析 小结 论文解读 在介绍inception V2时提到过,inception V3的论文依据是Rethinking the Inception Architecture for ...

  3. YOLOv7来临:论文解读附代码解析

    前言: 是一份关于YOLOv7的论文解读,首发于[GiantPandaCV]公众号,写的不是很好,望大佬们包涵! 2022年7月,YOLOv7来临, 论文链接:https://arxiv.org/ab ...

  4. PointNet论文解读和代码解析

    目录 一.论文动机 现有的问题: 作者的思路及面临的问题: 二.论文方法 如何解决点云无序性问题?作者提出了三种想法. 针对点云的刚体运动不变性 三.网络结构 四.代码阅读 五.Reference(两 ...

  5. PointNet++论文解读和代码解析

    目录 一.论文动机 二.论文方法 三.网络结构 Set Abstraction 非均匀采样密度下的鲁棒性学习 上采样 四.代码阅读 论文地址:https://arxiv.org/pdf/1706.02 ...

  6. Wav2Lip模型------《A Lip Sync Expert Is All You Need for Speech to Lip Generation In The Wild》论文解读及代码解析

    ABSTRACT: 在这篇文档中,我们将研究任意人物的人脸视频与目标音频的口型匹配问题.当前领域能做到对特定训练过的人物进行精准的口型匹配,但在其他未训练的人物上效果不好.我们找到了导致这种问题的主要 ...

  7. 针对NLP长文本处理问题的Longformer论文解读

    Longformer论文解读: The Long-Document Transformer_习惯与规则决定命运-CSDN博客

  8. CVPR 2020 Oral 文章汇总,包括论文解读与代码实现

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要10分钟 Follow小博主,每天更新前沿干货 [导读]本文为大家整理了10篇CVPR2020上被评为Oral的论文解读和代码汇总. 1.Ra ...

  9. 【Cylinder3D论文解读及代码略解】

    Cylinder3D论文解读及代码略解 论文解读 Abstract Introduction Related work 室内点云分割 室外点云分割 3D体素划分 Methodology(本文方法) C ...

最新文章

  1. c++对象模型-虚拟析构函数
  2. 数据库面试题【三、索引有B+索引和hash索引】
  3. Android显示广播写法,【Android】广播的写法
  4. spring可用于数据层吗_Spring XD用于数据提取
  5. Linux彻底删除mysql
  6. rust 静态 android,rust android make
  7. MySQL----数据的显示位宽
  8. 层次分析法在高校教学评价体系中的应用(原理+实例+工具)
  9. 解决win10系统俄罗斯精简版用不了打印机问题
  10. Pytho字典生成式
  11. 开源硬件童芯派了解一下?一个真创客聊聊开源硬件
  12. PostgreSQL:不支持 10 验证类型
  13. MIS软件工程师的面试问题与方法
  14. 德智体美劳,全面发展的DevOps
  15. border-radius 兼容 IE8浏览器
  16. WPF引入OCX控件
  17. linux三剑客试题,Linux三剑客(grep、sed、awk)详解
  18. [转帖]超能网 主板类型
  19. maven项目 骨架搭建
  20. 【docker】dbclient远程访问非本机数据库(mysql,oracle,postgres,sqlserver/mssql),测试远程数据库连通性

热门文章

  1. W3School20道题 测试你的HTML技能
  2. 分布式事务框架Seata的使用
  3. steam创建账号一直验证人工操作_绝地求生轻量版即将登陆STEAM:预约送M416皮肤...
  4. Qt自带例子:AnalogClock ,增加了秒针
  5. 鸿蒙系统一碰及连,华为新系统来了!鸿蒙OS+EMUI 11,设备协同无缝连接...
  6. linux触摸板设置密码程序6,Touchégg: Linux 上触摸板/屏的多指手势
  7. java将office文档pdf文档转换成swf文件在线预览
  8. 教授专栏35 | 许彬:AR校园元宇宙
  9. python 创建软连接_Python搭建环境
  10. Excel中Vlookup函数近似匹配和精确匹配