Transformer 论文重点

摘要

提出了一个 Transformer 模型,针对于一个机器翻译的小任务上表现结果比当时所有模型的效果都好,并且架构相比其它更加简单,后面就火到了发现什么方向都能用的地步。

介绍

循环神经网络,特别是长短时记忆[ 13 ]和门控循环[ 7 ]神经网络,已经成为诸如语言建模和机器翻译[ 35、2、5]等序列建模和转录问题中最先进的方法。

当时是 2017 年,因此 RNN 循环神经网络占据主流。

自那时以来,大量的努力一直在推动循环语言模型和编码器-解码器架构[ 38、24、15]的界限。

递归模型通常沿着输入和输出序列的符号位置进行因子计算。将位置与计算时间中的步骤对齐,它们生成一个隐藏状态序列ht,作为前一个隐藏状态ht - 1和位置t的输入的函数。这种固有的顺序特性排除了训练示例中的并行化,这在较长的序列长度时变得至关重要,因为内存约束限制了跨示例的批处理

这里主要讲了 RNN 的特点是什么,以及其缺点是什么。
在 RNN 里面给到一个序列,其计算方式是把这个序列从左到右一步一步的往前做,假设一个序列是一个句子的话,其计算就是一个词一个词的看,对于第 t 个词,它会计算一个输出叫 Ht,Ht 也被称为隐藏状态,然后它的 Ht 是由前面一个词的隐藏状态叫 Ht-1 和当前第 t 个词本身决定的,这样子它就可以把前面学习到的历史信息通过 Ht-1 放到当下,然后和当前的词做一些计算然后得到输出。这也是RNN如何能够有效处理时序信息的一个关键之所在。
但这也是 RNN 的问题所在,第一个问题是因为其是时序计算的方式,这难以并行,计算效率低下。
第二个问题则是因为历史信息是一步一步往后传递的,如果时序比较长的话,那么在很早期的那些时序信息在后面的时候可能会被丢弃,如果不想丢掉那么就得要让 Ht 比较大,那么内存开销就会很大。

最近的工作通过因式分解技巧[ 21 ]和条件计算[ 32 ]在计算效率方面取得了显著的改进,同时也提高了后者的模型性能。然而,顺序计算的基本约束依然存在。

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

在这项工作中,我们提出了Transformer,一种不再使用循环神经网络的模型架构,而完全依靠注意力机制来绘制输入和输出之间的全局依赖关系。Transformer允许显著更多的并行化,并且在8个P100 GPU上经过短短12小时的训练后可以达到翻译质量的新境界。

背景

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

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

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

然而,据我们所知,Transformer是第一个完全依靠自注意力计算其输入和输出表示的转录模型,而不使用序列对齐的RNN或卷积。在下面的部分中,我们将描述Transformer,激发自注意力,并讨论它相对于[ 17、18]和[ 9 ]等模型的优势。

网络架构(重点)

大多数竞争性神经序列转录模型都有一个编码器-解码器结构[ 5、2、35]。在这里,编码器将符号表示的输入序列( x1 , … , xn)映射到连续表示的序列z = ( z1 , … , zn)。

假设是一个句子的话,有 n 个词的话,那么 Xn 就表示第 n 个词,而编码器的作用就是将这个句子序列表示为一个长度也为 n 的但是其中的每一个元素都是对应的 Xn 的一个向量表示,即 Zn。Zn 就表示第 n 个词的一个向量的表示,这便是编码器的输出。

给定z,解码器然后生成一个输出序列( y1 , … , ym)的符号一次一个元素。在每一步,模型都是自回归的[ 10 ],在生成下一个符号时,消耗先前生成的符号作为额外的输入。

对于解码器来说,其会拿到编码器的输出,然后会生成一个长为 m (m可能等于n 也可能不等于 n,比如英文翻译成中文就很可能两个句子不一样长)的一个序列 Y,它跟编码器不一样的地方在于在解码器中,其词是一个一个生成的(对于编码器来说,其很有可能是一次性能看全整个句子,而在解码的时候只能一个一个生成),这个东西就叫做一个自回归,即 auto-regressive 的一个模型。
什么意思?
比如在最开始给定向量序列 Z,生成第一个输出是 Y1,在拿到 Y1 之后,就可以继续生成 Y2,因此如果要生成 Yt 的话,就应该要把之前所有的 Y1 到 Yt-1 全部拿到,也就是说在翻译的时候是一个词一个词的往外蹦,在过去时刻的输出也会作为当前时刻的输入,所以这个叫做自回归。

