【Transformer系列(4)】Transformer模型结构超详细解读

news2024/12/27 11:49:36

前言 

前一篇我们一起读了Transformer的论文《Attention Is All You Need》,不知道大家是否真的理解这个传说中的神(反正俺是没有~)

这两天我又看了一些视频讲解,感谢各位大佬的解读,让我通透了不少。

这篇文章就和大家分享一下我的理解!

962f7cb1b48f44e29d9beb1d499d0530.gif​   🍀前期回顾

 【Transformer系列(1)】encoder(编码器)和decoder(解码器)

 【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
 【Transformer系列(3)】 《Attention Is All You Need》论文超详细解读(翻译+精读)


目录

前言 

🌟一、Transformer 整体结构 

🌟二、编码器:Encoder

 2.1输入

2.1.1词嵌入:Word Embedding层

2.1.2位置编码器:Position Embedding层

 2.2注意力机制

2.2.1自注意力机制:Self-Attention

2.2.2多头注意力机制:Multi-Head Attention

2.3残差连接

2.4LN和BN

2.5前馈神经网络:FeedForward

🌟三、解码器:Decoder

 3.1第一个 Multi-Head Attention

3.1.1掩码:Mask 

3.1.2具体实现步骤

 3.2第一个 Multi-Head Attention

 3.3Linear和softmax

🌟一、Transformer 整体结构 

 首先我们回顾一下这个神图:

 这张图小白刚看时会觉得很复杂,其实Transformer主要就做了这件事:

可以看到 Transformer 由 Encoder Decoder 两个部分组成,Encoder把输入读进去Decoder得到输出: 

 Encoder Decoder 都包含 6 个 block。这6个block结构相同,但参数各自随机初始化。(

Encoder和Decoder不一定是6层,几层都可以,原论文里采用的是6层。)


🌟二、编码器:Encoder

    Encoder由三个部分组成:输入多头注意力前馈神经网络


 2.1输入

Transformer 中单词的输入表示 x单词 Embedding 和位置 Embedding (Positional Encoding)相加得到。


 2.1.1词嵌入:Word Embedding层

词嵌入层 负责将自然语言转化为与其对应的独一无二的词向量表达。将词汇表示成特征向量的方法有多种:

(1)One-hot编码

 One-hot编码使用一种常用的离散化特征表示方法,在用于词汇向量表示时,向量的列数为所有单词的数量,只有对应的词汇索引为1,其余都为0。

举个栗子,“我爱我的祖国”这句话,总长为6,但只有5个不重复字符,用One-hot表示后为6*5的矩阵,如图所示。但是但这种数据类型十分稀疏,即便使用很高的学习率,依然不能得到良好的学习效果。

image

(2)数字表示

数字表示是指用整个文本库中出现的词汇构建词典,以词汇在词典中的索引来表示词汇。所以,我认为,与其叫做“数字表示”,还不如叫“索引表示”。

举个栗子,还是“我爱我的祖国”这句话,就是我们整个语料库,那么整个语料库有5个字符,假设我们构建词典{'我':0, '爱':1, '的':2, '祖':3, '':4},“我爱我的祖国”这句话可以转化为向量:[0, 1, 0, 2, 3, 4]。如图所示。这种方式存在的问题就是词汇只是用一个单纯且独立的数字表示,难以表达出词汇丰富的语义。

image


2.1.2位置编码器:Position Embedding层

Transformer 中除了Word Embedding,还需要使用Position Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构,而是使用全局信息,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来。

Position Embedding 用 PE表示,PE 的维度与Word Embedding 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,计算公式如下:

其中 pos 表示位置index, i 表示dimension index。 


 2.2注意力机制

我们再来看一下这个图,图中红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder 包含一个 Multi-Head Attention,而 Decoder 包含两个 Multi-Head Attention (其中有一个用到 Masked)。

Multi-Head Attention 上方还包括一个 Add & Norm 层:

  • Add: 表示残差连接 (Residual Connection) 用于防止网络退化
  • Norm: 表示 Layer Normalization,用于对每一层的激活值进行归一化

2.2.1自注意力机制:Self-Attention

自注意力机制是注意力机制的变体,其减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。自注意力机制的关键点在于,Q、K、V是同一个东西,或者三者来源于同一个X,三者同源。通过X找到X里面的关键点,从而更关注X的关键信息,忽略X的不重要信息。不是输入语句和输出语句之间的注意力机制,而是输入语句内部元素之间或者输出语句内部元素之间发生的注意力机制。

