深度学习论文代码研读系列(1)Transformer:Attention Is All You Need

news2024/11/20 8:31:40

目录

摘要

1 引言

2背景

3模型架构

3.1编码器和解码器堆栈编码器:

3.2 Attention

 3.2.1 Scaled Dot-Product Attention

3.2.2多头注意力

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

3.3位置前馈网络

3.4嵌入和Softmax

3.5位置编码

4为什么自注意力

5 Training 6Result

 7 结论


摘要

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

1 引言

循环神经网络、长短期记忆 [13] 和门控循环单元 [7] 神经网络,特别是已被牢固确立为序列建模和语言建模和机器翻译等转导问题[35,2,5]。此后,许多努力继续推动循环语言模型和编码器-解码器架构的边界[38,24,15]。

循环模型通常沿输入和输出序列的符号位置分解计算。将位置与计算时间的步骤对齐,它们生成一系列隐藏状态 ht作为先前隐藏状态 ht-1 和位置 t 的输入的函数。这种固有的顺序性质排除了训练示例中的并行化,这在更长的序列长度下变得至关重要,因为内存限制限制了示例之间的批处理。最近的工作通过分解技巧 [21] 和条件计算 [32] 实现了计算效率的显着改进,同时还提高了后者情况下的模型性能。然而,顺序计算的基本约束仍然存在。注意力机制已成为各种任务中引人注目的序列建模和转导模型的一个组成部分,允许对依赖关系进行建模,而不考虑它们在输入或输出序列中的距离 [2, 19]。然而,除了少数情况 [27],这种注意力机制与循环网络结合使用。在这项工作中,我们提出了 Transformer,这是一种避免递归的模型架构,而是完全依赖于注意力机制来绘制输入和输出之间的全局依赖关系。Transformer 允许更多的并行化,并且可以在 8 个 P100 GPU 上训练多达 12 小时后在翻译质量上达到新的技术水平。

2背景

减少顺序计算的目标也构成了扩展神经 GPU [16]、ByteNet [18] 和 ConvS2S [9] 的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数量随着位置之间的距离而增加,对于 ConvS2S 是线性的,对于 ByteNet 呈对数增长。这使得学习远距离位置之间的依赖关系变得更加困难[12]。在 Transformer 中,这减少到恒定数量的操作,尽管由于平均注意力加权位置而导致有效分辨率降低,但我们使用多头注意力来抵消这种影响,如第 3.2 节所述。自注意力,有时称为内部注意力,是一种注意力机制,将单个序列的不同位置关联起来,以计算序列的表示。自注意力已成功用于各种任务,包括阅读理解、抽象摘要、文本蕴涵和学习任务无关的句子表示 [4, 27, 28, 22]。端到端记忆网络基于循环注意机制而不是序列对齐递归,已被证明在简单的语言问答和语言建模任务中表现良好[34]。然而,据我们所知,Transformer 是第一个完全依赖自注意力来计算输入和输出表示而不使用序列对齐的 RNN 或卷积的转换模型。在以下部分中,我们将描述 Transformer,激发自注意力并讨论其相对于 [17, 18] 和 [9] 等模型的优势。

3模型架构

大多数竞争性神经序列转导模型具有编码器-解码器结构 [5, 2, 35]。在这里,编码器映射符号表示的输入序列 (x1,..., xn) 到一系列连续表示 z = (z1,..., zn)。给定 z,解码器然后生成一个输出序列 (y1,..., ym) 一次一个元素的符号。在每一步,模型都是自回归的 [10],在生成下一个时将先前生成的符号作为附加输入。Transformer 遵循这种整体架构,使用编码器和解码器的堆叠自注意力和逐点全连接层,分别如图 1 的左半和右半所示

3.1编码器和解码器堆栈编码器:

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

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

3.2 Attention

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

 3.2.1 Scaled Dot-Product Attention

为什么使用点积注意力?

为什么缩放1√dk

我们将我们的特定注意力称为“Scaled Dot-Product Attention”(图 2)。输入由维度 dk 的查询Q和键K以及维度 dv 的值V组成。我们计算查询Q与所有键K的点积,将每个键除以 √dk,并应用 softmax 函数来获得值的权重。在实践中,我们同时计算一组查询的注意力函数,打包成一个矩阵 Q。键和值也打包到矩阵 K 和 V 中。我们计算输出矩阵为:

最常用的两个注意力函数是加性注意力 [2] 和点积(乘法)注意力。点积注意力与我们的算法相同,只是比例因子为 1√dk。加性注意使用具有单个隐藏层的前馈网络计算兼容性函数。虽然两者在理论上的复杂性相似,但点积注意力在实践中要快得多,空间效率更高,因为它可以使用高度优化的矩阵乘法代码来实现。虽然对于较小的 dk 值,这两种机制的表现相似,但加性注意力优于点积注意力,而不会缩放较大的 dk 值 [3]。我们猜测对于较大的dk值,点积的幅度较大,将softmax函数推入梯度极小的区域4。为了抵消这种影响,我们将点积缩放1√dk。

3.2.2多头注意力

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

多头注意力允许模型共同关注不同位置的不同表示子空间的信息。使用单个注意力头,平均会抑制这一点。

MultiHead(Q, K, V ) = Concat(head1,..., headh)W O 其中 headi = Attention(QW Q i , KW K i , V W V i ) 其中投影是参数矩阵 W Q i ∈ Rdmodel×dk , W K i ∈ Rdmodel×dk , W V i ∈ Rdmodel×dv 和 W O ∈ Rhdv ×dmodel。在这项工作中,我们使用 h = 8 个并行注意力层或头部。对于每一个,我们使用k = dv = dmodel/h = 64。由于每个头的维数降低,总计算成本与全维数单头注意相似。

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

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

在“编码器-解码器注意力”层中,查询来自前一个解码器层内存键和值来自编码器的输出。这允许解码器中的每个位置关注输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意机制,如[38,2,9]。

•编码器包含自注意层。在自注意力层中,所有键、值和查询都来自同一个地方,在这种情况下,编码器中前一层的输出。编码器中的每个位置都可以关注编码器前一层的所有位置。

•类似地,解码器中的自注意力层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。我们需要防止解码器中的向左信息流以保留自回归属性。我们通过屏蔽对应于非法连接的 softmax 的输入中的所有值(设置为 -∞)来实现这种缩放点积注意力的内部。参见图 2。

3.3位置前馈网络

除了注意子层外,编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别和相同地应用于每个位置。它由两个线性变换组成,中间有一个 ReLU 激活。FFN(x) = max(0, xW1 + b1)W2 + b2 (2) 虽然线性变换在不同的位置是相同的,但它们使用了从层到层的不同参数。另一种描述的方法是核大小为1的两个卷积。输入和输出的维度是dmodel = 512,内层的维度df f = 2048.

3.4嵌入和Softmax

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

3.5位置编码

由于我们的模型不包含递归和没有卷积,为了让模型利用序列的顺序,我们必须注入一些关于序列的相对位置或绝对位置的信息序列中的标记。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了“位置编码”。位置编码具有与嵌入相同的维度 dmodel,以便可以求和两者。位置编码、学习和固定有很多选择[9]。在这项工作中,我们使用不同频率的正弦和余弦函数:

其中 pos 是位置,i 是维度。也就是说,位置编码的每个维度对应一个正弦信号。波长形成从2π到10000·2π的几何级数。我们选择这个函数是因为我们假设它将允许模型轻松学习关注相对位置,因为对于任何固定的偏移 k,PEpos+k 可以表示为 P Epos 的线性函数。我们还尝试使用学习的位置嵌入 [9],并发现两个版本产生了几乎相同的结果(见表 3 行 (E))。我们选择正弦版本,因为它可能允许模型外推到比训练期间遇到的序列长度更长的序列长度。

4为什么自注意力

在本节中,我们将自注意力层的各个方面与通常用于映射一个可变长度的符号表示序列(x1,..., xn) 到另一个长度相等的序列 (z1,..., zn),其中 xi, zi ∈ Rd,例如典型序列转导编码器或解码器中的隐藏层。激发我们对自注意力的使用,我们考虑了三个要求。一是每层的总计算复杂度。另一个是可以并行化的计算量,由所需的最小顺序操作数来衡量。第三个是网络中远程依赖关系之间的路径长度。学习远程依赖关系是许多序列转导任务中的关键挑战。影响学习这种依赖关系的能力的一个关键因素是前向和后向信号必须在网络中遍历的路径的长度。输入和输出序列中任何位置组合之间的这些路径越短,就越容易学习长期依赖关系[12]。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。

