【论文翻译】Attention Is All You Need

news2024/11/14 20:42:14

【论文】Attention is All you Need (neurips.cc)

摘要

主要的序列转换模型是基于复杂的循环或卷积神经网络,其中包括一个编码器和一个解码器。表现最好的模型还通过注意机制连接编码器和解码器。我们提出了一个新的简单的网络架构,Transformer,完全基于注意力机制,完全不使用循环和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更优越,同时更具有并行性,需要的训练时间也大大减少。我们的模型在WMT 2014英语-德语翻译任务中达到了28.4 BLEU,比现有的最佳结果(包括集合)提高了超过2 BLEU。在WMT 2014英语到法语的翻译任务中,我们的模型在8个gpu上训练3.5天后,建立了一个新的单模型最先进的BLEU评分41.8,这只是文献中最好模型训练成本的一小部分。通过将Transformer成功应用于大量和有限训练数据的英语选区解析,我们表明Transformer可以很好地推广到其他任务。

1. 介绍

        循环神经网络,特别是长短期记忆[13]和门控循环[7]神经网络,已经被确定为序列建模和转换问题(如语言建模和机器翻译)的最先进方法[35,2,5]。自那以后,许多努力继续推动循环语言模型和编码器-解码器架构的边界[38,24,15]。

        循环模型通常沿着输入和输出序列的符号位置进行计算。在计算时间中将位置与步骤对齐,它们生成一个隐藏状态H_{t} 序列,作为前面的隐藏状态 H_{t-1} 和位置 t 的输入的函数。这种固有的连续性质使训练示例中不能并行化处理,这在较长的序列长度中变得至关重要,因为内存限制了跨示例的批处理。最近的工作通过因数分解技巧[21]和条件计算[32]在计算效率上取得了显著的提高,同时也改善了后者的模型性能。然而,顺序计算的基本约束仍然存在。

        在各种任务中,注意力机制已经成为引人注目的序列建模和转换模型的一个组成部分,允许在不考虑它们在输入或输出序列中的距离的情况下建模依赖关系[2,19]。然而,除了少数情况外,这种注意机制都是与循环网络结合使用的。

        在这项工作中,我们提出了Transformer,这是一种不使用循环的模型架构,而是完全依赖于注意机制来绘制输入和输出之间的全局依赖关系。Transformer允许明显更高的并行化,并且在8个P100 gpu上训练12小时后,可以达到翻译质量的新水平。

2. 背景

        减少顺序计算的目标也构成了Extended Neural GPU[16]、ByteNet[18]和ConvS2S[9]的基础,它们都使用卷积神经网络作为基本构建块,为所有输入和输出位置并行计算隐藏表示。在这些模型中,来自两个任意输入或输出位置的信号的关联 所需的操作数量 随着位置之间的距离而增长,ConvS2S为线性增长,ByteNet为对数增长。这使得学习遥远位置之间的依赖关系[12]变得更加困难。在Transformer中,这被减少为一个常数数量的操作,尽管代价是由于平均注意力加权位置而降低了有效分辨率,我们用Multi-Head Attention抵消了这一影响,如3.2节所述。

        自注意力(Self-attention),有时也称为内部注意(intra-attention ),是一种将单个序列的不同位置联系起来的注意机制,以便计算序列的表示。自我注意已成功应用于多种任务,包括阅读理解、抽象总结、文本蕴涵和学习任务无关的句子表征[4,27,28,22]。

        端到端记忆网络基于循环注意力机制,而不是序列对齐的循环,在简单语言问题回答和语言建模任务中表现良好[34]。

        然而,据我们所知,Transformer是第一个完全依靠自注意力来计算输入和输出表示的转换模型,而不使用序列对齐的rnn或卷积。在接下来的章节中,我们将介绍Transformer,使用自注意力,并讨论它相对于[17,18]和[9]等模型的优势。

