transformer架构详细详解

一、transformer的贡献

transformer架构的贡献:该架构只使用自注意力机制,没有使用RNN或卷积网络。且可以实现并行计算,加快模型训练速度。

(将所有的循环层全部换成:multi-headed self-attention)

二、transformer架构

当前序列模型中编码器和解码器架构的效果会更好(encoder-decoder)。

1、编码器定义:

编码器会将一个输入(x1,x2,x3,x4....xn)的一个序列,表示为一个长度为n的序列(z1,z2,z3,z4...zn),其中每一个zt,表示的是xt的一个向量。若该序列为一个句子,则第xt就表示第xt个词。则zt就表示第t个词的向量表示。综上就是编码器的输出。

(通过这样的转换,就可以将用户的输入转换为向量表示,使得模型能够正确的处理)

2、解码器的定义:

解码器会拿到编码器的输出,然后会生成一个长为m(y1,y2,y3,....ym)的一个序列,需要注意的是:n和m可能是不一样长的。如:在将中文句子翻译成英文句子的时候,两种语言的长度可能是不一样的。

3、编码器和解码器的差异:

对于编码器而言:在生成对应的序列的时候,可能是一次性全部生成的。 但在解码器中,解码器生成序列的时候是一个一个元素生成的。这个过程叫做自回归(auto-regressivet)的一个模型。

4、自回归概念的解释

在一个模型中,你的输入又是你的输出。

实际举例:比如在一个实际的序列模型中,你想模型输入了一句话,经过编码器的处理,变成了一个向量序列z(z1,z2,z3....zn),然后将这个向量序列逐个传递给解码器,解码器得到z1后,根据z1就会得到y1;然后根据自回归原理,y1预测得到y2,y2预测y3,依次类推,就可以得到yn。

5、transformer与encoder-decoder之间的联系

transformer是使用了一个编码器和解码器的架构。更具体的解释为:transformer是将一些注意力和point-wise fully connected layers,一个一个堆在一起的。

既然是讲解transformer架构,那怎么能少了论文中的transformer架构图:

简单解释一下:

我们可以发现这个架构是有两个部分构成,分别是左边的编码器和右边的解码器。然后在编码器的下方,接收一个用户输入。 在解码器的下方,也有一个解码器输入,但是这个输入是比较特殊的,我们细看这个架构图,可以发现解码器的输入并不是input,而是output。其实这是因为在做预测的时候,解码器的输入其实就是编码器的输入。所以这是output,表示是的编码器的输出。然后解码器的输入是一个一个往后或往右移动的。

图中的左边N表示编码器这个整体有N个叠加在一起,右边的N作用雷同。

然后左边编码器的输出作为右边解码器的输入。

6、transformer中编码器的深入讲解

编码器是用n等于六个一样的层(layer),即transformer架构图中的编码器。每个layer中有两个子层(sub-layers)。第一个sub-layer叫做multi-head self-attention。第二sub-layer叫做position-wise fully connected feed-forwad network。对于每个子层,采用了残差连接。最后再使用一个layer notmalization。因为在编码器中使用了残差连接,且残差网络的需求是:输入和输出是一样的大小,如果输入和输出大小不一样,则需要进行投影。所以为了简单起见,论文中奖每一个层的输出的维度变为512,也就是说对一个词,不管是在那一层,就将该词对应的向量表示为512维。

正式基于上述的简单网络设计:

使得该架构可以通过调整n和每一层输出的长度维数这两个参数。

7、transformer中解码器的深入 理解

解码器的构成和编码器很像,也是n为6的同样的层构成。每个层中都有两个子层。但是不同的是:编码器中使用了第三个子层,该层同样是一个多头注意力机制,layer notmalization。在解码器中进行的是自回归预测。所以在训练解码器进行预测时候,不应该让解码器看到预测后的结果。

但是在注意力机制里面,可以看到完整的输入,这样就不能达到预测的效果。因此transformer的解决方法是:通过一个带掩码的注意力机制,这样做的目的是:当我们要让模型预测t时刻对应的结果时,模型不能知道t时刻以后的内容。这样就可以达到一个预测的效果。

三.transformer注意力相关知识介绍

1、transformer中注意力定义

注意力函数:是将query和一些关键值(key value)对,映射成一个输出(output)的一个函数。函数涉及到的query、key value 和output都是一些向量。

