[论文笔记]Longformer: The Long-Document Transformer

news2024/12/25 12:53:58

引言

今天带来论文Longformer: The Long-Document Transformer的笔记。

基于Transformer的模型由于其自注意力操作而无法处理长序列,该操作随着序列长度呈二次扩展。为了解决这一限制,本篇工作提出了Longformer,其注意力机制随着序列长度呈线性扩展。同时提出了三种稀疏注意力降低计算复杂度,分别是滑动窗口注意力、扩张滑动窗口注意力和全局注意力。

总体介绍

Longformer是一种改进的Transformer架构,具有一个自注意力操作,其随着序列长度线性扩展,使其适用于处理长文档。其注意力机制结合了窗口化的局部上下文自注意力和端到端任务驱动的全局注意力,编码了关于任务的归纳偏见。

相关工作

image-20240505163349667

长文档Transformer 表1总结了最近关于长文档的先前工作。已经探索了两种自注意力方法。第一种是从左到右(ltr)的方法,逐块处理文档并从左到右移动。虽然这种模型在自回归语言建模中取得了成功,但对于从双向上下文中受益的任务来说并不适用于迁移学习方法。

作者的工作属于另一种一般方法,即定义某种形式的稀疏注意力模式,并避免计算完整的二次注意力矩阵乘法。与作者注意力模式最相似的模型是 Sparse-Transformer,它使用由BlockSparse提供的8x8大小块的一种扩张滑动窗口形式)。

一些模型尝试了除自回归语言建模之外的任务,这是一大进步,因为可以认为将语言建模作为主要评估方法导致了具有有限适用性的模型的发展。BPTransformer在机器翻译(MT)上进行评估,但没有探索预训练微调设置。分块注意力对其模型进行了预训练,并在问答上进行了评估。然而,由于评估不包括语言建模,并且QA数据集的文档相对较短,因此这种模型在长文档任务上的有效性尚未被探究。

长文档的任务特定模型 已经开发了许多针对512限制的预训练转换器模型的任务特定方法。最简单的方法只是截断文档,通常用于分类。另一种方法将文档划分为长度为512的块(可以重叠),分别处理每个块,然后将激活与特定任务模型结合起来。一种流行的适用于多跳和开放域QA任务的第三种方法使用两阶段模型,第一阶段检索相关文档,然后将其传递到第二阶段进行答案提取。所有这些方法都存在由于截断或来自两阶段方法的级联错误而导致的信息丢失。相比之下,Longformer可以处理长序列而无需截断或分块,这使我们能够采用一种更简单的方法,将可用上下文连接起来并在一次传递中处理它。

Longformer

image-20240505201013318

原始Transformer模型具有 O ( n 2 ) O(n^2) O(n2)的时间和内存复杂度的自注意力组件,其中n是输入序列的长度。为了解决这一挑战,作者根据指定彼此关注的输入位置对的"注意力模式"对完整的自注意力矩阵进行了稀疏化。与完整的自注意力不同,作者提出的注意力模式与输入序列呈线性关系,使其适用于更长的序列。

注意力模式

image-20240505183800178

滑动窗口(Sliding Window) 基于局部上下文的重要性,注意力模式采用围绕每个标记的固定大小窗口的注意力。使用多个堆叠层的这种窗口注意力会产生一个大的感受野,顶层可以访问所有输入位置,并具有构建跨整个输入的信息的表示的能力,类似于CNN。给定固定的窗口大小 w w w,每个标记都会关注其两侧 1 2 w \frac{1}{2}w 21w个标记(图2b)。这种模式的计算复杂性为 O ( n × w ) O(n×w) O(n×w),与输入序列长度 n n n呈线性关系。

在具有 l l l层的Transformer中,顶层的感受野大小为 l × w l \times w l×w(假设对于所有层 w w w是固定的)。根据应用程序的不同,可能为每个层使用不同的 w w w值更好,以在效率和模型表示能力之间取得平衡。

扩张滑动窗口 为了进一步增加感受野而不增加计算量,滑动窗口可以"扩张"。这类似于扩张卷积神经网络,其中窗口具有大小为扩张值 d d d的间隔。假设对于所有层都是固定的 d d d w w w,那么感受野大小为 l × d × w l×d×w l×d×w,即使对于较小的 d d d值,也可以触及成千上万个标记。在多头注意力中,每个注意力头计算不同的注意力分数。每个头部具有不同的扩张配置的设置可以通过允许一些没有扩张的头部关注局部上下文,而其他具有扩张的头部专注于更长的上下文,从而提高性能。