3 模型架构

        大多数有竞争力的神经序列转导模型有一个编码器-解码器结构[5, 2, 29]。在这些模型中编码器将输入的符号表示序列( x 1 , . . . , x n ) 映射为连续表示序列z = ( z 1 , . . . , z n ) 。给定z后,解码器产生一个输出序列( y 1 , . . . , y n )的符号,每次一个元素。在每一步,该模型都是自动循环的[9],在生成下一步时,消耗先前生成的符号作为额外的输入。

        Transformer遵循这一整体架构,在编码器和解码器中都使用了堆叠式自注意力和点式全连接层,分别在图1的左半部和右半部显示。

 3.1 编码器和解码器堆栈

编码器。编码器是由N=6个相同的层堆叠而成。每层有两个子层。第一层是一个多头的自注意力机制,第二层是一个简单的、位置上的全连接前馈网络。我们在两个子层中采用一个残差连接[10],然后进行层归一化[1]。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是由子层本身实现的函数。为了方便这些剩余连接,模型中的所有子层以及嵌入层都会产生尺寸为 d_{model}= 512 的输出。

解码器。解码器也是由N=6个相同层的堆栈组成。除了每个编码器层的两个子层之外,解码器还插入了第三个子层,它对编码器堆栈的输出进行多头注意力。与编码器类似,我们在每个子层周围采用残差连接然后进行层归一化。我们还修改了解码器堆栈中的自注意力子层,以防止位置关注后续位置。这种屏蔽,再加上输出嵌入偏移一个位置的事实,确保对位置i的预测只取决于小于i的位置的已知输出。

3.2 注意力

注意力函数可以被描述为将一个queries和一组keys、values对映射到一个输出,其中queries、keys、values和输出都是向量。输出被计算为数值的加权和,其中分配给每个数值的权重是由查询与相应的键的兼容性函数计算的。

3.2.1 缩放点积注意力

我们把我们的特殊关注称为 “缩放点积关注”(图2)。输入包括维度为d_{k}​的queries和keys,以及维度为d_{v}​的values。我们计算queries与所有keys的点积,将每个keys除以\sqrt{d_{k}}​​,并应用softmax函数来获得数值的权重。

 在实践中,我们同时计算一组queries的注意函数,并将其打包成矩阵Q,keys和values也被打包成矩阵K和V。我们计算输出的矩阵为:

 

两种最常用的注意力函数是加法注意力[2],和点乘法(乘法)注意力。除了\frac{1}{\sqrt{d_{k}}}这个比例因子外,点乘法注意力与我们的算法相同。加法注意力使用具有单个隐藏层的前馈网络来计算兼容性函数。虽然两者在理论上的复杂性相似,但点积式注意力在实践中要快得多,而且空间效率更高,因为它可以用高度优化的矩阵乘法代码来实现。

虽然对于d_{k}的小值来说,这两种机制的表现相似,但对于d_{k}的大值来说,加法注意力优于点积注意力,且不存在扩展性[3]。我们怀疑对于大的值来说,点积的幅度很大,把softmax函数推到它的梯度极小的区域。为了抵消这种影响,我们将点积的比例定为\frac{1}{\sqrt{d_{k}}}

 

3.2.2 多头注意力

我们发现,与其用d_{model}维的keys、values和queries来执行一个单一的注意函数,不如用不同的、学习过的线性投影将queries、keys和values分别投影到d_{k}​,d_{k}​和d_{v}​维,这样做是有益的。在这些投射的查询、键和值的每个版本上,我们再平行地执行注意函数,产生d_{v}​维的输出值。这些值被串联起来,并再次进行投影,得到最终的数值,如图2所示。

多头注意允许模型在不同的位置上共同关注来自不同表征子空间的信息。在单头注意的情况下,平均化抑制了这一点。

 在这项工作中,我们采用了h = 8的平行注意层,或称头。对于每个头,我们使用d_{k}=d_{v}=d_{model}/h=64。由于每个头的维度减少,总的计算成本与全维度的单头注意相似。

 3.2.3 注意力在我们模型中的应用

