(2024,attention,可并行计算的 RNN,并行前缀扫描)将注意力当作 RNN

Attention as an RNN

公众号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群)

目录

0. 摘要

3. 方法 

3.1 注意力作为一种(多对一的)RNN

3.2 注意力作为(多对多)RNN

3.3 Aaren: 将注意力当作 RNN

4. 实验 

附录

F. 计算时间


0. 摘要

随着 Transformer 的出现,序列建模领域取得了重大突破,为利用 GPU 并行性提供了高性能的架构。然而,Transformer 在推理时计算开销较大,限制了其在低资源环境(例如移动和嵌入式设备)中的应用。为了解决这个问题,我们采取了以下步骤:

  • 首先,我们展示了注意力机制可以被视为一种特殊的递归神经网络(RNN),能够高效地计算其多对一的 RNN 输出。
  • 接着,我们证明了流行的基于注意力的模型(如 Transformer)可以视为 RNN 的变体。然而,与传统的 RNN(如 LSTM)不同,这些模型无法高效地用新 token 更新,这在序列建模中是一个重要特性。
  • 为了解决这个问题,我们引入了一种基于并行前缀(prefix)扫描算法的新的高效计算注意力多对多 RNN 输出的方法。
  • 基于新的注意力公式,我们推出了 Attention as a recurrent neural network(Aaren),这是一种基于注意力的模块,不仅可以像 Transformer 一样并行训练,还能像传统 RNN 一样高效地用新 token 进行更新,只需要固定内存来进行推理。

在实验中,我们展示了 Aaren 在四个流行的序列问题设置中的 38 个数据集上,表现与 Transformer 相当,但在时间和内存效率上更优。这些问题设置包括强化学习、事件预测、时间序列分类和时间序列预测任务。

3. 方法 

3.1 注意力作为一种(多对一的)RNN

对一个查询向量 q 的注意力可以被看作一个函数,该函数将 N 个上下文 token x_(1:N) 通过它们的键和值 {(ki, vi)}^N_(i=1) 映射到一个单一的输出 o_N = Attention(q, k_(1:N), v_(1:N))。给定 s_i = dot(q, ki),输出 o_N 表示为: 

将注意力视为一种 RNN,我们可以将其迭代计算为滚动求和

其中 k=1,…,N。然而,在实践中,这是一种不稳定的实现,会由于有限精度表示和可能非常小或非常大的指数(即,exp(s))而遇到数值问题。为缓解这一问题,我们通过累积最大值项

重写递归关系,改为计算

值得注意的是,最终结果是相同的,即 o_N = ^a_N / ^c_N= a_N /c_N。因此,a_k、c_k 和 m_k 递归地计算如下: 

通过将 a_k​、c_k 和 m_k 的递归计算从 a_(k-1)​、c_(k-1) 和 m_(k-1) 中封装起来,我们引入了一个 RNN 单元,用于迭代计算注意力的输出(见图 2)。注意力的 RNN 单元以 (a_(k-1), c_(k-1), m_(k-1)​, q) 作为输入,并计算 (ak​,ck​,mk​,q)。请注意,查询向量 q 在 RNN 单元中被传递。注意力的 RNN 的初始隐藏状态为 (a_0, c_0, m_0, q) = (0, 0, 0, q)。

计算注意力的方法。通过将注意力视为一种 RNN,我们可以看到有不同的计算注意力的方法:

  • 在 O(1) 内存中逐 token 递归地(即,顺序地)
  • 以传统方式(即,并行地)在需要线性 O(N) 内存的情况下。由于注意力可以被看作是一种 RNN,计算注意力的传统方法也可以被看作是计算注意力的一对多 RNN 输出的有效方法,即,RNN 的输出将多个上下文 token 作为输入,但在 RNN 结束时只输出一个 token(见图 1a)
  • 一种按块处理 token 的 RNN,需要 O(b) 内存,其中 b 是块的大小。然而,这种方法超出了本工作的范围。因此,按块处理的 RNN 的描述包含在附录 A 中。

将现有基于注意力的模型视为 RNN。通过将注意力视为一种 RNN,现有的基于注意力的模型也可以被视为 RNN 的变体。例如,Transformer 的自注意力是 RNN(图 1b),其上下文 token 作为其初始隐藏状态。