具体来说注意力机制的输出output是:value的一个加权和。所以这也说明了输出的维度是和value的维度是一样的。

既然output是value的加权和,那么权重是怎么计算得到?

权重是根据key和query的相似度进行计算的。

2、transformer中单个注意力的计算过程(scaled dot-product attention)

transformer中将注意力的计算过程叫做:缩放的点积注意力(scaled dot-product attention)。

这种计算注意力的方法query和key它的长度是等长的,都等于dk。value是dv。

具体的理论计算过程是:将每一个query和key做累积,可以简单的认为是两个向量做“点积”运算。然后再将累积的结果除以根号dk,然后再用一个softmax函数对处理后的结果进行运算得到该query的权重。然后将得到的权重作用到v中就得到输出。

实例的注意力计算过程:刚刚解释了注意力的计算过程,我们发现一个问题,如果我们仅仅是一个query,一个query的计算。则计算的速度是比较慢的。所以在实际计算注意力机制的时候:我们是将query写成一个矩阵(包含n个query),将key写成一个矩阵(包含m个key),这里需要注意的是:query的个数不一定等于key的个数。

①query矩阵的解释:

这时query矩阵是由n个长度为dk的向量构成的二维矩阵。

②key矩阵的解释:

这时key矩阵是由m个长度为dk的向量构成的二维矩阵。

当我们得到query的矩阵和key的矩阵,只需要用query的矩阵点积key矩阵的转置,就会得到一个新的n×m的矩阵(此时这个矩阵的每一行就代表着一个query和key的内积值)。然后再将得到的内积值,除以根号下dk,在将除以dk的结果经过softmax函数进行处理。然后将经过softmax处理后的结果乘以v(其中v是一个m行dv列的矩阵),最后的输出结果就是一个n行dv列的矩阵

注意力机制一般有两种:加型注意力机制(用于处理query和key不等长的情况)和点积注意力机制(transformer架构中的注意力机制就是基于这种注意力机制,但是除了一个根号dk),正是因为transformer架构中除以了一个数,所以transformer中的注意力机制叫做缩放点积注意力机制

3、transformer计算注意力的时候除以根号dk的解释

在论文中给出了详细的解释:当dk不是很大的时候(dk是指query和key向量对应的长度),可以不除根号dk。 但是当dk的值比较大时,就表明向量的长度比较大,所以将这两个向量做点积的时候,这些值比较大也可能比较小,这样就会造成计算得到的结果相对差距会变大。从而大致越大的值经过softmax函数处理后,会更加的接近1;越小的值经过softmax函数处理后,就会更加接近0;最终的结果就会使得计算得到的值是在聚集在“0端” 和“1端”这样就是的结果两级分化。这样的效果就会造成梯度消失或梯度爆炸。

transformer中注意力机制的计算图:

4.transformer中多头注意力机制(Multi-Head Attention)的计算过程

在论文中解释多头注意力机制的由来,是将query、key、value投影到一个低维h次,然后做h次的注意力函数。然后将每一个函数的输出并在一起,然后再投影来得到最终的输出。

论文中举出的公式:

通过以上公式我们可以看出:在计算多头注意力的时候,输入还是以前的q、k、v。但是输出是不同的头进行合并起来(concat),投影到wo里面。然后对每个头,通过一个不同的可以学习的wq,wk,wv投影到低维上面。

在论文中使用8个头,因为在计算注意力的时候,有残差连接,所以输出和出入维度至少是一样的。

所以在投影的时候,它投影的就是你的输出的维度除以h

在论文中因为设置的维度为512维,多头数为8,所以投影维度为512/8=64。

5、transformer中使用多头注意力机制的情况

①在编码器中使用,外部输入的信息经过添加位置编码后,转换为向量。然后将向量一分为三:query,value、key。通过多头注意力机制,将n组q,k,v作为输入,就会得到n个输出。在使用多头注意力机制的时候,会学习到n个不一样的距离空间出来,使得输出输出的东西是不一样的。

②在解码器中底部使用:在解码器中的利用和编码器中利用原理是相似的,但是解码器中多出一个掩码机制,这是因为解码器在预测第t个词的时候,是不能看到第t个词后面的信息。所以要将第t个词后的全部词对应的权重为0。

