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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode刷题日记之全排列

题目描述 题目解释 这个题类似于之前做的某一道题,其实算法还是要追踪到树的深度遍历,相当于便利叶子节点的路径记录。不过递归的过程就相当于件数根据树进行遍历了。 代码如下 class Solution:def permute(self, nums: List[int]) -> List[List[i…

fiddler常用操作汇总

1、过滤 2、查看数据包内容 3、弱网测试 弱网测试其实就是提前设置好一个值,在这个环境下进行测试就行了。 (1)进入定制规则页面: (2) 点击CtrlF调起搜索,在Find what 中输入300进行查找,更改上行、下行网…

(四)C++自制植物大战僵尸游戏启动流程

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、启动方式 鼠标左键单机VS2022上方工具栏中绿色三角按钮(本地Windows调试器)进行项目启动。第一次启动项目需要编译项目中所有代码文件,编译生成需要一定的时间。不同性能的电…

LPRNet车牌识别模型训练及CCPD数据集预处理

LPRNet车牌识别模型训练及CCPD数据集预处理 1 LPRNet车牌识别模型训练 1.1 源码:LPRNet_Pytorch-master 源码官网:GitHub - sirius-ai/LPRNet_Pytorch: Pytorch Implementation For LPRNet, A High Performance And Lightweight License Plate Recognition Framework. 链…

内网渗透-cobaltstrike之cs上线获取shell

cobaltstrike之cs上线获取shell 文章目录 cobaltstrike之cs上线获取shell前言一、什么是cobaltstrike二、cs上线获取shell 1.环境搭建 CS安装windows连接 2. cs上线获取shell 总结 前言 一、什么是cobaltstrike CobaltStrike是一款渗透测试神器,被业界人称为CS神器…

U盘有很多空间不见,看这篇能不能帮你解决

文章目录 概要整体架构流程 概要 我本来想在u盘上,安装一个ubuntu系统,结果一直安装失败,最后u盘空间还有好多没有了就是显示不出来了 整体架构流程 按住winx,会弹出以下界面 选择磁盘管理 然后会看到 这个就是你的u盘&…

工业物联网网关

在数字化浪潮席卷全球的今天,工业物联网(IIoT)作为连接物理世界与数字世界的桥梁,正在逐渐改变传统工业的面貌。而作为IIoT的核心枢纽,工业物联网网关发挥着至关重要的作用。今天,我们就来深入了解一下工业…

OpenHarmony实战开发-Axios获取解析网络数据。

介绍 本示例介绍使用第三方库的Axios获取GBK格式的网络数据时,通过util实现GBK转换UTF-8格式。该场景多用于需要转换编码格式的应用。 效果图预览 使用说明 直接进入页面就可获取GBK格式的用户名信息并进行解码操作。 实现思路 1.使用第三方库Axios获取网络数据…

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

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

内网渗透-Windows内网渗透

内网渗透-Windows内网渗透 文章目录 内网渗透-Windows内网渗透前言一、信息收集 1.1、SPN1.2、端口连接1.3、配置文件1.4、用户信息1.6、会话收集1.7、凭据收集 navicat:SecureCRT:Xshell:WinSCP:VNC: 1.8、DPAPI1.9、域信任1.10、…

Linux第87步_阻塞IO实验

阻塞IO是“应用程序”对“驱动设备”进行操作,若不能获取到设备资源,则阻塞IO应用程序的线程会被“挂起”,直到获取到设备资源为止。 “挂起”就是让线程进入休眠,将CPU的资源让出来。线程进入休眠后,当设备文件可以操…

字节跳动大佬把Python入门知识点整理成手册了,高清PDF开放下载_字节跳动 python 自学笔记

前言 无论是学习任何一门语言,基础知识一定要扎实,基础功非常的重要,找一个有丰富编程经验的老师或者师兄带着你会少走很多弯路, 你的进步速度也会快很多,无论我们学习的目的是什么,不得不说Python真的是一…

GPT 交互式提示工程

简介:交互式提示工程 人工智能领域,尤其是 GPT(生成式预训练变压器)等工具,凸显了即时工程的关键作用。 这篇扩展文章深入探讨了如何设计有效的提示,以从 GPT 等 AI 模型中获得出色的响应。 了解即时工程即…

Vue3(三):生命周期、路由、自定义hooks

这里终于明白了为什么一直有这个语法报错,就是在提示你哪里错的地方上方注释一行/*eslint-disable*/,之前一直警告这个错误感谢老师! 一、vue2和vue3生命周期 还有一个问题就是父组件和子组件哪个先挂载完毕呢?答案是子组件先挂…

Vulnhub靶机 DC-2渗透详细过程

VulnHub靶机 DC-2 打靶 目录 VulnHub靶机 DC-2 打靶一、将靶机导入到虚拟机当中二、攻击方式主机发现端口扫描服务探针爆破目录web渗透信息收集扫描探针登录密码爆破SSH远程登录rbash提权 一、将靶机导入到虚拟机当中 靶机地址: https://www.vulnhub.com/entry/dc…

2024年,国产大模型的变革与突破

在今年两会上,“人工智能(AI)”成为热议焦点。政府工作报告不仅多次提及,还首次提出“人工智能”创新行动,彰显了对科技发展的深刻洞察和前瞻性布局。 回顾历年报告,从“互联网”到“智能”,每…

Transfomer代码实现与细节理解

文章目录 0. 简单理解1. 总体架构1.1 Encoder1.2 Decoder 2. 实现代码2.1 数据预处理2.2 模型参数2.2 Positional Encoding 位置编码2.3 Pad mask 填充的掩码2.4 Subsequence Mask 解码器的自注意力掩码2.6 Scaled Dot Product Attention2.7 MultiHead Attention2.8 FeedForwar…

使用IT-Tools+Cpolar在Windows搭建自己的IT工具箱并实现远程在线使用

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools,并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

异地组网怎么安装?

异地组网安装是指在不同地域的多个设备之间建立网络连接,以便实现数据传输和协同工作的过程。在如今的数字化时代,异地组网安装已经成为了许多企业和组织所必需的一项技术。 天联的使用场景 在异地组网安装中,天联是一种常用的工具。它具有以…

北京大学快手发布统一的图文视频生成大模型Video-LaVIT

随着多模态大语言模型(LLMs)的新发展,人们越来越关注如何将它们从图像-文本数据扩展到更具信息量的真实世界视频。与静态图像相比,视频为有效的大规模预训练带来了独特的挑战,因为需要对其时空动态进行建模。 针对视频…