Transformer 以三种不同的方式使用多头关注。
  - 在 "编码器-解码器注意 "层中,queries来自前一个解码器层,而keys和values来自编码器的输出。这允许解码器中的每个位置都关注输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意力机制,如[31, 2, 8]。
  - 编码器包含自注意力层。在自注意力层中,所有的keys、values和queries都来自同一个地方,在这种情况下,就是编码器中前一层的输出。编码器中的每个位置都可以关注到编码器前一层的所有位置。
  - 同样,解码器中的自注意力允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。我们需要防止解码器中的信息向左流动,以保持自动回归的特性。我们通过掩盖(设置为-∞)softmax输入中对应于非法连接的所有值,在缩放点积注意力内部实现这一点。见图2。

 3.3 Position-wise Feed-Forward Networks

         除了注意子层之外,我们的编码器和解码器中的每一层都包含一个全连接的前馈网络,该网络分别适用于每个位置,并且完全相同。这包括两个线性变换,中间有一个ReLU激活。

        虽然线性变换在不同的位置上是相同的,但它们在不同的层上使用不同的参数。另一种描述方式是将其作为两个内核大小为1的卷积。输入和输出的维度为d_{model}=512,内层的维度为d_{ff}=2048

3.4 嵌入和Softmax

与其他序列转换模型类似,我们使用学习的嵌入将输入标记和输出标记转换为维度为d_{model}​的向量。我们还使用通常的学习线性变换和softmax函数将解码器输出转换为预测的下一个标记概率。在我们的模型中,我们在两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵,与[24]相似。在嵌入层中,我们将这些权重乘以\sqrt{d_{model}}​​。

3.5 位置编码

        由于我们的模型不包含递归和卷积,为了使模型能够利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈的底部为输入嵌入添加 “位置编码”。位置编码与嵌入具有相同的维度dmodel,因此这两者可以相加。有很多位置编码的选择,有学习的,也有固定的[8]

        在这项工作中,我们使用不同频率的正弦和余弦函数。

 其中pos是位置,i是维度。也就是说,位置编码的每个维度对应于一个正弦波。波长形成一个从2π到10000·2π的几何级数。我们选择这个函数是因为我们假设它能使模型很容易地学会通过相对位置参加,因为对于任何固定的偏移量k,PE_{pos+k}可以被表示为PE_{pos}​的线性函数。

        我们还试验了用学习的位置嵌入[8]来代替,发现这两个版本产生了几乎相同的结果(见表3行(E))。我们选择了正弦波版本,因为它可能允许模型推断出比训练期间遇到的长度更长的序列。

4 为什么是自注意力

 

        在这一节中,我们将自注意力层的各个方面与通常用于将一个变长的符号表示序列( x 1 , . . . , x n ) 映射到另一个等长的序列( z 1 , . . . , z n ) 的循环和卷积层进行比较,其中x i , z i ∈ \mathbb{R}^{d},如典型序列转换编码器或解码器的隐藏层。我们使用自我关注的动机是考虑到三个方面的问题。

        一个是每层的总计算复杂性。另一个是可以并行化的计算量,以所需的最小顺序操作数来衡量。

        第三是网络中长距离依赖关系之间的路径长度。学习长距离的依赖关系是许多序列转导任务中的一个关键挑战。影响学习这种依赖关系能力的一个关键因素是前向和后向信号在网络中必须穿越的路径的长度。在输入和输出序列的任何位置组合之间的这些路径越短,就越容易学习长距离的依赖关系[11]。因此,我们也比较了由不同层类型组成的网络中任何两个输入和输出位置之间的最大路径长度。

        如表1所示,自注意力层以恒定数量的顺序执行操作连接所有位置,而递归层需要O(n)顺序操作。就计算复杂度而言,当序列长度n小于表示维度d时,自注意层比递归层更快,这在机器翻译中最先进的模型所使用的句子表示中是最常见的情况,如词片[31]和字节对[25]表示。为了提高涉及超长序列的任务的计算性能,自我关注可以被限制为只考虑输入序列中以各自输出位置为中心的大小为r的邻域。这将使最大路径长度增加到O(n/r)。我们计划在未来的工作中进一步研究这种方法。

        一个核宽k < n的卷积层不能连接所有的输入和输出位置对。这样做需要一个O(n/k)的卷积层堆栈,如果是连续的内核,或者O(logk(n))的扩张卷积[18],增加网络中任意两个位置之间的最长路径的长度。卷积层通常比循环层昂贵k倍。然而,可分离卷积[6]大大降低了复杂度,降至O(k·n·d + n·d2)。然而,即使k = n,可分离卷积的复杂性也等于自注意层和点前馈层的组合,这是我们在模型中采用的方法。

        作为附带的好处,自我关注可以产生更多可解释的模型。我们检查了我们的模型的注意力分布,并在附录中介绍和讨论了示例。不仅每个注意头都能清楚地学习执行不同的任务,许多注意头还表现出与句子的句法和语义结构相关的行为。

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

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

