近期关于Transformer结构有潜力的改进方法总结

目录

  • 0 引言
  • 1 Gated Linear Unit (GLU)
    • 1.1 思路
  • 2 Gated Attention Unit (GAU)
    • 2.1 思路
    • 2.2 实验结论
    • 2.3 混合注意力
  • 3 FlashAttention
    • 3.1 标准Attention的实现
    • 3.2 FlashAttention的实现
      • 针对目标1
      • 针对目标2
  • 4 总结
  • 5 参考资料

0 引言

标准Transformer在最新的实际大模型中并没有被采用了,而是使用其相关的改进版本,原因是标准Transformer的实现有比较显著的缺点:

  1. Attention的时间复杂度较高,为 O ( n 2 ) O(n^2) O(n2),导致输入token序列长度较无法设置得过大。
  2. 显存占用大,是因为Attention、多头、FFN导致的参数量大。

以下总结了几个较受关注及个人认为比较有潜力的改进,帮助快速了解,同时推荐大家仔细研读原论文。

1 Gated Linear Unit (GLU)

论文:GLU Variants Improve Transformer,2020.2

1.1 思路

GLU主要是改进并替换掉Transformer结构中的FFN层,Attention层并没有变化。
标准的FFN是两层MLP:
O = ϕ ( X W u ) W o O = \phi (XW_u) W_o O=ϕ(XWu)Wo
其中 X ∈ R n × d , W u ∈ R d × e , W o ∈ R e × d X \in \R^{n \times d},W_u\in \R^{d \times e},W_o\in \R^{e \times d} XRn×d,WuRd×e,WoRe×d, ϕ \phi ϕ为激活函数,通常是ReLU。
GLU将FFN的两个参数矩阵拆分成了三个参数矩阵,其形式为:
U = ϕ u ( X W u ) V = ϕ v ( X W v ) O = ( U ⊙ V ) W o \begin{equation} \begin{split} U &= \phi_u (XW_u) \\ V &= \phi_v (XW_v) \\ O &= (U \odot V) W_o \end{split} \end{equation} UVO=ϕu(XWu)=ϕv(XWv)=(UV)Wo

其中 U ∈ R d × e , V ∈ R d × e U\in \R^{d \times e},V\in \R^{d \times e} URd×e,VRd×e, ϕ \phi ϕ为激活函数( U , V U,V U,V是否带激活函数是可选项,并且激活函数也可选择不同的), ⊙ \odot 是对应位置元素相乘(Hadamard 积)。使用了GLU代替标准FFN的效果更好,并为后来的 mT5 所用。
在这里插入图片描述
论文中, U , V U,V U,V是否带激活函数 ϕ \phi ϕ是可选项,并且激活函数也可选择不同的。作者给出几种GLU变体组合: U U U不加激活函数, V V V的激活函数分别选择Sigmoid、ReLU、GELU、Swish、缺省等情况。并做了实验表明 V V V的激活函数选择GELU、Swish时效果较其他几种更好,实验结果如下图。
在这里插入图片描述

一般情况下的GLU是 U U U不加激活函数,而 V V V加Sigmoid,但这篇论文的代码实现中 U , V U,V U,V都加了激活函数Swish(也叫 SiLU,Sigmoid Linear Unit)。

2 Gated Attention Unit (GAU)

论文:Transformer Quality in Linear Time,Google Research, 2022.1
开源实现(非官方):https://github.com/lucidrains/FLASH-pytorch
论文中提出了一个新的模型代替Transformer,命名为 FLASH:Fast Linear Attention with a Single Head

2.1 思路

虽然GLU论文通过实验证明很有效,但是它并不能取代Attention,因为它的各个token之间没有进行交互,即矩阵 U , V U,V U,V的每一行都是独立运算的。所以GAU想办法将 U , V U,V U,V与Attention结合,在GLU基础上做出了如下设计:
O = ϕ ( U ⊙ A V ) W o O = \phi (U \odot AV) W_o O=ϕ(UAV)Wo
其中, A ∈ R n × n A\in \R^{n \times n} ARn×n是 Attention 矩阵,负责融合 token 之间的信息。这样输出的 O O O就包含了token之间的交互,原则上可以取代 标准Attention。事实上,可以用只用GAU堆叠实现Transformer,替换其中的Attention和FFN层。

GAU结构示意图如下:
在这里插入图片描述
GAU伪代码:
在这里插入图片描述

2.2 实验结论

研究者在下图中展示了 GAU 与 Transformers 的比较情况,结果显示对于不同模型大小,GAU 在 TPUs 上的性能可与 Transformers 竞争。需要注意,这些实验是在相对较短的上下文大小(512)上进行的。
在这里插入图片描述
下表 1 和表 2 为层消融实验,结果显示 GAU 和 Transformers 各自都是局部最优的。
在这里插入图片描述
研究者从上述实验中得到了以下两个重要的观察结果,并受到启发将 GAU 扩展至建模长序列中。

  • 其一,GAU 中的门控机制使得可以使用没有质量损失的更弱的(单头、无softmax)的注意力。如果进一步将这一思路引入到使用注意力建模长序列中,GAU也可以提升近似(弱)注意力机制的有效性,比如局部、稀疏和线性注意力。
  • 其二,使用 GAU使注意力模块的数量自然地增加一倍,就开销而言,MLP+MHSA 约等于两个
    GAU。由于近似注意力通常需要更多层来捕获完整依赖,因此这一特征使得 GAU 更适宜建模长序列。