③在解码器的中间使用:需要注意的是:这时的注意力机制不在是自注意力机制(即q,k,v的来源是不一样的)。此时注意力机制输入的key和value是来自编码器的输出。然后query是来自解码器下一个(与transformer中解码器的结构图对应)attention的输入。这个注意力机制的应用,目的是根据在解码器输入的不一样向量,则会根据当前需要计算的向量,在编码器的输出里面去挑出与该变量最相关的东西,进行计算

四、transformer中位置前馈网络(position-wise feed-forward networks)讲解

1、位置前馈网络的简单介绍

位置前馈网络(position-wise feed-forward networks )其实就是MLP(多层感知机)。但是不一样的是把一个MLP对每一个词作用一次,且对每个词作用的是同一个MLP(这就是论文中point wise的意思)。

2、计算公式

公式解释:这个公式中xw1+b1表示一个线性层,然后使用max函数,将线性层的结果与0进行比较,选择较大的数,即表示的一个relu激活函数。然后将relu的结果与w2相乘,加上一个常数b2。从而构成一个新的线性层。

我们知道在论文中,注意力层他的输入:每一个query它对应的哪一个输出,它是长为512,那么就是说公式中的x向量的长度对应就是512,然后论文中的操作根据w1参数,将512投影为2048(即将x向量的维度扩大了四倍)。然后因为position-wise feed-forward networks用到了一个残差连接为了让输出维度和输出维度保持一致,所以会用参数w2将当前长度为2048的向量,投影为长度为512的向量。

五、transformer中Embeddings层 和 Softmax层

①embeddings层:因为我们输出模型的词(token),不能直接被模型识别,所以我们需要将他映射成一个向量(在论文映射成向量后,向量的长度为512)。

②在线性层的前面也需要一个embedding,且权重相同,且将权重乘以根号d(d表示向量对应的长度,论文中d为512)。

六、transformer中位置编码(Positional Encoding)

因为transformer架构中是利用attention提取序列的有效信息。虽然提取到了输入序列的有效信息,但是并不会有时序信息。transformer中解决这个问题方法是将输出序列的内容和时序信息进行结合,作为模型的输入。

论文中给出的计算位置信息的公式:

七、transformer的总结

在transformer中attention起到的作用就是把输入序列的有效信息抓取出来,做一次汇聚得到一个输出结果。此时汇聚得到的结果已经包含了序列中我需要的东西,然后聚合结果传入到位置前馈网络中,经过位置前馈网络的处理将得到的序列信息映射到对应的语义空间的时候,做一个语义转换。

但是在rnn神经网络中,是将输入的序列(x1,x2,..xn),将x1向量经过MLP单独处理后的结果y1,在将y1和下一个序列作为输入计算y2....这样的计算过程就会变慢,而且当输出序列太大时,会出现语义丢失。

下图是沐神画出的transformer和rnn在处理序列上的区别:

课程链接:Transformer论文逐段精读【论文精读】_哔哩哔哩_bilibili

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

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

相关文章

【c语言】声明变量和初始化变量的区别

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

CRMEB 开源/标准版商城系统客服配置教程

管理后台/设置/系统设置/商城配置/客服端配置 有系统客服/拨打电话/跳转链接可选,系统客服为系统自带的客服系统,拨打电话为用户点击联系客服为拨打客服电话的方式,跳转链接为可以跳转自己开发的客服系统或者第三方的客服系统或者企业微信的…

Python学习笔记16 - 函数

函数的创建和调用 函数调用的参数传递 函数的返回值 函数的参数定义 变量的作用域 递归函数 斐波那契数列 总结

腾讯EdgeOne产品测评体验—更快更强更安全,安全我选EdgeOne

腾讯EdgeOne产品测评体验—更快更强更安全,安全我选EdgeOne 王婆的瓜可甜? 自 23 年 8 月份 EdgeOne 开放订阅套餐后,腾讯云用户使用 EdgeOne 来为自己网站进行加速和防护的站点数量,呈现爆发式增长趋势。 金融服务业受到的 Web…

基于51单片机的自行车测速里程码表设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机的自行车测速里程码表设计 1. 主要功能:2. 讲解视频:3. 仿真设计4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接: 基于51单片机的自行车测速里程码表设计( proteus仿真程序设计报告原理图讲解视频)…

传销?链动2+1模式 合法合规的商业模式!