如表 1 所示,自注意力层将所有位置与固定数量的顺序执行操作连接起来,而循环层需要 O(n) 顺序操作。在计算复杂度方面,当序列长度 n 小于表示维数 d 时,自注意力层比循环层更快,这通常是最先进模型在机器翻译中使用的句子表示的情况,例如词片 [38] 和字节对 [31] 表示。为了提高涉及非常长的序列的任务的计算性能,自注意力可以仅限于仅考虑大小为 r 的邻域

输入序列以各自的输出位置为中心。这将将最大路径长度增加到 O(n/r)。我们计划在未来的工作中进一步研究这种方法。内核大小为 k < n 的单个卷积层不连接所有输入和输出位置对。这样做需要在连续内核的情况下堆叠 O(n/k) 卷积层,或者在扩张卷积的情况下需要 O(logk(n)) [18],增加网络中任意两个位置之间最长路径的长度。卷积层通常比循环层更昂贵,因子为 k。然而,可分离卷积[6]大大降低了复杂度,为O(k·n·d+n·d2)。然而,即使 k = n,可分离卷积的复杂度也等于自注意力层和逐点前馈层的组合,我们在我们的模型中采用的方法。作为附带好处,self-attention 可以产生更多可解释的模型。我们从我们的模型中检查注意力分布,并在附录中展示和讨论示例。单独的注意力头不仅清楚地学习执行不同的任务,似乎表现出与句子的句法和语义结构相关的行为。

5 Training 6Result

表 2:Transformer 在英语到德语和英语到法语 newstest2014 测试上以训练成本的一小部分实现了比以前的最先进模型更好的 BLEU 分数。

 7 结论

在这项工作中,我们提出了 Transformer,这是第一个完全基于注意力的序列转导模型,用多头自注意力替换了编码器-解码器架构中最常用的循环层。对于翻译任务,Transformer 可以比基于循环或卷积层的架构快得多。在 WMT 2014 英德和 WMT 2014 英法翻译任务上,我们达到了新的技术水平。在前一个任务中,我们最好的模型甚至优于所有先前报告的集成。我们对基于注意力的模型的未来感到兴奋,并计划将它们应用于其他任务。我们计划将 Transformer 扩展到涉及文本以外的输入和输出模式的问题,并研究局部、受限的注意力机制,以有效地处理图像、音频和视频等大型输入和输出。使生成不那么顺序是我们的另一个研究目标。我们用于训练和评估我们的模型的代码可在 https://github.com/tensorflow/tensor2tensor 获得。

下一篇 将对transformer 的代码进行解析

从代码中看实现过程

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

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

相关文章

小红书释放被封手机号 无限注册

前几年抖音也可以释放被封手机号 那时候都不重视 导致现在被封手机号想释放 基本不可能的 或者就是最少几百块 有专业的人帮你通过某些信息差释放 本教程是拆解 小红书被封手机号怎么释放,从今年开始,被封的手机号无法注销了 所以很困扰 那么本教程来…

AI绘画Stable Diffusion 插件篇:智能标签提示词插件sd-danbooru-tags-upsampler

大家好,我是向阳。 关于智能标签提示词插件,在很早之前就介绍过很多款了,今天再给大家介绍一款智能标签提示词插件sd-danbooru-tags-upsampler。该智能提示词插件是今年2月23号才发布的第一版V0.1.0,算是比较新的智能提示词插件。…

Semi-decentralized Federated Ego Graph Learning for Recommendation

论文概况 本文是2023年WWW的一篇联邦推荐论文,提出了一个半去中心化的联合自我图学习框架。 Introduction 作者提出问题 现有的推荐方法收集所有用户的自我图来组成一个全局图,导致隐私风险。联合推荐系统已被提出来缓解隐私问题,但在客户…

【半夜学习MySQL】数据库概念详解探索数据库到底是如何存储的?

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。 🎯每天努力一点点,技术变化看得见 文章目录 什么是数据库主流数据库与数据库分类数据库的基本使用数据库的启动及关闭查看配置文件与数据库存储位置连接数据库服务器服务…

Linux进程——Linux环境变量

前言:在结束完上一篇的命令行参数时,我们简单的了解了一下Linux中的环境变量PATH,而环境变量不只有PATH,关于更多环境变量的知识我们将在本篇展开! 本篇主要内容: 常见的环境变量 获取环境变量的三种方式 本…

[性能优化] ScrollView视图优化为循环列表