相关文章

线程常用方法及常见状态

终止线程应该怎么终止一个线程呢&#xff1f;当线程完成任务时。通过使用变量来控制run方法退出的方式停止线程&#xff0c;即通知方式。这里详细介绍一下2的方式。在A线程依靠变量循环跑的过程ing&#xff0c;主线程通过修改A线程的变量&#xff0c;来控制线程终止。为A线程中…

SpringBoot配置文件详解

简介 SpringBoot全局配置文件默认为src/main/resources下的application.properties&#xff0c;后缀可以改为yml&#xff0c; 如果application.yml和application.properties两个配置文件都存在&#xff0c;那么&#xff0c;properties优先级更高 官网(Spring Boot 全部配置项)&…

01_kobject和ktype创建设备文件和设备目录

总结:创建设备文件的方法 设备文件属性指的是 /sys/yyy/xxx yyy:代表这个设备的目录 xxx:代表这个驱动设备的各种属性,我们可以直接操控属性来控制这个设备 比如之前常见的 echo 5 > /sys/led/brightness 直接操作这个属性来更改led的亮度 1 创建设备kobj对象,绑定目录 k…

C语言中不定参数 ... 的语法、函数封装

文章目录Intro语法测试依赖库新函数使用测试&#xff1a;遍历并打印不定参数中的值用两种方式封装函数&#xff1a;对多个int值求和总结Intro 有一天看C代码看到某个方法有这样的定义&#xff1a;在函数形参列表处&#xff0c;有...的写法&#xff0c;就像Java中的不定参数那样…

JDK8 新特性之Stream流方法详解

目录 一&#xff1a;集合处理数据的弊端 二&#xff1a;Stream流式思想概述 小结 &#xff1a; 三&#xff1a;获取Stream流的两种方式 方式1 : 根据Collection获取流 方式2 : Stream中的静态方法of获取流 小结 四&#xff1a;Stream常用方法和注意事项 Stream常用方法…

19. 函数基础知识详解

1. 什么是函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。函数能提高应用的模块性&#xff0c;和代码的重复利用率。之前文章中我们已经使用过python提供的内建函数&#xff0c;比如print()。但你也可以自己创建函数…

【JUC并发编程】线程池及相关面试题 详解

【JUC并发编程】线程池及相关面试题 详解 参考资料&#xff1a; 第十二章 线程池原理 深入浅出Java多线程原理 两道面试题&#xff0c;深入线程池&#xff0c;连环17问 深入理解Java并发编程之线程池、工作原理、复用原理及源码分析 硬核干货&#xff1a;4W字从源码上分析JUC…

Java二叉树OJ题

目录1. 检查两颗树是否相同2. 另一颗树的子树3. 翻转二叉树4. 判断一颗二叉树是否是平衡二叉树4.1 时间复杂度为O(n*n)【从上而下递归】4.2 时间复杂度为O(n)【从下而上递归】5. 对称二叉树6. 二叉树的构建及遍历7. 二叉树创建字符串8. 两个指定节点的最近公共祖先8.1 指定结点…

java入门作业-DAO,读取sql数据库

DAO意思是数据库、访问、对象。有了前后端思想。 需要下载mysql&#xff0c;并下载链接自己设置好密码。可以在navicat等软件链接打开。 材料是jc0122.sql&#xff0c;里面的admin_info是要操作的表。不像上一节需要把数据库文件放到java目录里。数据库只要在本地即可。 一、…

浅析Spring的五大类注解和方法注解