全局注意力 在最先进的基于BERT风格的自然语言任务模型中,最佳的输入表示因任务而异,对于语言建模也有所不同。对于掩码语言建模,模型使用局部上下文来预测被掩码的单词,而对于分类,模型将整个序列的表示聚合到一个特殊标记中。对于问答(QA),问题和文档被连接在一起,使模型可以通过自注意力比较问题和文档。

滑动窗口和扩张注意力不足以学习特定任务的表示。因此,在少数预选的输入位置上添加"全局注意力"。重要的是,使这种注意力操作是对称的:即具有全局注意力的标记会关注整个序列中的所有标记,而序列中的所有标记也会关注它。图2d显示了一个示例,其中滑动窗口注意力在自定义位置的少数标记上具有全局注意力。例如,在分类任务中,全局注意力用于[CLS]标记,而在QA中,全局注意力则放在所有问题标记上。由于这些标记的数量相对较小且独立于 n n n,因此结合局部和全局注意力的复杂度仍然为 O ( n ) O(n) O(n)。虽然指定全局注意力是与任务相关的,但这是一种向模型的注意力添加归纳偏差的简单方式,比起使用复杂架构将信息跨越较小的输入块组合的现有任务特定方法要简单得多。

线性投影用于全局注意力 回顾一下,给定线性投影 Q Q Q K K K V V V​​,Transformer模型计算注意力分数如下:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V (1) \text{Attention}(Q,K,V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d_k}}\right) V \tag 1 Attention(Q,K,V)=softmax(dk QKT)V(1)
使用两组投影, Q s Q_s Qs K s K_s Ks V s V_s Vs,来计算滑动窗口注意力的注意力分数,使用 Q g Q_g Qg K g K_g Kg V g V_g Vg来计算全局注意力的注意力分数。额外的投影提供了对不同类型的注意力进行建模的灵活性。 Q g Q_g Qg K g K_g Kg V g V_g Vg都初始化为与 Q s Q_s Qs K s K_s Ks V s V_s Vs匹配的值。

实现

在常规的Transformer模型中,注意力分数的计算如公式1所示。昂贵的操作是矩阵乘法 Q K T QK^T QKT,因为 Q Q Q K K K都有 n n n(序列长度)个投影。对于Longformer,扩张滑动窗口注意力仅计算 Q K T QK^T QKT的一定数量的对角线。如图1所示,这使得内存使用量线性增加,而与完全自注意力相比,后者是二次增加。然而,实现它需要一种带状矩阵乘法的形式,这在现有的深度学习库(如PyTorch/Tensorflow)中不受支持。

图1比较了三种不同实现方式的性能:loop是一个内存高效的PyTorch实现,支持扩张但速度非常慢,仅用于测试;chunks仅支持非扩张情况,并用于预训练/微调设置;cuda是作者完全功能齐全、高度优化的自定义CUDA内核,使用了TVM实现,并用于语言建模实验。

实验

结论

作者提出了Longformer,这是一个基于Transformer的模型,可扩展处理长文档。Longformer采用了一种注意力模式,结合了局部和全局信息,同时随着序列长度线性扩展。

实现细节

实现Longformer的扩张滑动窗口注意力需要一种带状矩阵乘法(矩阵乘法,其中输出除了某些对角线外全部为零)的形式,这种形式在现有的深度学习库如PyTorch/Tensorflow中没有直接支持。图1比较了三种不同实现方式的运行时和内存情况。

Longformer-loop是一个朴素的实现,它在循环中分别计算每个对角线。它在内存效率上很高,因为它只计算非零值,但速度非常慢,因此无法使用。仅用于测试,因为它易于实现,但不用于运行实验。

Longformer-chunks仅支持非扩张情况。它将Q和K分块为大小为w且重叠大小为 1 2 w \frac{1}{2}w 21w的块,将这些块相乘,然后屏蔽掉对角线。这非常高效,因为它使用了PyTorch的单个矩阵乘法操作,但它消耗的内存量是完全优化的实现应该消耗的两倍,因为它计算了一些零值。由于计算效率高,这种实现最适用于预训练/微调情况。