如何运用自注意力机制? 

第1步:得到Q,K,V的值

对于每一个向量x,分别乘上三个系数 W^{q}, W^{k}W^{v},得到的Q,K和V分别表示query,key和value

【注意】三个W就是我们需要学习的参数。

第2步:Matmul

利用得到的Q和K计算每两个输入向量之间的相关性,一般采用点积计算,为每个向量计算一个score:score =q · k 

第3步:Scale+Softmax

将刚得到的相似度除以\sqrt{d_{k}},再进行Softmax。经过Softmax的归一化后,每个值是一个大于0且小于1的权重系数,且总和为0,这个结果可以被理解成一个权重矩阵。

 第4步:Matmul

使用刚得到的权重矩阵,与V相乘,计算加权求和。

以上是对Thinking Machines这句话进行自注意力的全过程,最终得到z1z2两个新向量。

其中z1表示的是thinking这个词向量的新的向量表示(通过thinking这个词向量,去查询和thinking machine这句话里面每个单词和thinking之间的相似度)。

也就是说新的z1依然是 thinking 的词向量表示,只不过这个词向量的表示蕴含了 thinking machines 这句话对于 thinking 而言哪个更重要的信息 。


2.2.2多头注意力机制:Multi-Head Attention

与其只使用单独一个注意力汇聚, 我们可以用独立学习得到的h组(一般h=8)不同的线性投影来变换查询、键和值。

然后,这h组变换后的查询、键和值将并行地送到注意力汇聚中。 最后,将这h个注意力汇聚的输出拼接在一起, 并且通过另一个可以学习的线性投影进行变换, 以产生最终输出。 这种设计被称为多头注意力(multihead attention)

如何运用多头注意力机制? 

第1步:定义多组W,生成多组Q、K、V

刚才我们已经理解了,Q、K、V是输入向量X分别乘上三个系数 W^{q}, W^{k}W^{v}分别相乘得到的,  W^{q}, W^{k}W^{v}是可训练的参数矩阵。

现在,对于同样的输入X,我们定义多组不同的 W^{q}, W^{k}W^{v} ,比如W_{0}^{^{q}}W_{0}^{^{k}}W_{0}^{^{v}}W_{1}^{^{q}}W_{1}^{^{k}}W_{1}^{^{v}}每组分别计算生成不同的Q、K、V,最后学习到不同的参数。

第2步:定义8组参数

对应8组  W^{q}, W^{k}W^{v} ,再分别进行self-attention,就得到了Z_{0}-Z_{7}

第3步:将多组输出拼接后乘以矩W_{0}以降低维度

 首先在输出到下一层前,我们需要将Z_{0}-Z_{7}concat到一起,乘以矩阵W_{0}做一次线性变换降维,得到Z。

 完整流程图如下:(感谢翻译的大佬!)

【注意】对于上图中的第2)步,当前为第一层时,直接对输入词进行编码,生成词向量X;当前为后续层时,直接使用上一层输出。 


2.3残差连接

每个编码器的每个子层(Self-Attention 层和 FFN 层)都有一个残差连接,再执行一个层标准化操作。

把得到的两个词的Attention值摞在一起后,将“加入位置编码后的词向量X”与“摞在一起后输出的Attention值Z” 相加。残差连接减小了梯度消失的影响。加入残差连接,就能保证层次很深的模型不会出现梯度消失的现象。


2.4LN和BN

  • LN:Layer Normalization,LN是“横”着来的,对同一个样本,不同的特征做归一化。
  • BN:Batch Normalization,BN是“竖”着来的,对不同样本,同一特征做归一化。

二者提出的目的都是为了加快模型收敛,减少训练时间。

【注意】在NLP任务中,一般选用的都是LN,不用BN。因为句子长短不一,每个样本的特征数很可能不同,造成很多句子无法对齐,所以不适合用BN。


 2.5前馈神经网络:FeedForward

在进行了Attention操作之后,Encoder和Decoder中的每一层都包含了一个全连接前向网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出: 

假设多头注意力部分有两个头,那么输出的两个注意力头Zi分别通过两个Feed Forward,然后接一个残差连接,即Zi和Feed Forward的输出Add对位相加。最后把相加的结果进行一次LN标准化。