2.3 混合注意力

根据现有线性复杂度的优缺点,研究者提出了混合块注意力(mixed chunk attention),它融合了局部二次注意力和块间全局线性注意力的优点。这是使GAU在长序列任务上线性时间内实现Transformer级的性能。具体推导不细讲,可以看一下伪代码。
在这里插入图片描述
实验效果也不错,对于从512到8192的所有序列长度,FLASH模型总是在相同的计算资源下获得最佳质量(即最低的复杂度)。如下图红色曲线所示。
在这里插入图片描述

3 FlashAttention

论文:FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness,2022.5
官方源码:https://github.com/hazyresearch/flash-attention
该方法在增加了一定的FLOPs情况下显著节省显存和加速,我们重点关注这个方法。

3.1 标准Attention的实现

在标准的Attention中,Q、K、V作为输入,大小为N×d,如下图所示,在计算中需要存储中间值S和P到显存HBM(High Bandwidth Memory)中,这会极大占用HBM。
在这里插入图片描述

3.2 FlashAttention的实现

FlashAttention旨在避免从 HBM中读取和写入注意力矩阵,这需要做到:

目标1:在不访问整个输入的情况下计算softmax函数;
目标2:在后向传播中不能存储中间注意力矩阵。

针对目标1

已知SRAM、HBM、DRAM存储容量依次升高,数据IO速度依次降低,如下图所示。那么可以将Q,K,V矩阵划分成多个小的子块,这些子块的大小恰好能从HBM加载进SRAM中,循环将子块传递进SRAM中以增量方式计算出Softmax值。
在这里插入图片描述

在这里插入图片描述

针对目标2

在后向传播中不存储中间注意力矩阵,以FlashAttention所提供的算法为例,通过对比标准Attention算法在实现过程中,标准Attention算法的实现需要将计算过程中的S、P写入到HBM中,而这些中间矩阵的大小与输入的序列长度有关且为二次型,因此Flash Attention就提出了不使用中间注意力矩阵,通过存储归一化因子来减少HBM内存的消耗。

在Flash Attention的前向计算算法(上图 Algorithm 2中)中我们可以看出,Flash Attention算法并没有将S、P写入HBM中去,而是通过分块写入到HBM中去,存储前向传递的 softmax 归一化因子,在后向传播中快速重新计算片上注意力,这比从HBM中读取中间注意力矩阵的标准方法更快。
优点是:即使由于重新计算导致FLOPs增加,但其运行速度更快并且使用更少的内存(序列长度线性),主要是因为大大减少了 HBM 访问量。实验对比如下图。
在这里插入图片描述

4 总结

  1. MLM类模型中测试显示,在序列较短的情况下,GAU没什么优势,但是序列长度较长(超过512),GAU更省显存并且更快。
  2. FlashAttention是在考虑不同存储IO速度的情况下对标准Attention中的Softmax进行分块计算,算是一种动态规划的方法。这是一种加速和减少显存占用的方法,并没有改变Transformer的结构。这可以用来大幅增加token序列长度而不显著地增加显存占用和降低推理速度,该方法已经获得广泛关注,可以在一些新近实现的开源模型代码中看见该方法的应用。

5 参考资料

[1]. https://xiaosheng.run/2022/05/16/glu-to-gau.html
[2]. https://zhuanlan.zhihu.com/p/618533434
[3]. FLASH:可能是近来最有意思的高效Transformer设计,苏剑林

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营day44 | 完全背包,518. 零钱兑换 II,377. 组合总和 Ⅳ

代码随想录算法训练营day44 | 完全背包,518. 零钱兑换 II,377. 组合总和 Ⅳ 完全背包完全背包问题概述例题遍历顺序分析 518. 零钱兑换 II解法一:动态规划 377. 组合总和 Ⅳ解法一:动态规划 总结 完全背包 教程视频:h…

Nginx + fastCGI 实现动态网页部署

简介 本文章主要介绍下,如何通过Nginx fastCGI来部署动态网页。 CGI介绍 在介绍fastCGI之前先介绍下CGI是什么。CGI : Common Gateway Interface,公共网关接口。在物理层面上是一段程序,运行在服务器上,提供同客户端HTML页面的…

了解这3大特性,再也不担心传输线问题了!

电阻是一个实实在在的物理元器件,通过欧姆定律我们可以知道,电压、电流和电阻三者之间的关系,UI*R。 我们通过一个具体的电路来分析这三者之间的具体关系,请看下面的一张最简单的电路图。这个电路图只有一个电源一个电阻和一些导…

MySQL---多表联合查询(下)(内连接查询、外连接查询、子查询(ALL/ANY/SOME/IN/EXISTS关键字)、自关联查询)