Longformer-cuda是作者使用TVM实现的自定义CUDA内核。它是注意力的完全功能实现,内存效率最高,并且与高度优化的全自注意力一样快。主要将此实现用于自回归语言建模实验,因为它具有内存效率(允许处理最长序列)和支持扩张(字符级语言建模实验所需)。

Tensor Virtual Machine(TVM) TVM是作者使用的一个深度学习编译器堆栈,它将函数的高级描述编译成优化的特定设备的代码。使用TVM,使用高级Python构造带状矩阵乘法,然后TVM生成相应的CUDA代码并将其编译为适用于GPU的代码。

总结

⭐ 作者提出随着序列长度线性增长的稀疏注意力机制,并提供了自定义CUDA内核实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1649852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据毕业设计Python+Django旅游景点评论数据采集分析可视化系统 NLP情感分析 LDA主题分析 bayes分类 旅游爬虫 旅游景点评论爬虫 机器学习 深度学习 人工智能 计算机毕业设计

毕业论文(设计)开题报告 学生姓名 学 号 所在学院 信息工程学院 专 业 指导教师姓名 指导教师职称 工程师 助教 指导教师单位 论文(设计)题目 基于朴素贝叶斯算法旅游景点线上评价情感分析 开 题 报 告…

C语言猜数字游戏

用C语言实现猜数字游戏&#xff0c;电脑随机给出一个范围内的数字&#xff0c;用户在终端输入数字&#xff0c;去猜大小&#xff1b;对比数字&#xff0c;电脑给出提示偏大还是偏小&#xff1b;不断循环&#xff0c;直到正确 #include <stdio.h> #include <time.h>…

frp内网穿透服务搭建与使用

frp内网穿透服务搭建与使用 1、frp简介 frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议。 可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。frp工作原理 服务端运行&#xff0c;监听一个主端口…

【完美解决】使用git时候出现error setting certificate verify locations: CAfile:问题

1、出现场景&#xff1a; 在使用idea的时候&#xff0c;进行git下的push&#xff0c;出现下面的错误&#xff1a; 2、原因分析&#xff1a; 可能因为重装过系统&#xff0c;或者是安装git的位置发生了变化等情况出现。 3、解决方案&#xff1a; 找到git的安装路径&#xf…

基于FPGA的AD7705芯片驱动设计VHDL代码Quartus仿真

名称&#xff1a; 软件&#xff1a;Quartus基于FPGA的AD7705芯片驱动设计VHDL代码Quartus仿真&#xff08;文末获取&#xff09; 语言&#xff1a;VHDL 代码功能&#xff1a; AD77025芯片控制及串口输出 1、使用FPGA控制AD77025芯片&#xff0c;使其输出AD值 2、将数据计…

IP证书能免费申请吗

IP SSL证书是一种数字证书&#xff0c;用于保护网络服务器和网络浏览器之间的通信。该证书是一种主要保护公网IP地址的专属信任SSL证书。 IP类型的SSL证书对于直接用IP地址传输数据的技术人员来说&#xff0c;十分重要&#xff01;无论是防洪还是防劫持还是数据加密都起到了关…

【数据库表的约束】

文章目录 一、NULL vs &#xff08;空字符串&#xff09;二、not null 和default三、列描述字段comment四、zerofill五、primary key 主键总结 一、NULL vs ‘’&#xff08;空字符串&#xff09; NULL和空字符串’’ NULL代表什么都没有。 空字符串’代表有&#xff0c;但串…

JUC-synchronized练习-交替打印ABC

今天来练习一下synchronized 简单来利用synchronized实现一个字符串的交替打印 主要的实现设置一个全局的变量state&#xff0c;线程执行通过不断累加state&#xff0c;根据state对三取余的结果来判断该线程是否继续执行还是进入等待。并通过synchronized锁住一个共享变量loc…

excel如何将多列数据转换为一列?

这个数据整理借用数据透视表也可以做到&#xff1a; 1.先将数据源的表头补齐&#xff0c;“姓名” 2.点击插入选项卡&#xff0c;数据透视表&#xff0c;在弹出对话框中&#xff0c;数据透视位置选择 现有工作表&#xff0c;&#xff08;实际使用时新建也没有问题&#xff09;…