🌟三、解码器:Decoder

上图红色框框为 Transformer 的 Decoder 结构,与 Encoder 相似,但是存在一些区别。

Decoder 包含两个 Multi-Head Attention 层。

  • 第一个 Multi-Head Attention 层采用了 Masked 操作。
  • 第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder编码信息矩阵C进行计算,而Q使用上一个 Decoder的输出计算。
  • 最后有一个 Softmax 层计算下一个翻译单词的概率。

 3.1第一个 Multi-Head Attention

3.1.1掩码:Mask 

Mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 Padding Mask 和 Sequence Mask。其中,Padding Mask 在所有的 scaled dot-product attention 里面都需要用到,而 Sequence Mask 只有在 Decoder 的 Self-Attention 里面用到。

为什么需要Mask?   

   有一些生成的attention张量中的值计算有可能已知了未来信息而得到的,未来信息被看到是因为训练时会把整个输出结果都一次性进行Embedding,但是理论上解码器的的输出却不是一次就能产生最终结果的,而是一次次通过上一次结果综合得出的,因此,未来的信息可能被提前利用。所以,Attention中需要使用掩码张量掩盖未来信息

  我们可以这么来理解Mask的作用:我们建模目的就是为了达到预测的效果,所谓预测,就是利用过去的信息(此前的序列张量)对未来的状态进行推断,如果把未来需要进行推断的结果,共同用于推断未来,那叫抄袭,不是预测。当然,这么做的话训练时模型的表现会很好,但是在测试(test)时,模型表现会很差。

换句话说,我们是用一句话中的前N − 1 个字预测第N 个字,那么我们在预测第N 个字时,就不能让模型看到第N个字之后的信息,所以这里们把预测第N 个字时,第N 包括)个字之后的字都Masked掉。

我们来举个栗子:

 

如果像encoder的注意力机制那里一样没有mask,那么在训练decoder时,如果要生成预测结果you,就需要用到下面整个句子的所有词(s,i,love,you,now)。但是在真正预测的时候,并看不到未来的信息(即还轮不到you和now呢)。

所以在预测阶段,预测的第一步生成第一个词I的时候,用起始词<start>self-attention;然后预测的第二步生成第二个词love的时候,就做<start>I两个词的self-attention,后面的词被掩盖了。以此往复,预测的每一步在该层都有一个输出Q,Q要送入到中间的Multi-Head Attention层,和encoder部分输出的K,V做attention。


3.1.2具体实现步骤

第一步:是 Decoder 的输入矩阵和 Mask 矩阵,输入矩阵包含 "<Start> I Love You Now" (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。

(输入矩阵与 Mask 矩阵)

第二步:接下来的操作和之前的 Self-Attention 一样,通过输入矩阵X计算得到Q,K,V矩阵。然后计算QK^{T}的乘积QK^{T}

(Q乘以K的转置)

第三步:在得到 QK^{T}之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:

(Softmax 之前 Mask)

得到 Mask QK^{T}之后在 Mask QK^{T}上进行 Softmax,每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0。

第四步:使用 Mask QK^{T}与矩阵 V相乘,得到输出 Z,则单词 1 的输出向量 Z1 是只包含单词 1 信息的。

(Mask 之后的输出)

第五步:通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵Zi ,然后和 Encoder 类似,通过 Multi-Head Attention 拼接多个输出Zi然后计算得到第一个 Multi-Head Attention 的输出ZZ与输入X维度一样。


 3.2第一个 Multi-Head Attention

其实这块与上文 Encoder 中 的 Multi-Head Attention 具体实现细节上完全相同,区别在于Encoder的多头注意力里的Q、K、V是初始化多个不同的W^{Q}W^{K}W^{V}矩阵得到的。而Decoder的K、V是来自于Encoder的输出,Q是上层Masked Self-Attention的输出。

Encoder 中 的 Multi-Head Attention只有一个输入,把此输入经过三个linear映射成Q 、K 、V , 而这里的输入有两个:

  • 一个是Decoder的输入经过第一个大模块传过来的值
  • 一个是Encoder最终结果

是把第一个值通过一个linear映射成了Q,然后通过两个linear把第二个值映射成K、V ,其它的与上文的完全一致。这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)


 3.3Linear和softmax

Decoder最后会输出一个实数向量。那我们如何把浮点数变成一个单词?这便是线性变换层Linear层要做的工作,它之后就Softmax层