问题描述: 原先商城的物品栏中的item 是load在一个scrollView 下,用于滑动查看。仅仅在父级panel下是使用了NGUI原生的scrollview 组件,随着商场物品列表中新物品的增多。panel下加载的实例也非常庞大。而大部分的实例用户也无法看到&#x…

YOLOv5,YOLOv7改进之结合​SOCA

1.SOCA moudle结构图 2,YOLOv5,YOLOv7改进之结合​SOCA 1.配置common.py文件 #SOCA moudle 单幅图像超分辨率 class Covpool(Function):@staticmethoddef forward(ctx, input):x = inputbatchSize = x.data.shape[0]dim = x.data.shape[1]h = x.data.shape[2]w = x.data.sha…

上位机图像处理和嵌入式模块部署(树莓派4b和c++新版本的问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 自己读书的时候是03年,学习c也是差不多04年开始,到现在基本上20年了。这20年过程当中,其实c的语言版本一直是在…

队列 (Queue)

今日励志语句:别总听悲伤的歌,别总想从前的事,别让过去拖住脚,别让未来被辜负。 前言:前面写了一篇 栈的实现,接下来学习一下它的"兄弟" 一、队列的概念: 队列: 也是数据…

nginx代理原理(端口复用)探究

前言:对于一些常用的插件,我们应该学会如何使用。同时,其实现原理也要进行深究,可以为其他的项目开发做借鉴。 探究方案: 一、发布两个不同的服务,这两个服务的端口不致 二、配置nginx,让这两…

JavaScript百炼成仙自学笔记——13

函数七重关之六(“new”一个函数) 看个代码: function hello(){console.log(this); } 1、this:也是JavaScript中的一个关键字,永远指向当前函数的调用者 解释一下,有两层意思: ①this要嘛不出现&#…

从心理学角度看,GPT 对人有什么影响?

开启个性化AI体验:深入了解GPT的无限可能 导言 GPT 与我们日常生活的融合标志着技术进步的重大飞跃,为提高效率和创新提供了前所未有的机遇。然而,当我们与这些智能系统日益紧密地交织在一起时,探索它们对个人产生的细微的心理影响…

康姿百德集团公司官网价格统一,产品编码可查真伪售后有保障

康姿百德床垫,静音设计让你享受安静睡眠环境 随着越来越多的人睡眠质量差,夜间难以入睡,人们开始意识到睡眠问题已经不仅仅是健康问题,更上升为一种社会问题,急需得到解决。作为寝具行业中的优质品牌,康姿…

【Linux】如何定位客户端程序的问题

文章目录 1 客户端程序和服务端程序的差别2 问题类型2.1 崩溃(crash)2.2 CPU高2.3 内存高2.4 线程卡死 3 总结 1 客户端程序和服务端程序的差别 客户端程序是运行在终端上,通常都会与业务系统共存,而服务端程序通常会运行在单独的节点上,或者…

Leetcode—394. 字符串解码【中等】

2024每日刷题&#xff08;131&#xff09; Leetcode—394. 字符串解码 实现代码 class Solution { public:string decodeString(string s) {string curstr;int curNum 0;stack<pair<string, int>> st; for(char c: s) {if(isdigit(c)) {curNum curNum * 10 (c…

污水处理设备集中管理

在环境保护日益成为社会发展重中之重的今天&#xff0c;污水处理设备的有效管理显得尤为关键。传统的管理方式往往存在效率低下、响应不及时等问题&#xff0c;难以满足现代污水处理的需求。而HiWoo Cloud平台的污水处理设备集中管理系统&#xff0c;以其高效、智能的特点&…

python代码无法点击进入,如何破???

python代码无法点击进入&#xff0c;如何破&#xff1f;&#xff1f;&#xff1f; 举个栗子&#xff1a; model.chat是无法进入的&#xff0c;这时可以使用如下的命令进行操作&#xff1a; ?model.chat

Linux migrate_type进一步探索

文章接着上回Linux migrate_type初步探索 1、物理页面添加到buddy系统 我们都知道物理内存一开始是由memblock进行分配管理&#xff0c;后面会切换到buddy系统管理。那么接下来我们看一下&#xff0c;memblock管理的物理页面是怎么添加到buddy系统中的。 start_kernel() -&g…

【数据库原理及应用】期末复习汇总高校期末真题试卷06

试卷 一、选择题 1&#xff0e; ________是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 1&#xff0e; 有12个实体类型&#xff0c;并且它们之间存在15个不同的二元联系&#xff0c;其中4个是1:1联系类型&#xff0c;5…