Transformer遵循这种整体架构,编码器和解码器都使用堆叠的自注意力和逐点全连接层,分别如图1的左半部分和右半部分所示。

在这里插入图片描述

编码器和解码器堆栈

Encoder

编码器由N = 6个相同层的堆栈组成(也就是 6 个相同的Encoder模块)。每层有两个子层(即上面一个Encoder模块中的两个部分)。第一种是多头自注意力机制,第二种是简单的位置全连接前馈网络(说白了就是一个MLP,即几个全连接层的简单堆叠而已)。我们在两个子层的每一个周围使用一个残差连接[ 11 ],然后进行层规一化[ 1 ]。也就是说,每个子层的输出是LayerNorm( x +子层( x) ),其中子层( x )是子层本身实现的函数。为了便于这些残差连接,模型中的所有子层以及嵌入层都会产生维数dmodel = 512的输出

残差连接需要输入和输出是一样大小,如果不一样大小的话就得做投影,因此为了简单起见,本文就把每一个层它的输出的维度变成了 512 。
因此对于这个模型调参也是好调的,就是两个参数,一个是总共有多少层的编解码器,而另一个就是这个 dmodel ,也就是维度输出。

LayerNorm和BatchNorm的抉择问题

BatchNorm是什么:

在这里插入图片描述

mini-batch是什么:

在这里插入图片描述

LayerNorm是什么:

在这里插入图片描述
为什么在Transformer中使用layerNorm而不是batchNorm:

在这里插入图片描述

Decoder

解码器也是由N = 6个相同层的堆栈组成。除了每个编码器层中的两个子层之外,解码器还插入第三个子层,它对编码器堆栈的输出执行多头注意力。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改解码器堆栈中的自注意力子层,以防止位置出现在后续位置。这种掩蔽,结合输出嵌入被一个位置抵消的事实,保证了对位置i的预测只能依赖于小于i位置的已知输出

因为在解码器的时候做的是一个自回归,也就是说当前的输出的输入集是上面一些时刻的输出,意味着是说在做预测的时候,模型当然不能看到之后的那些时刻的输出,但是在注意力机制里面,它每一次能看到整个完整的输入,所以这个地方要避免这个情况发生,也就是说在解码器训练的时候,在预测第 t 个时刻的输出的时候不应该看到 t 时刻以后的那些输入,而做法就是通过一个带掩码的注意力机制。

Attention

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

不同的注意力机制有不同的算法。
假设现在有三个value和三个对应的key:
在这里插入图片描述
假设现在给一个query,这个query跟第一个和第二个key比较近,那么输出就是这三个value的相加,但是query离得近的第一个key和第二个key这两个key的权重会大一下,而第三个key的权重因为隔得远所以就会小一些(下图黄色部分):
在这里插入图片描述
因为这个权重是等价于query和对应key的相似度的。
同样道理,假设又有一个query,但是他是跟最后那一个key比较像的话,那么这样子再去算输出value值的时候,就会发现其对后面分配的权重会更高一些(下图绿色部分):
在这里插入图片描述
此时就会得到一个新的输出,虽然key、value并没有变,但是随着 query 的改变,因为权重分配不一样,导致最后的输出会不一样,这就是注意力机制。

在这里插入图片描述

上图的缩放点积注意力机制图示中的 MaxMul 的意思是做矩阵乘法嗷。

Scaled Dot-Product Attention(缩放点积注意力)

因为不同的相似度函数导致不一样的注意力的版本,所以接下来这一章讲的就是 Transformer 自己用到的一个注意力计算函数。

我们称我们的注意力为"缩放点积注意力" (图2 )。输入由维度dk的查询和键以及维度dv的值组成。我们用所有键计算查询的点积,除以√dk,并应用一个softmax函数来获得值的权重。