大家好,我是吴军,来自一家深耕于软件开发领域的公司,担任产品经理的职务。 今天,我希望与大家共同探讨一个具有深刻意义的话题——链动21模式,并探究其如何有效应对用户留存与复购的挑战。 或许有人会说,链…

leetcode代码记录(回文数

目录 1. 题目:2. 我的代码:小结: 1. 题目: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序&#x…

HTML5 新增语义标签及属性

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍HTML5 新增语义标签及属性💎1 HTML5 新增的块级语义化标签&…

【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左,文本水平的效果

往期回顾 【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件-CSDN博客 【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置-CSDN博客【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框-CSDN博客 【QT入门】Qt自定义控件与样式…

hadoop最新详细版安装教程 2024 最新版

文章目录 hadoop安装教程 2024最新版提前准备工作用户配置安装 SSH Server免密登录设置编辑 SSH server 配置文件配置Java环境查看java 版本验证 环境变量设置安装Hadoop下载hadoop解压hadoop查看hadoop 版本hadoop 配置编辑编辑配置文件core-site.xml编辑配置文件hdfs-site.xm…

数字时代的引领者:揭示Facebook的社交创新

随着信息技术的飞速发展,人们的社交方式也发生了巨大的变化。从最初的互联网聊天室到如今的社交网络平台,我们已经见证了数字社交的不断演变和发展。而随着区块链技术的兴起,Web3时代的到来将为数字社交带来全新的可能性和挑战。本文将探讨社…

Vscode搭建STM32 Keil工程:揭秘高效开发的秘密武器,轻松打造专业级嵌入式项目!

Vscode搭建STM32 Keil工程:揭秘高效开发的秘密武器,轻松打造专业级嵌入式项目! 前言:Visual Studio Code 是一个支持多种语言的源代码编辑器,具备语法高亮、代码补全、重构等功能,并集成了命令行和Git。适…

16.读取指定路径下的txt文档然后合并内容为一个txt文档。

1.题目要求 分别读取路径为 ./middle/phone/base/1_student_0.txt, ./middle/vr/base/1_teacher.txt, ./nearby/phone/base/1_student_0.txt, ./nearby/vr/base/1_teacher.txt, ./outside/phone/base/1_student_0.txt, ./outside/vr/base/1_teacher.txt 里面的文件&#xff…

一维非线性扩展卡尔曼滤波|matlab的EKF程序|一维例程源代码

为了满足不同条件下的用途,编了一个简单的一维状态量下的EKF,后面准备出UKF和CKF的版本。 使用的系统是非线性的,以体现算法对于非线性系统的性能。(状态方程和观测方程均设计成非线性的) 程序运行截图 程序都在一个m文件里面,粘贴到matlab的编辑器就能运行,如果中文注…

项目——boost搜索引擎

今天我们来写一个boost搜索引擎! (后续如果有更新,这个博客也会更新) gitee连接:boost搜索引擎: boost搜索引擎 首先我们要介绍一下我们这个项目,我们项目的目的是通过我们的搜索引擎能够通过关键字查找到对应的网页…

【小迪安全2023】第23天:WEB攻防-Python考点CTF与CMS-SSTI模版注入PYC反编译

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

【JAVA基础篇教学】第十五篇:Java中Spring详解说明

博主打算从0-1讲解下java基础教学,今天教学第十五篇:Java中Spring详解说明。 Spring 框架是一个广泛应用于 Java 开发的轻量级、全栈式的企业应用开发框架,它提供了众多功能强大的模块,用于简化企业级应用程序的开发。下面详细说…

光纤收发器的注意事项

光纤收发器有各种不同的类别,而实际使用中最受关注的是根据光纤收发器的不同类别:SC连接器光纤收发器和FC/ST连接器光纤收发器。 当使用光纤收发器连接到不同的设备时,必须小心使用不同的端口。 1.光纤收发器与100Base TX设备(交…

第二期书生浦语大模型训练营第三次笔记

RAG RAG是什么? RAG(Retrieval Augmented Generation)技术,通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺…

13015.交叉编译移植libz库

文章目录 1 背景2 交叉编译流程2.1 下载源码2.2 编译2.3 测试代码2.4 交叉编译app程序2.5 压缩及效率测试 1 背景 需要再app中使用压缩算法,不能直接移植gzip,gzip交叉编译得到gzip,应该使用libz代码 进行编译生成libz库. 2 交叉编译流程 …