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

引言

今天带来论文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.rhkb.cn/news/319998.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量邮箱API发送邮件的方法?如何使用API?

批量邮箱API发送邮件效率怎么样?API接口发信的优势? 批量发送邮件已经成为许多企业、机构或个人进行营销推广、信息传递的重要手段。然而,如何高效、准确地实现批量邮箱发送,却是许多人面临的难题。AokSend就来探讨一下利用API进…

Python基础学习之logging模块

在Python编程中,日志记录(Logging)是一个非常重要的功能。它不仅可以帮助我们追踪和调试代码中的错误,还可以记录程序运行时的关键信息,以便后续分析和优化。Python标准库中的logging模块为我们提供了强大的日志记录功…

C++从入门到精通——模板

模板 前言一、泛型编程二、函数模板函数模板的概念函数模板格式示例 函数模板的原理函数模板的实例化隐式实例化显式实例化示例 auto做模板函数的返回值模板参数的匹配原则总结 三、类模板类模板的定义格式类模板的实例化 前言 C模板是C语言中的一种泛型编程技术,可…

IDEA--debug

1. 单点调试的三个级别 Step into:在单步执行时,遇到子函数就进入并且继续单步执行。Step over:在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数…

【保姆级教程】用IDEA2023版本给RuoYi-Vue添加子模块

文章目录 前言添加子模块新建子模块新建子模块界面?新建子模块界面! 修改pom依赖配置RuoYiApplication添加测试接口配置接口权限测试 前言 若依前后端分离框架能够极大方便当前开发任务,并且使用的技术栈也相当丰富,但是目前只提…

ThingsBoard通知中心讲解

1、概述 2、案例 2.1、通知发送方式 2.2、发送通知 3、Templates模板 3.1、Add new template添加新模板 1、概述 ThingsBoard 通知中心是一个用于在平台内发送、管理和自动化通知的综合工具。它允许多种通知方法,包括网络、电子邮件、移动应用程序、短信以及与 …

基于SpringBoot+Vue点餐系统设计和实现(源码+LW+部署讲解)

🌹作者简介:✌全网粉丝10W,前大厂员工,多篇互联网电商推荐系统专利,现有多家创业公司,致力于建站、运营、SEO、网赚等赛道。也是csdn特邀作者、博客专家、Java领域优质创作者,博客之星、掘金/华…

go mod

常用命令 初始化模块 go mod init 模块名下载 go.mod 文件中指明的所有依赖 go mod download github.com/gin-gonic/ginv1.9.(依赖路径)依赖对其(使引用的都是所依赖的) go mod tidy编辑go.mod go mod edit go mod edit -require"github.com/g…

哪个品牌的骨传导耳机好用?精选五大高性能热门骨传导耳机款式推荐!

我作为一名热衷于音乐的数码博主,在选购产品前也习惯于先浏览各种榜单。最近,我发现关于骨传导耳机的讨论热度极高,有人认为骨传导耳机是非常值得入手的新型蓝牙耳机,也有人认为骨传导耳机只是智商税的产品。经过深入调查后&#…

【计算机网络】FTP站点配置搭建教程以及相关问题解决方案(超详细)

文章目录 1、安装Window Server 20082、搭建FTP环境(1)安装FTP服务器(2)配置FTP服务器(3)测试FTP连接 3、遇到的问题以及解决方案(1)Windows无法访问此文件夹(2&#xff…

Android Ant编译环境配置(Win)

1、 载ant包: 2、设置环境变量: 3、检查是否设置成功及版本 4、执行命令: android update project -p . -n “projectname”(例如:android update project --target 1 -p . -n “Couplet”)(只输入红色部分也是可以的…

AC/DC电源模块的高效能源管理与效率优化

BOSHIDA AC/DC电源模块的高效能源管理与效率优化 AC/DC电源模块是一种常见的电源转换装置,用于将交流电转换为直流电。它被广泛应用于各种电子设备中,如计算机、通信设备、工业自动化设备等。在现代化的科技社会中,高效能源管理和效率优化变…

swift微调多模态大语言模型

微调训练数据集指定方式的问题请教 Issue #813 modelscope/swift GitHubQwen1.5微调训练脚本中,我用到了--dataset new_data.jsonl 这个选项, 可以训练成功,但我看文档有提到--custom_train_dataset_path这个选项,这两个有什么…

​可视化大屏C位图:3D模型,可视化大屏的画龙点睛之处

Hello,我是大千UI工场,本期可视化大屏的焦点图(C位)分享将图表作为焦点图的情形,欢迎友友们关注、评论,如果有订单可私信。 3D模型在可视化大屏中有很大的价值,以下是一些相关的优点&#xff1a…

基于springboot实现在线考试系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现在线考试系统演示 摘要 使用旧方法对在线考试系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在在线考试系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及…

leetcode 1235

leetcode 1235 代码 class Solution { public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int n startTime.size();vector<vector<int>> jobs(n);for(int i0; i<n; i){jobs[i] …

JuiceFS v1.2-beta1,Gateway 升级,多用户场景权限管理更灵活

JuiceFS v1.2-beta1 今天正式发布。在这个版本中&#xff0c;除了进行了大量使用体验优化和 bug 修复外&#xff0c;新增三个特性&#xff1a; Gateway 功能扩展&#xff1a;新增了“身份和访问管理&#xff08;Identity and Access Management&#xff0c;IAM&#xff09;” 与…

JAVA面试专题-框架篇(Spring+Mybatis)

Spring Spring框架中的单例bean是线程安全的吗&#xff1f; bean上面可以加入注解Scope&#xff0c;如果是singleton&#xff08;默认&#xff09;&#xff0c;意味着bean在每个spring IOC容器中只有一个实例&#xff1b;如果是prototype&#xff0c;说明一个bean定义可以有多…

Centos上通过Docker安装ES管理端kibana

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Elasticsearch 是一…

《QT实用小工具·五十六》自适应界面变化的控件

1、概述 源码放在文章末尾 该项目实现了网格显示多张带文字的图片在界面中自适应布局 特点 跟随窗口大小变换位置&#xff0c;并带移动动画 响应鼠标事件&#xff0c;图片缩放动画 点击水波纹动画 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #i…