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

news2024/11/27 8:36:04

目录

  • 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设计,苏剑林

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

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

相关文章

C++STL算法篇之集合算法

CSTL算法篇之集合算法 集合算法set_union(并集)set_difference(差集)set_intersection(交集)set_symmetric_difference(对称差集) 集合算法 当然最好还是要包含 functional algorithm 这2个头文件 集合算法有4个函数 1.set_union 交集 2.set_difference 差集 3.set_intersectio…

安卓开发多选列表和回显已选择内容

问题背景 安卓日常开发和学习过程中,经常会碰到需要多选列表和显示已选择内容的场景,本文将介绍安卓实现多选列表和回显已选择内容的一种方案。 问题分析 话不多说,先上效果: 思路分析: 一个纵向列表显示待选择内…

多线程基础(二)CAS无锁优化/自旋锁/乐观锁、ABA问题

CAS (Compare And Set)比较并替换 上篇文章的锁问题解决,可以使用更高效的方法,使用AtomXXX类,AtomXXX类本身方法都是原子性的,但不能保证多个方法连续调用是原于性的。 import java.util.ArrayList; imp…

chatgpt赋能Python-pythoncd

Python介绍 Python是一种流行的高级编程语言,由Guido van Rossum于1989年开发。Python的设计目标是简单易学、易于阅读和编写,同时也是一种高效的语言,能够处理各种不同的任务。Python在Web开发、数据分析、人工智能和科学计算等领域得到广泛…

chatgpt赋能Python-pythoncalendar

PythonCalendar:Python中优秀的日期处理库 作为一门快速发展的编程语言,Python提供了许多优秀的库和工具,用于方便程序员进行各种各样的操作和处理。其中,日期处理是一个必不可少的模块。PythonCalendar库就是Python中优秀的日期…

ChatGPT 的 AskYourPDF 插件所需链接如何获取?

一、背景 目前 ChatGPT 主要有两款 PDF 对话插件,一个是 AskYourPDF 一个是 ChatWithPDF(需 ChatGPT Plus),他们都可以实现给一个公共的PDF 链接,然后进行持续对话,对读论文,阅读 PDF 格式的文…

Godot引擎 4.0 文档 - 循序渐进教程 - 创建实例

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Creating instances — Godot Engine (stable) documentation in English 创建实例 在前面的部分中,我们看到场景是以树结构组织的节点集合,以…

【中间件】通过 docker-compose 快速部署 Kafka 保姆级教程

文章目录 一、概述二、前期准备1)部署 docker2)部署 docker-compose 三、创建网络四、安装 Zookeeper五、Kafka 编排部署1)下载 Kafka2)配置3)启动脚本 bootstrap.sh4)构建镜像 Dockerfile5)编排…

【VMware】搭建个人服务器

文章目录 准备工作三种网络模式Bridged(桥接模式)定义设置 NAT(网络地址转换模式)定义设置 Host-Only(仅主机模式)定义设置 搭建服务器网络模式的选择在VMWare的网络编辑器中设置转发端口查看宿主机的ip地址使用ssh连接工具进行连接 Mac笔记本跑虚拟机总感觉别扭,通…

浅谈一下“近期强势”这个指数

最近的行情,如果不理解退潮,那就意味着完全不理解情绪周期,也自然对大周期和小周期的概念了,这样一来无论你嘴上套用什么分歧、一致、修复都是徒劳的。 我说过我定义的新周期开始到结束,为什么我能定义一个很长的大周期?因为我有办法去观察赚钱效应。 如果我们都能理解…

【分布式锁】Redisson分布式锁底层原理

文章目录 前言原理分析Redisson实现Redis分布式锁的底层原理1.加锁机制2.锁互斥机制3. watch dog自动延期机制4.可重入加锁机制5.释放锁机制6.上述Redis分布式锁的缺点 前言 现在最流行的redis分布式锁就是Redisson了,来看看它的底层原理就了解redis是如何使用分布…

真香,聊聊 RocketMQ 5.0 的 POP 消费模式!

大家好,我是君哥。 大家都知道,RocketMQ 消费模式有 PULL 模式和 PUSH 模式,不过本质上都是 PULL 模式,而在实际使用时,一般使用 PUSH 模式。 不过,RocketMQ 的 PUSH 模式有明显的不足,主要体…

Unity 过场工具(Cutscene)设计(四) ——组件化设计

Unity 过场工具(Cutscene)设计(四) ——组件化设计 写到这一篇文章前就开始在考虑如何才能说清楚自己的设计思路,因为后续涉及到编辑器和Runtime框架的实际设计和实现过程,两者之间是互相有设计因果关系的。为了阐述自己的核心设计…

从0.5开始开发一个导购网站

提醒:文中没有具体如何修改的代码,只是提供了修改的思路。 为什么是从0.5开始呢? 因为这里借助了一个大佬的开源项目Springboot项目仿天猫商城: Springboot项目仿天猫商城 前台jsp页面 大佬的代码简洁,没有什么多余的功能&…

系统调用与API

系统调用介绍 什么是系统调用 为了让应用程序有能力访问系统资源,也为了让程序借助操作系统做一些由操作系统支持的行为,每个操作系统都会提供一套接口,以供应用程序使用。系统调用涵盖的功能很广,有程序运行所必需的支持&#xf…

leetCode刷题记录2

文章目录 hot100题560. 和为 K 的子数组581. 最短无序连续子数组 ▲617. 合并二叉树 hot100题 560. 和为 K 的子数组 560. 和为 K 的子数组 先暴力&#xff0c;过了再说 public int subarraySum(int[] nums, int k) {int ans 0;for (int i 0; i < nums.length; i) {in…

保姆级教程Windows11下安装RocketMQ

一、RocketMQ介绍 RocketMQ 是阿里巴巴开源的分布式消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念&#xff0c;如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。 二、Rock…

vector类详解【c++】

&#x1f600;博主主页 &#x1f600;博主码云 目录 &#x1f3c5;vector简介&#x1f3c5;vector使用&#x1f3c6;vector的定义&#x1f3c6;vector iterator 的使用&#x1f3c6;vector 空间函数&#x1f3c6;vector的扩容问题&#x1f3c6;vector 增删查改&#x1f3c6;vec…

Python tkintertools 模块介绍(新版)

&#x1f680;tkintertools&#x1f680; The tkintertools module is an auxiliary module of the tkinter module tkintertools 模块是 tkinter 模块的辅助模块 Installation/模块安装 Stable version/稳定版本 Version/版本 : 2.6.1Release Date/发布日期 : 2023/05/21 p…

Edge 浏览器:隐藏功能揭秘与高效插件推荐

文章目录 一、前言二、Edge 的各种奇淫巧计2.1 开启 Edge 分屏功能2.2 启动 Edge 浏览器后直接恢复上次关闭前的页面2.3 解决 Edge 浏览器无法同步账号内容2.4 开启垂直标签页&#xff08;推荐&#xff09;2.5 设置标签分组&#xff08;推荐&#xff09;2.6 设置标签睡眠时间&a…