Linear层是一个简单的全连接神经网络,它可以把Decoder产生的向量投射到一个比它大得多的、被称作对数几率(logits)的向量里。

不妨假设我们的模型从训练集中学习一万个不同的英语单词(我们模型的“输出词表”)。因此对数几率向量为一万个单元格长度的向量——每个单元格对应某一个单词的分数。

接下来的Softmax 层便会把那些分数变成概率(都为正数、上限1.0)。概率最高的单元格被选中,并且它对应的单词被作为这个时间步的输出。

这张图片从底部以解码器组件产生的输出向量开始。之后它会转化出一个输出单词。


以上就是Transformer模型结构的全部解读了~

在这里如果想更清楚的了解,推荐大家看看大佬的讲解(感谢各位大佬,阿里嘎多!)

b站:【Transformer从零详细解读(可能是你见过最通俗易懂的讲解)】

知乎:Transformer模型详解(图解最完整版) - 知乎 (zhihu.com)

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

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

相关文章

前沿的Web前端技术趋势与应用实践

近年来&#xff0c;Web前端技术发展迅猛&#xff0c;各种新技术层出不穷&#xff0c;为了跟上潮流&#xff0c;我们需要不断学习新知识&#xff0c;应用新技术&#xff0c;不断提高自己的技术水平&#xff0c;为自己的职业生涯打下坚实的基础。本篇博客将为大家详细介绍前沿的W…

【Mysql】主从复制

【Mysql】主从复制 文章目录 【Mysql】主从复制1. 概述2. 原理3. 搭建3.1 准备工作3.2 主库配置3.3 从库配置 1. 概述 主从复制是指主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后再从库上对这些日志重新执行(也叫重做)&#xff0c;从而使得从库和…

小红书行业趋势分析,女性种草关键词有哪些?

在“她力量”崛起的当今&#xff0c;女性用户正不断引领新潮流&#xff0c;驱动产品、内容升级。女性个人观念、生活方式、消费偏好演变&#xff0c;需求重点势必不断更新。 今儿就女性用户的聚集地小红书平台&#xff0c;以及女性最关注的美妆、母婴两大行业&#xff0c;通过数…

完整支持Oracle PL/SQL,星环科技KunDB高兼容性实现低成本国产化替代

从中兴、华为等一系列高新科技企业被美国制裁&#xff0c;到俄乌冲突事件爆发后&#xff0c;西方各国相继宣布制裁俄罗斯&#xff0c;以Oracle、IBM、微软、SAP为代表的科技巨头暂停在俄服务&#xff0c;这一系列动作给我们敲响了加速国产化替代的警钟。数据库作为提供数据存储…

2024年浙大MBA提前批面试即将开始申请,如何操作?

在去年的这个时间点&#xff0c;浙大MBA提前批面试的申请系统已经打开并可以正常开始接受申请报名&#xff0c;而今年的申请时间会在什么时间点&#xff1f;那么又如何准备浙大MBA的提面申请呢&#xff1f;本期专注浙大的杭州达立易考教育为大家做一下梳理&#xff0c;帮助大家…

【机器学习】P21 正则化 Regularization(L1正则化 Lasso、L2正则化 Ridge、弹性网络正则化、Dropout正则化、早停法)

既然模型有概率发生过拟合现象&#xff0c;那么如何才能减少过拟合&#xff0c;或者防止过拟合的产生&#xff1f;方法之一就是正则化方法&#xff0c;Regularization&#xff1b; 我对正则化&#xff0c;有这样的理解&#xff1a;“我们既希望能够通过权重的调整从而建立更好…

数据结构考研版——括号的匹配问题栈的计算问题

一、括号的匹配问题 这玩意太简单了没什么讲头&#xff0c;就是括号一个一个进栈&#xff0c;匹配就出&#xff0c;以此类推 二、括号匹配问题代码 int isMatched(char left, char right) {if (left (&& right ))return 1;else if (left [ && right ])ret…

还在发愁项目去哪找?软件测试企业级Web自动化测试实战项目

今天给大家分享一个简单易操作的实战项目&#xff08;已开源&#xff09; 项目名称 ET开源商场系统 项目描述 ETshop是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城…

Java语法理论和面经杂疑篇《十. 反射机制》

