文献阅读:LONGNET: Scaling Transformers to 1,000,000,000 Tokens

  • 文献阅读:LONGNET: Scaling Transformers to 1,000,000,000 Tokens
    • 1. 文章简介
    • 2. 方法原理
      • 1. 方法思路
      • 2. Dilated Attention
        • 1. 具体原理
        • 2. 多头实现
        • 3. 复杂度分析
      • 3. 训练方法
    • 3. 实验结果
    • 4. 结论 & 思考
    • 5. 参考链接
  • 文献链接:https://arxiv.org/abs/2307.02486

1. 文章简介

这篇文章算是我司最近的一篇力作吧,即DeepNet, Foundation Transformer之后,大佬们终于还是盯上了attention layer,毕竟attention层 O ( N 2 ) O(N^2) O(N2)的计算复杂度一直是制约Transformer往长文本发展的主要原因。

想当年,像是线性化Attention的Linformer,或者以更直观的稀疏化attention的Reformer,亦或者结合局部与全局attention的Longformer,或者类似金字塔型的将长文本拆分为短文本然后各自做attention然后逐层往上的方式(不过这篇具体文章给忘了),总之当年零零碎碎有不少关于优化attention层计算量,使之可以拓展到长文本上的工作。

不过可惜的是,虽然当时大家都觉得这个方向很重要,结果以GPT3还有PALM等为代表的大模型反而从工程上发力,直接强行扩展文本长度,从头上干掉了这个问题……

这两年,感觉这方面的工作已经比较少听到了,不过我司的大佬们似乎还是重新抓出了这个方向,然后像是DeepNet那样直接干出了一个量级上碾压的工作,也是真的厉害……

在这里插入图片描述

2. 方法原理

1. 方法思路

LongNet的整体的一个思路其实和之前的Reformer,Linformer等一致,还是在attention层方面做文章,希望将attention layer的计算复杂度从原始的 O ( N 2 d ) O(N^2d) O(N2d)进行优化,使得其与句长 N N N呈线性关系而非平方关系,从而使得模型整体的计算复杂度得到缩减。

对于,文中提出了dilated attention的结构,成功地将attention layer的计算复杂度从 O ( N 2 d ) O(N^2d) O(N2d)降维至 O ( N d ) O(Nd) O(Nd)复杂度。

在这里插入图片描述

需要注意的是,这里的比较没有包含linear transformer,它虽然很早之前已经实现了 O ( N d ) O(Nd) O(Nd)复杂度的attention实现,不过貌似效果不佳,不算是主流的attention方法,因此文中弃用了linear transformer作为对照。

下面,我们就需要具体看一下Dilated Attention层的具体实现方法。

2. Dilated Attention

1. 具体原理

首先,我们给出Dilated Attention层的整体原理图如下:

在这里插入图片描述

具体来说,就是首先给出一个局部窗口长度 w w w和间隔距离 r r r,那么,就可以将总长为 N N N的序列拆分为 N / w N/w N/w个子序列,然后在每一个子序列当中按照间隔 r r r取出token,一共就能够取出 w / r w/r w/r个token,然后用着 w / r w/r w/r个token作为新的序列计算attention,然后把这 N / w N/w N/w个attention矩阵concat起来,就能得到一个 N × N N \times N N×N的稀疏attention矩阵。

考察对于固定的 w , r w,r w,r下的第 i i i个attention矩阵,有:

{ Q i = [ Q i w Q i w + r ⋯ Q ( i + 1 ) w − r ] K i = [ K i w K i w + r ⋯ K ( i + 1 ) w − r ] V i = [ V i w V i w + r ⋯ V ( i + 1 ) w − r ] \left\{ \begin{aligned} Q_i &= [Q_{iw} & Q_{iw+r} & \cdots & Q_{(i+1)w-r}] \\ K_i &= [K_{iw} & K_{iw+r} & \cdots & K_{(i+1)w-r}] \\ V_i &= [V_{iw} & V_{iw+r} & \cdots & V_{(i+1)w-r}] \end{aligned} \right. QiKiVi=[Qiw=[Kiw=[ViwQiw+rKiw+rViw+rQ(i+1)wr]K(i+1)wr]V(i+1)wr]

此时有:

O i = s o f t m a x ( Q i ⋅ K i T d ) V i O_i = \mathop{softmax}(\frac{Q_i \cdot K_i^T}{\sqrt{d}})V_i Oi=softmax(d QiKiT)Vi

当然,这样的一个attention矩阵事实上只包含了局部的attention信息,因此无法兼顾长距离和短距离的attention信息。因此,如果要令总的attention兼顾长距离和短距离的attention信息,就需要取出多组 w , r w,r w,r,分别计算attention然后进行矩阵加和。也就是上图中的合并部分,从而才能获得包含全局attention信息的矩阵。

具体实现上来说,文中采用的是等比数列的方式进行实现,比如如下的方式:

{ w = w , α w , α 2 w , ⋯ , α n w r = r , α r , α 2 r , ⋯ , α n r \left\{ \begin{aligned} w &= {w, \alpha w, \alpha^2 w, \cdots, \alpha^n w} \\ r &= {r, \alpha r, \alpha^2 r, \cdots, \alpha^n r} \end{aligned} \right. {wr=w,αw,α2w,,αnw=r,αr,α2r,,αnr

在上图的demo中,取用的 w , r w,r w,r就是 4 4 4 1 1 1 α \alpha α的取值为 2 2 2

当然,考虑到由于 w , r w,r w,r取值不同导致的attention的密度不同,因此加和的时候需要对权重进行调整,具体而言:

O = ∑ i = 1 k s i ∑ j s j O r i , w i O = \sum\limits_{i=1}^{k}\frac{s_i}{\sum_j s_j}O_{r_i, w_i} O=i=1kjsjsiOri,wi

其中, s i s_i si ( w i , r i ) (w_i, r_i) (wi,ri)这组参数下计算得到的attention矩阵( Q i ⋅ K i T d \frac{Q_i \cdot K_i^T}{\sqrt{d}} d QiKiT)在计算softmax时的分母部分,也就是:

∑ j e Q i ⋅ K i T d \sum\limits_{j} e^{\frac{Q_i \cdot K_i^T}{\sqrt{d}}} jed QiKiT

这样也就得到了一组 n n n维的系数向量,作为我们这里的 s s s

2. 多头实现

关于Dilated Attention的多头实现,整体来说和vanilla transformer的实现方式是一致的,还是在input的向量当中进行split,然后分别过一个上述介绍的Dilated Attention层,最后将output的结果concat起来即可。

不过,感谢作者Shuming大佬的解释,这里和vanilla transformer存在一定的区别,具体就在于对于每一个context window,我们事实上都是等间隔的sample了其中的几个token进行attention的计算,某种意义上来说总是会丢失掉一些信息的。

因此,在设计多头attention的时候,文中进行了一定的优化,即对于input的token位置在不同的head上面给了不同的位置偏移量,从而使得尽可能地覆盖更多的token之间的attention。

具体来说就是,对于第 j j j个head,选取的token为:

{ Q i = [ Q i w + j ( ≡ r ) Q i w + r + j ( ≡ r ) ⋯ Q ( i + 1 ) w − r + j ( ≡ r ) ] K i = [ K i w + j ( ≡ r ) K i w + r + j ( ≡ r ) ⋯ K ( i + 1 ) w − r + j ( ≡ r ) ] V i = [ V i w + j ( ≡ r ) V i w + r + j ( ≡ r ) ⋯ V ( i + 1 ) w − r + j ( ≡ r ) ] \left\{ \begin{aligned} Q_i &= [Q_{iw + j(\equiv r)} & Q_{iw+r + j(\equiv r)} & \cdots & Q_{(i+1)w-r + j(\equiv r)}] \\ K_i &= [K_{iw + j(\equiv r)} & K_{iw+r + j(\equiv r)} & \cdots & K_{(i+1)w-r + j(\equiv r)}] \\ V_i &= [V_{iw + j(\equiv r)} & V_{iw+r + j(\equiv r)} & \cdots & V_{(i+1)w-r + j(\equiv r)}] \end{aligned} \right. QiKiVi=[Qiw+j(r)=[Kiw+j(r)=[Viw+j(r)Qiw+r+j(r)Kiw+r+j(r)Viw+r+j(r)Q(i+1)wr+j(r)]K(i+1)wr+j(r)]V(i+1)wr+j(r)]

可以用文中的图3来对上述不同头的attention进行更为形象化的展示如下:

在这里插入图片描述

3. 复杂度分析

下面,我们来考察一下Dilated Attention层的算法复杂度。

我们首先来考察对于一组确定的 w , r w,r w,r对应的Dilated Attention层的算法复杂度,其对应的结果如下:

F L O P s = 2 N w ⋅ ( w r ) 2 d = 2 N w d r 2 FLOPs = \frac{2N}{w} \cdot (\frac{w}{r})^2d = \frac{2Nwd}{r^2} FLOPs=w2N(rw)2d=r22Nwd

因此,遍历 w , r w,r w,r,我们即可得到完整的Dilated Attention层的算法复杂度如下:

F L O P s = ∑ i = 0 k − 1 2 N w i d r i 2 = 2 N w 0 d r 0 2 ∑ i = 0 k − 1 1 α i < 2 N w 0 d r 0 2 ⋅ α α − 1 ∼ O ( N d ) FLOPs = \sum\limits_{i=0}^{k-1}\frac{2Nw_id}{r_i^2} = \frac{2Nw_0d}{r_0^2} \sum\limits_{i=0}^{k-1} \frac{1}{\alpha^i} < \frac{2Nw_0d}{r_0^2} \cdot \frac{\alpha}{\alpha-1} \sim O(Nd) FLOPs=i=0k1ri22Nwid=r022Nw0di=0k1αi1<r022Nw0dα1αO(Nd)

3. 训练方法

最后,我们看一下文中实际的训练过程。

注意到,这里由于极限的扩展了输入的context的序列长度,因此事实上如何将文本塞入GPU也就成了一个大问题,因此,这方面也需要有一些工程上的实现细节考察。

具体来说,文中给出的方法还是说先对sequence进行一下split,然后由不同的GPU分别计算,最后进行加总实现。

其原理图可以参考文中的图4:

在这里插入图片描述

不过需要注意的是,这里在不同的gpu当中计算完了不同的部分的input seq之后,在计算dilated attention的时候会有一个slice的过程,然后slice之后的得到的dilated attention会在不同的GPU之间进行聚合,从而确保不同的gpu上的token之间的attention能够相互计算和聚合。

由于这里只是slice之后的attention,因此可以避免掉由于过长的文本长度(比如文中给出的1B)导致的内存爆炸的问题。

3. 实验结果

文中使用torchscale作为基准库,然后替换attention layer之后train了一个768维,12层的模型进行实验考察。

得到结果如下:

在这里插入图片描述

而除了最终的ppl之外,文中还比较了transformer与LongNet在处理不同文本长度的文本时所需的计算量。

在这里插入图片描述

可以看到:

  • LongNet可以在更少的计算量下获得相较于原始的transformer更好的ppl。

此外,文中还对LongNet在不同的参数量以及不同的context window进行了一下考察,得到结果如下:

在这里插入图片描述

可以看到:

  • 随着参数量的增长,模型的ppl是在不断减小的,说明LongNet具有很好的扩展能力;
  • context window越大,模型的效果也能够不断地提升,说明LongNet对于长文本有较好的理解能力。

最后,文中还非常直观的给出了将输入文本长度扩展到1B之后vanilla transformer与LongNet的infer时间变化的比较:

在这里插入图片描述

其结果直观地证明了LongNet对于长文本处理能力的能力,较之Vanilla Transformer耗时的快速增长,Dilated Attention基本没有发生什么太大的变化。

4. 结论 & 思考

综上,整体而言这篇文章还是很惊艳的,至少从context length的角度来说这种突破性的震撼确实厉害,结合他之前的foundation transformer等工作,我觉得他们在transformer的基础架构上面确实花了不少的功夫来做优化,这一点确实是厉害。

不过考虑到工程上,这篇文章的主要贡献可能还是在于长文本的关联attention上面,也就意味着其优势必然还是需要长上下文+大语料的前提下才能充分发挥出它的效果,就目前我的工作而言,可能还是有点用不太到……

所以,就只能膜拜一下大佬了,后面有机会的话可以考虑一下在业余时间复现一下看看了,在工作上倒是觉得ROI应该是不会很大了……

5. 参考链接

  1. Longformer: 局部Attention和全局attention的混搭

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

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

相关文章

FPGA设计过程中有关数据之间的并串转化

1.原理 并串转化是指的是完成串行传输和并行传输两种传输方式之间的转换的技术&#xff0c;通过移位寄存器可以实现串并转换。 串转并&#xff0c;将数据移位保存在寄存器中&#xff0c;再将寄存器的数值同时输出&#xff1b; 并转串&#xff0c;将数据先进行移位&#xff0…

【微服务】一体化智慧工地管理平台源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面&#xff0c;多维度数…

开源七轴myArm协作机械臂正逆运动学技术讲解

引言&#xff1a; 在本文中&#xff0c;我们将深入探讨机器人学的两个核心概念&#xff1a;正运动学和逆运动学。这两个概念是理解和控制机械臂运动的基础。通过一个具体的7轴机械臂实例&#xff0c;我们将详细介绍如何计算机械臂的正运动学和逆运动学。我们首先会解释正运动学…

集合贴1——人工智能技术

集合一下人工智能技术的文章&#xff1a; 基础课2——自然语言处理-CSDN博客文章浏览阅读412次。自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;它研究能实现人与计算机之间用自然语言进…

Splunk 创建特色 dashboard 报表

1: 背景: 对原有的dashboard 进行增加点东西,特别是文字部分: 比如: 增加:“this is a guidline for how to use performance". 这段话,就不能写在title, 那样,这段文字,会出现在dashboard 的PDF 文件的分割线的上面,不符合要求。 2: 解决问题: 正确的做法是…

JavaScript使用正则表达式

正则表达式(RegExp)也称规则表达式(regular expression)&#xff0c;是非常强大的字符串操作工具&#xff0c;语法格式为一组特殊字符构成的匹配模式&#xff0c;用来匹配字符串。ECMAScript 3以Perl为基础规范JavaScript正则表达式&#xff0c;实现Perl 5正则表达式的子集。Ja…

ZYNQ_project:led

本次实验完成&#xff1a;led流水间隔0.5s 闪烁间隔0.25s。 名词解释&#xff1a; analysis分析&#xff1a;对源文件进行全面的语法检查。 synthesis综合&#xff1a;综合的过程是由 FPGA 综合工具箱 HDL 原理图或其他形式源文件进行分析&#xff0c;进而推演出由 FPGA 芯…

Arrays.asList() 和 List.of() 的列表之争

1. 概述 有时在Java中&#xff0c;为了方便&#xff0c;我们需要创建一个小列表或将数组转换为列表。Java 为此提供了一些辅助方法。 在本文中&#xff0c;我们将比较初始化小型临时数组的两种主要方法&#xff1a;List.of()和 Array.asList()。 2. Arrays.asList() Java 自…

Zeus IoT : 基于 SpringBoot 的分布式开源物联网大数据平台

Zeus IoT 是一个集设备数据采集、存储、分析、观测为一体的开源物联网平台&#xff0c;全球首创基于 Zabbix 的物联网分布式数据采集架构&#xff0c;具备超百万级物联网设备的并发监控能力&#xff0c;真正具备工业级性能与稳定性的开源物联网大数据中台。 Zeus IoT 致力于让设…

AI生图王者之战!深度体验实测,谁是真正的艺术家?

10月11日凌晨&#xff0c;设计软件巨头Adobe宣布推出一系列图像生成模型&#xff0c;其中Firefly Image 2作为新一代图像生成器&#xff0c;通过改善皮肤、头发、眼睛、手和身体结构增强了人体渲染质量&#xff0c;提供更好的色彩和改进的动态范围&#xff0c;并为用户提供更大…

【数据结构】单链表之--无头单向非循环链表

前言&#xff1a;前面我们学习了动态顺序表并且模拟了它的实现&#xff0c;今天我们来进一步学习&#xff0c;来学习单链表&#xff01;一起加油各位&#xff0c;后面的路只会越来越难走需要我们一步一个脚印&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x…

跨境电商年底风控升级,测评养号如何选择稳定且纯净的IP环境?

随着年底跨境电商平台风控的升级&#xff0c;许多测评团队的账号存活率有所下降。对于自养号测评的卖家来说&#xff0c;IP的重要性不言而喻。除了设置参数阻断&#xff0c;IP的质量也直接影响到账户的稳定性和成功率。因此&#xff0c;在年底这个特殊时期&#xff0c;所有测评…

【c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️引用☁️引用的概念☁️引用的特性⭐引用在定义时必须初始化 ☁️常引用…

分享Python7个爬虫小案例(附源码)

本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点&#xff0c;非常适合刚入门python爬虫的小伙伴参考学习。注&#xff1a;若涉及到版权或隐私问题&#xff0c;请及时联系我删除即可。 1.使用正则表达式和文件操作爬取并保存“某吧”某帖子…

NSSCTF web刷题记录4

文章目录 [NSSRound#4 SWPU]1zweb(revenge)[强网杯 2019]高明的黑客[BJDCTF 2020]Cookie is so subtle![MoeCTF 2021]fake game[第五空间 2021]PNG图片转换器[ASIS 2019]Unicorn shop[justCTF 2020]gofs[UUCTF 2022 新生赛]phonecode[b01lers 2020]Life On Mars[HZNUCTF 2023 f…

赴日工作赴日IT 如何找到一份日本IT工作?

IT在日本属于普通白领工作&#xff0c;那些想靠IT工作发财就不必考虑了。但是靠IT工作能安安稳稳的过个自己的小日子没问题&#xff0c;买房买车问题不大&#xff0c;作为一个普通人&#xff0c;在日本可以过的比较舒服。对有在日本长期发展的打算的还算是一个比较好的方向&…

利用maven的dependency插件分析工程的依赖

dependency:analyze https://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html 分析项目的依赖&#xff0c;确定哪些&#xff1a;用了并且声明了、用了但没有声明、没有使用但声明了。 dependency:analyze可以单独使用&#xff0c;所以它总是会执行test-…

【uniapp】解决在H5谷歌浏览器下 u-input 标签 设置只读后,click事件不生效

【问题描述】 谷歌浏览器更新后&#xff0c;h5模式下原本的input外层view中的click事件不触发了?? 但是更换浏览器后就可以&#xff0c;打包app也是正常可以触发的&#xff0c;本来是没打算兼容h5&#xff0c;既然遇到了就记录一下~ 【解决办法】 使u–input里写上readonly&…

arcgis 批量删除Table中的某些Field

当shp或者table文件较少时&#xff0c;可以手动删除每个文件中的某些字段&#xff0c;当文件较多时&#xff0c;就需要使用arcpy或者model进行处理。

动态IP和静态IP哪个安全,该怎么选择

随着互联网的普及&#xff0c;越来越多的人开始关注网络安全问题。其中&#xff0c;IP地址作为网络通信中的重要组成部分&#xff0c;也成为了人们关注的焦点。 在IP地址中&#xff0c;动态IP和静态IP是两种不同的分配方式&#xff0c;它们各自具有不同的特点&#xff0c;那么…