意思是 query 和 key的长度是等长的,都等于 dk,然后value的值是 dv,那么输出同样也就是 dv。
具体计算是对于每一个query 和 key 做内积,然后将其作为相似度。
如果两个向量的long是一样的,那么内积值越大(也就是余弦值),那么就表示这两个向量的相似度越高。
如果内积为0了,那就等于是两个向量正交了,那就是没有相似度。
算出来之后再除以根号dk,也就是向量的长度,最后再用一个softmax来得到权重。
假设给一个 query,然后有 n 个key-value pair的话,那么就会算出 n 个值(query会跟每个key做内积)。算出来之后再放进softmax就会得到n个非负的而且加起来等于1的一个权重,然后这些权重作用在value上面就可以拿到最后的输出了。
在实践中肯定不能这么一个个算,因此下面给出了一种在实际中进行计算的方式。

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

在这里插入图片描述

两个最常用的注意力函数是加性注意力[ 2 ]和点积(乘性)注意力。点积注意与我们的算法相同,除了缩放因子1√dk。加性注意力使用具有单隐层的前馈网络计算相容性函数。虽然两者在理论复杂度上相似,但点积注意力在实际应用中速度更快,空间效率更高,因为它可以使用高度优化的矩阵乘法代码实现

而对于较小的dk值,两种机制的表现类似,对于较大的dk值,相加注意力优于不缩放的点积注意力[ 3 ]。我们猜想,对于dk的大值,点积的大小会变大,从而将softmax函数推到梯度极小的区域4。为了抵消这种影响,我们对点积进行1√dk的缩放

Multi-Head Attention

与使用dmodel-dimensional键、值和查询执行单一的注意力函数不同,我们发现将查询、键和值h次线性投影到dk、dk和dv维度分别是有益的。在这些查询、键和值的每个投影版本上,我们然后并行执行注意力函数,生成dv维输出值。这些被串联起来并再次投影,得到最终值,如图2所示。

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

在这里插入图片描述

在这里插入图片描述

其中,投影为参数矩阵W Qi∈Rdmodel × dk,W Ki∈Rdmodel × dk,W Vi∈Rdmodel × dv和W O∈Rhdv × dmodel。

在这项工作中,我们采用h = 8个平行的注意层,或头。对于每一个,我们使用dk = dv = dmodel / h = 64。由于每个头的维度降低,总的计算成本与全维度的单头注意力相似。

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

Transformer以三种不同的方式使用多头注意力:

1、在"编码器-解码器注意力"层中,查询来自前面的解码器层,而内存键和值来自编码器的输出。这使得解码器中的每个位置都可以参与输入序列中的所有位置。这模仿了序列到序列模型(如[ 38、2、9] )中典型的编码器-解码器注意力机制。

2、编码器包含自注意力层。在一个自注意力层中,所有的键、值和查询来自同一个地方(这就叫自注意力机制),在这种情况下,编码器中前一层的输出。编码器中的每个位置可以参与到编码器前一层的所有位置。

3、同样,解码器中的自注意力层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。我们需要在解码器中阻止向左的信息流动以保持自回归特性。我们通过屏蔽softmax输入中与非法连接相对应的所有(设置为-∞)值来实现缩放点积注意力的内部。见图2。

位置明智的前馈网络

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

在这里插入图片描述

虽然线性变换在不同位置上是相同的,但它们使用不同的参数。描述这一点的另一种方式是两个核大小为1的卷积。输入输出的维数dmodel = 512,内层的维数dff = 2048。

Embeddings and Softmax

与其他序列转导模型类似,我们利用学习到的嵌入将输入和输出的标记转换为d维向量。我们还使用通常学习的线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。在我们的模型中,我们在两个嵌入层和pre - softmax线性变换之间共享相同的权重矩阵,类似于[ 30 ]。在嵌入层中,我们将这些权重乘以√dmodel。

在这里插入图片描述

位置编码

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

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

在这里插入图片描述

其中pos为位置,i为维度。也就是说,位置编码的每个维度对应一个正弦曲线。波长从2 π到10000 · 2 π形成几何级数。我们选择了这个函数,因为我们假设它可以让模型很容易地学习相对位置,因为对于任何固定的偏移k,P Epos + k可以表示为P Epos的线性函数。