SD-WAN对云服务的优化

在云服务日益普及的当下&#xff0c;SD-WAN技术正成为众多企业优化网络连接的首选方案。其通过优化云集成和连接&#xff0c;以及增强应用程序性能&#xff0c;为企业带来了前所未有的业务效益。这种革新性的云连接方式极大地促进了企业对全球劳动力和潜在客户的触达能力。 软件…

6.Nginx

Nginx反向代理 将前端发送的动态请求有Nginx转发到后端服务器 那为何要多一步转发而不直接发送到后端呢&#xff1f; 反向代理的好处&#xff1a; 提高访问速度&#xff08;可以在nginx做缓存&#xff0c;如果请求的是同样的接口地址&#xff0c;这样就不用多次请求后端&#…

TinyXML-2介绍

1.简介 TinyXML-2 是一个简单、小巧的 C XML 解析库&#xff0c;它是 TinyXML 的一个改进版本&#xff0c;专注于易用性和性能。TinyXML-2 用于读取、修改和创建 XML 文档。它不依赖于外部库&#xff0c;并且可以很容易地集成到项目中。 tinyXML-2 的主要特点包括&#xff1a…

下一代Nginx? OpenNjet 的入门实践

何为 OpenNjet &#xff1f; OpenNJet 应用引擎是基于 NGINX 的面向互联网和云原生应用提供的运行时组态服务程序&#xff0c;作为底层引擎&#xff0c;OpenNJet 实现了NGINX 云原生功能增强、安全加固和代码重构&#xff0c;利用动态加载机制可以实现不同的产品形态&#xff0…

在Java中如何有效地处理内存泄露

在Java中&#xff0c;处理内存泄露有多种方法&#xff0c;以下是其中三种常见的方法及其原理和适用场景&#xff1a; ## 1. 合理使用垃圾回收机制 Java中的垃圾回收机制&#xff08;Garbage Collection&#xff0c;GC&#xff09;是一种自动化的内存管理技术&#xff0c;它可以…

如何获得一个Oracle 23ai数据库(Virtual Appliance)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 方法包括3种&#xff0c;本文介绍第1种&#xff1a; Virtual ApplianceRPM安装Docker 从此处下载虚拟机。 可以看到虚拟机需要4G内…

表空间的创建

目录 表空间创建的语法 表空间创建的例子 创建一个永久性表空间&#xff0c;设置表空间初始大小为100MB&#xff0c;自动扩展为 100MB&#xff0c;无最大大小限制&#xff0c;并且该表空间为在线状态&#xff0c;产生日志 创建一个永久性表空间&#xff0c;通过本地化管理方…

AI编码时代到来?实现编程梦想的利器—Baidu Comate测评

文章目录 Comate智能编码是什么&#xff1f;Comate支持的环境 Comate应用安装实际操作对话式生成代码生成代码注释智能单测项目测试调优功能 总结 Comate智能编码是什么&#xff1f; 在如今这个拥抱AI的时代&#xff0c;市面上已经产出了很多Ai代码助手&#xff0c;如果你还没…

无法添加以供审核,提交以供审核时遇到意外错误。如果问题仍然存在,请联系我们

遇到问题&#xff1a; 无法添加以供审核 要开始审核流程&#xff0c;必须提供以下项目&#xff1a; 提交以供审核时遇到意外错误。如果问题仍然存在&#xff0c;请联系我们。 解决办法&#xff1a; 修改备案号为小写&#xff0c; 例如&#xff1a;京ICP备2023013223号-2A 改…

酸奶(科普)

酸奶&#xff08;yogurt&#xff09;是一种酸甜口味的牛奶饮品&#xff0c;是以牛奶为原料&#xff0c;经过巴氏杀菌后再向牛奶中添加有益菌&#xff08;发酵剂&#xff09;&#xff0c;经发酵后&#xff0c;再冷却灌装的一种牛奶制品。市场上酸奶制品多以凝固型、搅拌型和添加…

Verilog刷题笔记47

题目&#xff1a; From a 1000 Hz clock, derive a 1 Hz signal, called OneHertz, that could be used to drive an Enable signal for a set of hour/minute/second counters to create a digital wall clock. Since we want the clock to count once per second, the OneHer…