目录 1. 反射(Reflection)的概念 1.1 反射的出现背景 1.2 反射概述 1.3 Java反射机制研究及应用 1.4 反射相关的主要API 1.5 反射的优缺点 2. 理解Class类并获取Class实例 2.1 理解Class 2.1.1 理论上 2.1.2 内存结构上 2.2 获取Class类的实例(四种方法) 2.3 哪些类…

设计模式:创建者模式 - 原型模式

文章目录 1.概述2.结构3.实现4.案例5.使用场景6.扩展&#xff08;深克隆&#xff09; 1.概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 2.结构 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具体…

nodejs+vue宠物商城健康医院挂号服务管理系统python+java+php

在前台&#xff0c;首先提供一个界面清晰、导航明确的首页&#xff0c;无论是会员还是游客都可以访问。游客通过首页查看该网站所要具备的功能&#xff0c;以及对应的周边商城信息&#xff0c;特别在周边商城模块&#xff0c;需要明确的进行介绍&#xff0c;突出周边商城特色和…

如何主动增加自己的开源项目star数的方法汇总

本篇文章主要讲解&#xff0c;通过自媒体、短视频、网络平台等渠道形式增加自己的开源项目的曝光度以增加star数的方法。 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月20日 开源项目的star数在某些找工作的情况下是有一定的加分的&#xff0c;故此价值是一定的。但是自己…

arm64异常向量表

arm64异常向量表 1 arm64异常向量表2 linux arm64异常向量表3 kernel_ventry宏4 异常向量表的保存4. VBAR_ELx寄存器4.2 __primary_switched4.3 __primary_switched 1 arm64异常向量表 When an exception occurs, the processor must execute handler code which corresponds t…

电力系统谐波影响及治理

1.谐波 众所周知&#xff0c;理想的电力系统向用户提供的是一个恒定工频的正弦波形电压&#xff0c;但是由于各种原因&#xff0c;使这种理想状态在实际中无法存在。当正弦波电压施加在非线性电路上时&#xff0c;电流就变成非正弦波&#xff0c;非正弦电流在电网阻抗上产生压…

机器学习:基于逻辑回归和高斯贝叶斯对人口普查数据集的分类与预测

机器学习:基于逻辑回归和高斯贝叶斯对人口普查数据集的分类与预测作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要…

【python】采集每日必看黄色软件数据~

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 环境使用: Python 3.8 Pycharm 模块使用: requests >>> pip install requests re csv 安装模块&#xff1a;win R 输入cmd 输入安装命令 pip install 模块名 如果出现爆红 可能是因为 网络连接超时 切换国内…

【云原生】Dockerfile制作WordPress镜像,实现compose编排部署

文章目录 &#x1f479; 关于作者前言环境准备目录结构 dockerfile制作镜像yum 脚本Dockerfile-mariadb 镜像Dockerfile-service 镜像docker compose 编排 提升✊ 最后 &#x1f479; 关于作者 大家好&#xff0c;我是秋意临。 &#x1f608; CSDN作者主页 &#x1f60e; 博客…

谷歌Colab云端部署Stable Diffusion 进行绘图

系列文章目录 本地部署Stable Diffusion教程&#xff0c;亲测可以安装成功 Stable Diffusion界面参数及模型使用 文章目录 系列文章目录前言一、Colab是什么&#xff1f;二、操作步骤1.找到对应的脚本2.在谷歌Colab里执行脚本3.装载想要的模型4.开始绘图 前言 在之前的博客里…

设计模式:创建者模式 - 工厂模式

文章目录 1.概述2.简单工厂模式&#xff08;非23种&#xff09;2.1 结构2.2 实现2.3 优缺点2.4 扩展 3.工厂方法模式3.1 概念3.2 结构3.3 实现3.4 优缺点 4.抽象工厂模式4.1 概念4.2 结构4.3 实现4.4 优缺点4.5 使用场景 5.模式扩展6.JDK源码解析-Collection.iterator方法 1.概…

【Linux】线程安全——补充|互斥、锁|同步、条件变量

文章目录 一、知识补充线程的ID局部存储验证Thread.hpp——线程的封装 二、线程安全问题三、Linux线程互斥互斥相关概念互斥量mutexmutex的使用全局锁的使用局部锁的使用 mutex的理解Mutex.hpp——mutex的封装可重入VS线程安全死锁 四、Linux线程同步条件变量条件变量接口理解条…