Perceiver 的交叉注意力是 RNN(图 1c),其上下文相关潜变量作为其初始隐藏状态。通过利用它们注意力机制的 RNN 形式,这些现有模型可以有效地计算它们的输出内存。将注意力视为 RNN 存在的挑战。然而,将现有的基于注意力的模型,如 Transformer,视为 RNN 时,这些模型缺乏传统 RNN(如 LSTM 和 GRU)中常见的重要属性。值得注意的是,LSTM 和 GRU 能够以仅为  O(1) 的固定内存和计算高效地更新自己,这对于序列建模是一个重要特性,其中数据以流的形式接收。相比之下,将 Transformer 的 RNN 视图(见图 1b)处理新 token 的方式是添加一个新的RNN,新 token 作为其初始状态。新的 RNN 处理所有先前的 token,需要 O(N) token 数量的线性计算。在 Perceiver 中,由于其体系结构,潜变量(图 1c 中的 L_i)是与输入相关的,这意味着当接收到新 token 时,它们的值会改变。由于它们的 RNN 的初始隐藏状态(即,潜变量)会改变,因此 Perceiver 需要从头重新计算它们的 RNN,需要 O(NL)  token 数量(N)和潜变量数量(L)的线性计算。

3.2 注意力作为(多对多)RNN

针对这些限制,我们提议开发一种基于注意力的模型,能够利用 RNN 形式的能力进行高效更新。为此,我们首先引入了一种高效的并行化方法,用于将注意力计算为多对多的 RNN,即,一种并行方法来计算

为此,我们利用并行前缀扫描算法(Blelloch,1990)(见算法 1),这是一种并行计算方法,用于通过关联运算符 ⊕ 从 N 个连续数据点计算 N 个前缀计算。该算法可以从 {xk}^N_(k=1) 高效地计算

回想一下,Attention(q, x(1:k)) = ok = ak / ck。为了高效计算 Attention(q, x(1:k)),我们可以通过并行扫描算法计算 {ak}^N_(k=1),{ck}^N_(k=1) 和 {mk}^N_(k=1),然后将 ak 和 ck 结合起来计算 Attention(q, x(1:k))。

为此,我们提出以下关联运算符 ⊕,它作用于形式为(m_A, u_A, w_A)的三元组,其中 A 是索引集合,

mA = max_(i∈A) si,uA = ∑_(i∈A) exp(si − mA),wA = ∑_(i∈A) exp(si − mA)vi

并行扫描算法将 {(m{i}, u{i}, w{i})}^N_(i=1) = {(si, 1, vi)}^N_(i=1) 作为输入。该算法递归地应用运算符 ⊕,其工作方式如下:

(mA, uA, wA)⊕(mB, uB, wB) = (mA∪B, uA∪B, wA∪B)

mA∪B = max(mA, mB),uA∪B = uA·exp(mA − mA∪B) + uB exp(mB − mA∪B)

wA∪B = wA· exp(mA−mA∪B) + wB·exp(mB−mA∪B)

在递归地应用运算符完成后,该算法输出

{(m{1,...,k}, u{1,...,k}, w{1,...,k})}^N_(k=1) = {(mk, ∑_(i=1) exp(si − mk), ∑_(i=1) exp(si − mk)vi)}^N_(k=1)

也称为 {(mk, ck, ak)}^N_(k=1)。

通过组合输出元组的最后两个值,我们得到 Attention(q, x(1:k)) = ok = ak / ck,从而实现了一种高效的并行化方法,用于计算注意力作为多对多的 RNN(见图 3)。

3.3 Aaren: 将注意力当作 RNN

利用注意力的并行化多对多形式,我们提出了Aaren。Aaren 的接口与 Transformer 相同,将 N 个输入映射到 N 个输出,其中第 i 个输出是从第 1 到第 i 个输入的聚合。因此,Aaren也是自然可堆叠的,且能够为每个序列 token 计算单独的损失项

然而,与使用因果自注意力的 Transformer 不同,Aaren 使用了前述的将注意力计算为多对多 RNN 的方法,使其更加高效。Aaren 的功能如下:

与 Transformer 中的查询是注意力的一个输入 token 不同,Aaren 的查询 token q 是通过反向传播在训练过程中学习的。在图 4 中,我们包含了一个具有输入上下文 token x_(1​:3) 和输出 y_(1:3) 的堆叠 Aaren 模型的示例。值得注意的是,由于 Aaren 利用了注意力的 RNN 形式,Aaren 的堆叠也是 RNN 的堆叠。因此,Aarens 也能够以高效的方式与新 token 进行更新,即,仅需要固定计算量的 y_k 的迭代计算,因为它仅依赖于 h_(k-1) 和 x_k。与基于 Transformer 的模型不同,它们在使用 KV 缓存时需要线性内存,并且需要存储所有先前的 token,包括中间 Transformer 层中的 token,而基于 Aaren 的模型仅需要固定内存,并且不需要存储所有先前的 token,使得 Aaren 比 Transformer 更加高效。

4. 实验 

附录

F. 计算时间

我们的实验是在 Nvidia GTX 1080 Ti(12 GB)和 Nvidia Tesla P100(16 GB)GPU 的混合环境中运行的。分析是在 Nvidia GTX 1080 Ti(12 GB)上执行的。

强化学习实验大致需要相同的时间:每个实验约 2 到 4 小时。

事件预测实验的时间因数据集而异:

  • MIMIC 约需 0.5 小时
  • Wiki 约需 0.75 小时
  • Reddit 约需 3.5 小时
  • Mooc 约需 8 小时
  • StackOverflow 约需 3.5 小时
  • Sin 约需 1.5 小时
  • Uber 约需 3 小时
  • Taxi 约需1.5 小时

时间序列预测实验以 T ∈ {96, 192, 336, 720} 的单个脚本运行。实验时间因数据集而异:

  • Weather 约需 6 小时
  • Exchange 约需 0.5 小时
  • Traffic约需 1 小时
  • ECL 约需 4 小时
  • ETTh1 约需 0.75 小时
  • ETTm1 约需 11 小时
  • ETTh2 约需 0.75 小时
  • ETTm2 约需 11 小时

时间序列分类实验作为单个脚本运行。在所有数据集上运行实验总共约需 1 小时。

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

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

相关文章

多语言印度红绿灯系统源码带三级分销代理功能

前端为2套UI,一套是html写的,一套是编译后的前端 后台功能很完善,带预设、首充返佣、三级分销机制、代理功能。 东西很简单,首页就是红绿灯的下注页面,玩法虽然单一,好在不残缺可以正常跑。

Putty: 随心御剑——远程启动服务工具plink

一、引言:如何远程控制 也许你会有这样的场景,交互程序(以下简称UI程序)跑在windows端,而控制程序跑在Linux上。我们想要通过windows端 UI程序来启动Linux下面的服务,来一场酣畅淋漓的御剑飞行咋办,难道要自己十年磨一剑,在Linux下编写一个受控服务程序么.计算机科技发…

【MATLAB】信号的熵

近似熵、样本熵、模糊熵、排列熵|、功率谱熵、奇异谱熵、能量熵、包络熵 代码内容: 获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复信号的熵本公众号致力于解决找代码难,写代码怵。各位有什么急需…

FreeRTOS中断中释放信号量

串口接收:中断程序中逆序打印字符串 串口接收:逆序回环实验思路 注:任务优先级较高会自动的切换上下文进行运行 FreeRTOS中的顶半操作和底半操作 顶半操作和底半操作“这种叫法源自与Linux”在嵌入式开发中,为了和Linux操作系统做…

Linux网络编程: 网络基础

Linux网络编程: 网络基础 1.网络划分 一.网络通信1.网络通信和本地通信的联系2.网络通信与本地通信最本质的区别及其衍生出的问题 二.网络协议初识1.为何本地通信不行?2.打电话的例子体会分层模型的好处3.OSI七层模型的提出4.OSI七层模型与TCP/IP五层模型1.TCP/IP与…

二十九篇:构建未来:信息系统的核心框架与应用

构建未来:信息系统的核心框架与应用 1. 引言 在这个充满挑战和机遇的信息时代,信息系统已经成为现代组织不可或缺的神经中枢。它们不仅革新了我们处理信息的方式,更是极大地增强了决策制定的效率和质量。在这篇文章中,我将分享我…

Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作

在Java编程中,BeanUtil工具类是一种强大且便捷的工具,用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能,通过详细的代码示例展示其应用,并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用…

5.26牛客循环结构

1002. 难点: 两层循环条件设置 思路 可以设置三个变量 代码 1003 思路: 与星号双塔差不多,在此基础上加大一点难度 每日练题5.23 (EOF用法)-CSDN博客 代码 1004 代码