简单的将bean对象存储到Spring容器中&#xff0c;可以使用五大类注解实现&#xff0c;也可以通过Bean方法注解实现。本文重点围绕这几个问题展开&#xff1a;1.为什么需要五大类注解&#xff1f;2.五大类注解之间有没有关系&#xff1f;3.Spring使用五大类注解生成beanName问题…

Linux常见命令 17 - 帮助命令 man,whatis,--help,info,help

目录 1. 查看命令/配置文件帮助信息 man 2. 查看简短的命令帮助信息 whatis 3. 查看简短的命令选项信息 --help 4. 另一查看命令文件帮助信息 info 5. Shell内置帮助命令 help 1. 查看命令/配置文件帮助信息 man [1] 语法&#xff1a;man [命令] 示例&#xff1a;如果想要查…

分享129个ASP源码,总有一款适合您

ASP源码 分享129个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 129个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1dUPOSf1BudsK-bB4FnGXfQ?pwdg3ae 提取码&#x…

黑马2021-8Vue自学笔记hm

黑马2021-8Vue教程学习笔记 文章目录黑马2021-8Vue教程学习笔记代码和笔记不断更新gitee代码仓库地址备用前端gei忽略提交文件webpack的使用初始化包管理配置文件 package.json下载webpack解决问题dependencies 和 devDependencies区别:在项目中配置webpackWebpack 中的默认约定…

python基础——列表推导式

python基础——列表推导式 文章目录python基础——列表推导式一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤一、实验目的 掌握Python数据结构&#xff1a;列表推导式的用法。 二、实验原理 列表推导式&#xff08;list comprehension&#xff09;列表推导式…

【Python百日进阶-Web开发-Linux】Day235 - Win11的WSL2中安装Docker

文章目录一、Docker是什么二、Win11安装Docker2.1 官网下载2.2 系统要求&#x1f517;2.2.1 WSL 2 后端2.2.2 Hyper-V 后端和 Windows 容器2.2.3 关于 Windows 容器2.3 在 Windows 上安装 Docker Desktop2.3.1 交互式安装2.3.2 从命令行安装2.4 启动 Docker 桌面三、WSL2的Ubun…

ConcurrentHashMap的死循环问题

文章目录前言1. 情景复现2. 源码解析3. 代码调试4. 原因5. 解决前言 对于ConcurrentHashMap来说&#xff0c;能保证多线程下的安全问题&#xff0c;但是在JDK1.8中还是会出现一个bug&#xff0c;就是computeIfAbsent&#xff0c;下面就来详细说说死循环的原因 1. 情景复现 首…

进阶C语言 第二章-------《进阶指针》 (指针数组、数组指针、函数指针、回调指针)知识点+基本练习题+深入细节+通俗易懂+完整思维导图+建议收藏

绪论 书接上回&#xff0c;通过对数据类型进阶的认识&#xff0c;你肯定对各种数据类型在内存中如何存储有了了解。虽然说&#xff0c;这方面可能对你的编程能力没什么进步。但是&#xff0c;他是一本内功秘籍&#xff0c;当我们遇到了这方面的问题时我们可以知道可能是哪一方面…

使用 Grafana 请求API接口

目的: 使用Grafana 配合JSON API 插件 请求API接口,完成可视化,实现一些简单的请求功能 假设我们想将如下的API接口返回的json数据可视化 这里借用一下 小熊同学的 金融数据接口 用请求如下接口举例 https://api.doctorxiong.club/v1/fund/detail?code000001&startDat…

色环电容读数方法要点总结

🏡《电子元器件学习目录》 目录 1,概述2,读数方法3,颜色对照表3.1,颜色与电容值数字对照关系表3.2,颜色与10的指数数字对照关系表3.3,颜色与误差对照关系表4,总结1,概述 本文简单介绍色环电容的读数方法。 2,读数方法 如下图所示色环电容共有四个色环。最粗的被命名…

36.Isaac教程--复合消息

复合消息 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录复合消息测量类型使用复合消息的示例手臂关节速度基本轨迹命令手臂关节和末端执行器命令CompositeMetric 和 CompositeAtlas组件使用 CompositeMetric 计算距离在 Python 脚本中创…