我们还使用学习到的位置嵌入[ 9 ]进行了实验,发现两个版本产生了几乎相同的结果(见表3行( E )) )。我们选择了正弦版本,因为它可以使模型外推到比训练过程中遇到的序列长度更长的序列

结论

在这项工作中,我们提出了Transformer,第一个完全基于注意力的序列转录模型,用多头自注意力替换编码器-解码器架构中最常用的循环层。

对于翻译任务,Transformer可以比基于循环或卷积层的架构更快地进行训练。在WMT 2014英语-德语和WMT 2014英语-法语翻译任务中,我们实现了新的技术状态。在前一个任务中,我们最好的模型甚至优于以前报告的所有集合。

我们对基于注意力的模型的未来感到兴奋,并计划将它们应用于其他任务。我们计划将Transformer扩展到涉及文本以外的输入和输出模式的问题,并研究本地的、受限制的注意力机制,以有效地处理图像、音频和视频等大型输入和输出。使生成的序列更少是我们的另一个研究目标。

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

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

相关文章

kafka-消费者-指定offset消费(SpringBoot整合Kafka)

文章目录 1、指定offset消费1.1、创建消费者监听器‘1.2、application.yml配置1.3、使用 Java代码 创建 主题 my_topic1 并建立3个分区并给每个分区建立3个副本1.4、创建生产者发送消息1.4.1、分区0中的数据 1.5、创建SpringBoot启动类1.6、屏蔽 kafka debug 日志 logback.xml1…

nginx动静分离和反向代理

一、动静分离 动静分离指的是将动态内容和静态内容分开处理。动态内容通常由后端应用程序生成,例如PHP、Python或Node.js,静态内容则包括图片、CSS、JavaScript等文件。 例子: #代理服务器一 server{listen 80;server_name www.dj.com;r…

夏季高温来袭|危化品如何安全储存?

《危险化学品安全管理条例》第三条 本条例所称危险化学品,是指具有毒害、腐蚀、爆炸、燃烧、助燃等性质,对人体、设施、环境具有危害的剧毒化学品和其他化学品。 随着夏天高温的来袭,炎热的天气对危化品储存威胁巨大,危化品事故也…

【C++课程学习】:C++入门(输入输出,缺省参数)

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🍩1.关于C输入输出: 🍩2.缺省参数函数: 缺省参数的概…

聊聊大模型微调训练全流程的思考

前言 参考现有的中文医疗模型:MedicalGPT、CareGPT等领域模型的训练流程,结合ChatGPT的训练流程,总结如下: 在预训练阶段,模型会从大量无标注文本数据集中学习领域/通用知识;其次使用{有监督微调}(SFT)优化…

TensorBoard在pytorch训练过程中如何使用,及数据读取问题解决方法

TensorBoard 模块导入日志记录文件的创建训练中如何写入数据如何提取保存的数据调用TensorBoard面板可能会遇到的问题 模块导入 首先从torch中导入tensorboard的SummaryWriter日志记录模块 from torch.utils.tensorboard import SummaryWriter然后导入要用到的os库&#xff0…

方案设计|汽车轮胎数显胎压计方案

一、引言 数显轮胎胎压计是一个专门测量车辆轮胎气压的工具,它具有高精度测量的功能,能够帮助快速准确获取轮胎气压正确数值,保证轮胎使用安全。本文将对数显轮胎胎压计的方案技术进行分析,包括其基本原理、硬件构成、软件设计等方…

架构学习:什么是业务架构图?如何画业务架构图?

6.1~6.18,艾威618年中大促,钜惠来袭!想报课但还没下手的小伙伴,都可以行动起来啦!活动规则还是一如既往的简单、粗暴——直接立减、返现、抽奖以及送礼品!了解活动详情,请点击这里》》 业务架构…

实验9 浮动静态路由配置

--名称-- 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 浮动静态路由也是一种特殊的静态路由,主要考虑链路冗余。浮动静态路由通过配置一条比主路由优先级低的静态路由,用于保证在主路由失效的情况下,…