Android Compose 八:常用组件 Switch

Switch 切换按钮 val isChecked remember { mutableStateOf(true) }Switch(checked isChecked.value,onCheckedChange {Log.i("text_compose","onCheckedChange>>"it)isChecked.value it})效果 默认颜色 应该对应 主题色 1.1 thumbContent 按钮…

Python Beautiful Soup 使用详解

大家好,在网络爬虫和数据抓取的领域中,Beautiful Soup 是一个备受推崇的 Python 库,它提供了强大而灵活的工具,帮助开发者轻松地解析 HTML 和 XML 文档,并从中提取所需的数据。本文将深入探讨 Beautiful Soup 的使用方…

vue项目打包教程

如果是用 vue-cli 创建的项目,则项目目录中没有 config 文件夹,所以我们需要自建一个配置文件;在vue项目目录下创建文件 vue.config.js,需注意文件名称必须是 vue.config.js,然后在文件中插入以下代码: 文件…

我让gpt4o给我推荐了一千多次书 得到了这些数据

事情是这样的,我们公司不是有个读书小组嘛,但是今年大家都忙于工作,忽视了读书这件事,所以我就想着搞个群机器人,让它明天定时向群里推荐一本书,用来唤起大家对读书的兴趣。但在调试的过程中就发现gpt4o老喜…

齿轮常见故障学习笔记

大家好,这期咱们聊一聊齿轮常见的失效形式,查阅了相关的资料,做个笔记分享给大家,共同学习。 介绍 齿轮故障可能以多种方式发生。如果在设计阶段本身就尽量防止这些故障的产生,则可以产生改更为优化的齿轮设计。齿轮…

pytest框架用例命名规则详解

pytest 测试用例的命名规则是为了确保 pytest 能够正确地识别和执行测试用例。 以下是关于 pytest 测试用例命名规则的详细解释: 1 单个测试文件以‘test_’开头或者以‘_test’结尾 比如我们创建test_case1.py case2_test.py文件。 2 单个测试文件中&#xff0c…

58. UE5 RPG AI行为树的装饰器

书接56. UE5 RPG 给敌人添加AI实现跟随玩家,我们实现了AI一些基础设置,并实现了获取敌人附近的玩家实现了跟随功能 接下来,我们将实现区分职业,并根据职业不同设置不同的攻击距离,并且根据职业实现不同的技能施放。 …

《Effective Objective-C 2.0》读书笔记——对象、消息、运行期

目录 第二章:对象、消息、运行期第6条:理解“属性”这一概念第7条:在对象内部尽量直接访问实例变量第8条:理解“对象等同性”这一概念第9条:以“类族模式”隐藏实现细节第10条:在既有类中使用关联对象存放自…

App推广新境界:Xinstall助你轻松突破运营痛点,实现用户快速增长!

在移动互联网时代,App已经成为企业营销不可或缺的一部分。然而,如何有效地推广App,吸引并留住用户,成为了众多企业面临的难题。今天,我们将为您揭秘一款神奇的App推广工具——Xinstall,它将助您轻松突破运营…

绘唐3模型怎么放本地sd安装及模型放置位置 及云端sd部署

绘唐3模型怎么放本地sd安装及模型放置位置 及云端sd部署 资料里面授权方式: https://qvfbz6lhqnd.feishu.cn/wiki/CcaewIWnSiAFgokOwLycwi0Encf 云端和模型之间存在某种关联性。云端通常用于存储和管理大量数据,并提供计算和资源的服务。模型是对数据进…

Linux环境下TensorFlow安装教程

TensorFlow是学习深度学习时常用的Python神经网络框 下面以Mask R-CNN 的环境配置为例: 首先进入官网:www.tensorflow.org TensorFlow安装的总界面: 新建anaconda虚拟环境: conda create -n envtf2 python3.8 (Pyth…

『大模型笔记』从头开始代码构建GPT!

从头开始代码构建GPT! 文章目录 一. 从头开始代码构建GPT!二. 参考文献一. 从头开始代码构建GPT! 我们构建了一个生成式预训练Transformer (GPT),遵循论文《Attention is All You Need》和OpenAI的GPT-2 / GPT-3的方法。我们讨论了与ChatGPT的联系,ChatGPT已经风靡全球。我…