1. 内连接查询 数据准备: use mydb3;-- 创建部门表 create table if not exists dept3(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp3(eid varchar(20) primary key , -- 员工编号e…

尝试探索水下目标检测,基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统

其实,水下目标检测相关的项目早在之前就已经做了几个了,但是没有系统性地对比过,感兴趣的话可以先看下之前的文章,如下: 《基于自建数据集【海底生物检测】使用YOLOv5-v6.1/2版本构建目标检测模型超详细教程》 《基于…

AVL树(平衡二叉搜索树)

如果BST树插入的顺序是有序的,那么BST树就会退化成一个双链表结构,查询的速率就会很慢, 所以有了AVL树的意义。 AVL树的定义: 是具有下列性质的二叉搜索树 1、它的左子树和右子树都是AVL树 2、左子树和右子树的高度之差的绝对值…

办公智慧化风起云涌,华为MateBook X Pro 2023是最短距离

今年以来,我们几乎每个月,甚至每星期都可以看到大模型应用,在办公场景下推陈出新。 办公智慧化已成必然,大量智力工作正在被自动化。一个普遍共识是:AI能力范围之内的职业岌岌可危,AI 能力范围之外的职业欣…

瑞吉外卖 - 分页查询分类功能(12)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

《Netty》从零开始学netty源码(五十八)之NioEventLoop.execute()

目录 NioEventLoop.execute()addTask()startThread()NioEventLoop.run()select()处理keys与执行任务processSelectedKeys()处理AbstractNioChannelselectAgain() runAllTasks()fetchFromScheduledTaskQueue()runAllTasksFrom()afterRunningAllTasks() 带截止时间的runAllTasks(…

由浅入深Netty入门案例

目录 1 概述1.1 Netty 是什么?1.2 Netty 的作者1.3 Netty 的地位1.4 Netty 的优势 2 Hello World2.1 目标2.2 服务器端2.3 客户端2.4 流程梳理2.5 提示 1 概述 1.1 Netty 是什么? Netty is an asynchronous event-driven network application framework…

免费可用 ChatGPT 网页版

前言 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言来…

在 Python 中执行逐元素加法

文章目录 Python 中的逐元素加法在 Python 中使用 zip() 函数执行逐元素加法在 Python 中使用 map() 函数执行逐元素加法在 Python 中使用 NumPy 执行逐元素加法 我们将通过示例介绍在 Python 中按元素添加两个列表的不同方法。 Python 中的逐元素加法 在 Python 中使用列表时…

最简单配置jenkins容器使用宿主机的docker方法

构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可 设置Jenkins容器使用宿主机Docker 设置宿主机docker.sock权限 chown root:root /var/run/docker.sock chmod orw /var/run/docker.sock 添加数据卷 v…

Nacos之服务配置中心

1.基础配置 1.1.新建模块cloudalibaba-config-nacos-client3377 1.1.1.POM <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

网络:网络分层与协议/OSI七层模型/(TCP/IP模型)

一、简单理解 OSI模型(Open System Interconnection)&#xff1a; 七层模型&#xff0c;亦称OSI&#xff08;Open System Interconnection&#xff09;。参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;一般…

chatgpt赋能Python-pythondic

Python Dict - Python中最有用的数据结构之一 当谈到Python的数据结构时&#xff0c;Python字典&#xff08;Python Dict&#xff09;是最常用和最有用的数据结构之一。Python字典是一个非常强大且多才多艺的数据结构&#xff0c;它不仅易于学习和使用&#xff0c;而且可以大大…

【嵌入式Linux】设备树基本语法

设备树基本语法 1_总领-本期设备树视频要怎么讲&#xff1f;讲什么&#xff1f;_哔哩哔哩_bilibili 基本的 特殊的 中断控制 描述GIC控制器 时钟 CPU GPIO 个数&#xff0c;保留范围&#xff08;起始、长度&#xff09;&#xff0c;个数对应的名字 GPIO映射-这个脚被用了换一…

CBFS Vault 2022 for .NET Crack

将多个文件打包到一个 Vault - 一个“文件中的文件系统”&#xff0c;完成每个文件的压缩、透明加密和随机读/写访问。 亮点包括新的日记选项、用于更好地控制和跟踪的新事件&#xff0c;以及一系列核心性能和可用性改进 [了解更多]。 CBFS保险库 在任何地方存储一个完整的文件…

javascript-基础知识点总结

目录 &#xff08;一&#xff09;基础语法 1、javaScript引入方式 2、变量与常量 3、数据类型 typeof操作符 4、运算符 5、输出函数 6、类型转化 7、转移字符 8、注释 &#xff08;二&#xff09;流程控制 1、选择结构 switch 2、循环结构 for &#xff08;三&…

neovim下window的快捷切换

neovim下window的快捷切换 在使用emacs的时候&#xff0c;喜欢加插件window-numbering。 这样在分屏之后的emacs里&#xff0c;通过配置快捷键leaderwnumber 跳转到对应的windows, 而且该软件会在对应底部显示数字提示&#xff0c;非常方便。 另外:为什么不用快捷键leadernumb…