代码随想录 day27|day28|day29

回溯2 切割问题:是在每个节点判断是否是要剪枝收割元素。 startidx 是切割起点,i是本次切割终点 分割回文串 复原ip地址 非递减子序列 都是在树的节点依照题意判断,之后决定是否剪枝。 也就是都有if判断来剪枝 。 下面是非递减子序列。 下…

前端将xlsx转成json

第一种方式,用js方式 1.1先安装插件 万事都离不开插件的支持首先要安装两个插件 1.2. 安装xlsx cnpm install xlsx --save注:这块我用的cnpm,原生的是npm,因为镜像的问题安装了cnpm,至于怎么装网上一搜一大堆 1.3安…

用langchain搭配最新模型ollama打造属于自己的gpt

langchain 前段时间去玩了一下langchain,熟悉了一下大模型的基本概念,使用等。前段时间meta的ollama模型发布了3.0,感觉还是比较强大的,在了解过后,自己去用前后端代码,调用ollama模型搭建了一个本地的gpt应用。 核心逻辑 开始搭…

Vue 封装elementUI的el-popover

1.封装公共组件 <template><div class"confirm-popover disInlineBlock ml10"><el-popover placement"bottom" v-model"visible" :trigger"triggerType"><div class"confirm-popover-popover"><…

vue3中进度条上加高亮圆点

实现效果 小圆点基于进度条定位&#xff08;left&#xff09;。 实现代码 <template><!-- 这块代码实现的功能&#xff1a;progressData遍历的年份进度数组&#xff0c;展示每年完成的进度--><ul><li v-for"(item, index) in progressData" :k…

Unity VR 零基础开发之 Pico4 MR

一、新建Unity2021.3.37 3D工程 二、切换到Android安卓平台 1、点击Unity编辑器左上角的Flie后&#xff0c;选择Build Setting选项。 2、弹出弹窗后&#xff0c;点击Android选项&#xff0c;然后再点击Switch Platform按钮切换成安卓平台。 3、切换完成后Android选项后面会显示…

3. QGis二次开发项目实践一之解决“无法定位程序输入点“

前言 本章讲述实现本项目实现过程中遇到的QGis二次开发库版本和Qt以及其他动态库的版本匹配问题问题复现 本项目是要作为一个子模块集成到用户的项目中本项目最初的开发环境为QGis3.28+Qt5.15.2,而当时并未问清楚用户开发环境所以交付给用户之后,出现了类似下图的问题 出现该…

AI论文:一键生成论文的高效工具

说到这个问题&#xff0c;那真的得看你对“靠谱”的定义是怎样的啦&#xff1f; 众所周知&#xff0c;写论文是一项极其耗时间的事情&#xff0c;从开始的选题到文献资料搜索查阅&#xff0c;大纲整理等等一大堆的繁杂工作是极艰辛的。用AI写论文就不一样了&#xff0c;自动化…

php7.3安装phalcon扩展

php7安装3.4版本的phalcon扩展 适用于Centos6.x和Centos7.x系统&#xff0c;php使用7.1版本&#xff0c;wlnmp一键包已支持该扩展 phalcon扩展包地址&#xff1a;https://github.com/phalcon/cphalcon &#xff08;git clone 有可能连接不上&#xff09; 1、安装所需依赖&a…

Linux Kernel nf_tables 本地权限提升漏洞(CVE-2024-1086)

文章目录 前言声明一、netfilter介绍二、漏洞成因三、漏洞危害四、影响范围五、漏洞复现六、修复方案临时解决方案升级修复方案 前言 2024年1月&#xff0c;各Linux发行版官方发布漏洞公告&#xff0c;修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞&#xff08;CVE-…

基于语音识别的智能电子病历(其他)CC、HPI、ROS案例分析

门诊使用基于语音识别的智能电子病历相对要少一些。很多系统的门诊系统包含了丰富的模版&#xff0c;美国退伍军人医院在非常早的时候&#xff08;2010年之前&#xff09;就通过使用大量的模版来进行处理门诊的数据录入。下面分析中的截图也是来自一些美国退伍军人医院的系统。…