Transformer-《Attention Is All You Need》

news2024/11/29 22:38:12

目录

0.Transformer介绍

1.self-attention 和Multi-heads self-attention

1.1 self-attention(自注意力机制)

1.2 Multi-heads self-attention(多头自注意力机制)

2.网络结构

2.1 encoder(编码器)

2.2 decoder(解码器)

2.3 Position-wise Feed-Forward Networks(FFN)

2.4 Positional Encoding(位置编码) 

2.5 Add&Norm

3. 参考博文


0.Transformer介绍

2017年Vaswani等人在发表的《Attention Is All You Need》中提出Transformer模型,是第一个完全依靠自注意力计算其输入和输出的模型,从此在自然语言处理领域中被广泛使用。

论文名称:《Attention Is All You Need》 

论文地址:https://arxiv.org/abs/1706.03762

Transformer是一个典型的Seq2Seq模型,Seq2Seq模型的核心思想是将一个序列(如文本)编码成一个固定大小的向量表示,然后解码成另一个序列。这种模型通常包括一个编码器和一个解码器,分别负责将输入序列编码成隐藏表示和将隐藏表示解码成输出序列。因此,Transformer遵循这种整体架构,encoder和decoder都使用堆叠的self-attention和Feed Forward NN(前向传播层),如下图所示:

1.self-attention 和Multi-heads self-attention

1.1 self-attention(自注意力机制)

注意力机制可以描述为将一个query-key-value映射到一个输出的过程,其中query、key、value和输出都是向量。输出计算为value的加权和,其中分配给每个值的权重由query和相应的key进行函数计算得出。Attention计算公式如下图所示:

1)初始化生成qkv:

以下图为例,输入为三个节点a1、a2、a3,通过embedding层,将输入的三个数据转换为向量x1,x2,x3,紧接着对三个节点的向量与权重矩阵Wq、Wk、Wv(这三个参数是可训练的,是共享的)进行计算得到qi,ki,vi,如下图所示。(其中q代表query,后续会去和每一个k进行匹配;
k代表key,后续会被每个q匹配;v代表从输入向量x中提取到的信息)

 2)计算相关性分数score:

self-attention的第二步便是计算相关性分数score,为Attention计算公式中QK^{T}部分。分数是通过查询向量(Queries)与我们正在评分的相应单词的键向量(keys)的点积计算得出的,表征两个向量的相关程度大小,值越大,相关程度越大。

点积运算公式:\vec{a}\ast \vec{b}=\left | \vec{a} \right |\ast \left |\vec{b} \right |\ast\cos \theta

在计算score中,qi逐个与ki进行点积运算,得出score值。例如q1与k1,k2,k3分别进行得出三个score值。 

3)对score进行缩放并进行归一化处理:

在原文中指出,在进行点乘后的值很大,导致通过softmax后的梯度会变得很小,因此文中采用缩放操作,使模型训练时的梯度更加稳定。缩放操作便是Attention计算公式中除以\sqrt{d_{k}},其中d_{k}为输入的q的维度,原文中为64,因此进行开平方后为8。

在对score值进行缩放后,使用Softmax 对分数进行归一化处理,使它们都为正且加起来为 1,相当于计算得到针对每个v的权重,softmax 分数决定了每个词在句子中某个位置的重要性。

4)进行每个单词重要程度重分配:

将每个值向量(values)乘以对应的 softmax 分数,目的是做每个单词重要程度的重分配,即Attention公式中softmax乘V的部分,计算后的值即为Attention的值。例如,词“a1”经过self-attention处理后的输出为 0.70 x v1 + 0.18 x v2+ 0.12 x v3,即当前这句话经过self-attention处理后,词“a1”的含义包含了70%的自身含义和18%的下一词"a2"的含义和12%的下一词"a3"的含义,这样处理就体现了文本上下文的关系。

5)总结: 

在实际计算时,我们会将输入的词向量x1、x2、x3及经过权重矩阵的得到的Q、K、V都拼接成矩阵进行运算,以便更快地处理。如上图所示,Q、K和V是输入矩阵,分别代表查询矩阵、键矩阵和值矩阵,dk​是向量维度。这个公式的作用是通过对Q和K的相似度进行加权,来得到对应于输入的V的加权和,得到注意力机制的输出矩阵。

1.2 Multi-heads self-attention(多头自注意力机制)

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

 因此,在实际使用中,基本使用的时多头注意力机制(Multi-heads Attention)。如下所示为多头自注意力的表达式:

对于多头注意力,我们有多组查询向量(Queries)、键向量(keys)和值向量(values),这里把一组q, k, v 向量称之为一个头,将得到的每个head得到的结果进行concat拼接操作,并将拼接后的结果乘以一个额外的权重矩阵 W^{O}(可学习的参数)进行融合,融合后得到最终的结果矩阵。

在论文中使用八个注意力头,每组注意力头中的参数都是可训练的,经过训练可以扩展模型关注输入数据不同位置的能力。八个注意力头会分别生成八个输出结果,但实际上我们只需要一个输出结果。 所以我们需要一种方法将这八个输出压缩成一个矩阵。方法也很简单,将它们乘以一个额外的权重矩阵 W^{O}即可,这个操作可以简单的经过一个神经网络层的映射即可,如下图所示:

2.网络结构

2.1 encoder(编码器)

编码器是负责把输入信息编码成特征向量的算法组件,这个输入信息根据不同的任务而不同,可是是文本也可以是图像,但文本和图像本身不能直接输入编码器,必须把它们向量化(Embedding)成向量才能送入编码器。

编码器主要是将输入序列转换为一个固定长度的向量,Transformer 中 Encoder 由 6 个相同的层组成,每个层包含 2 个部分:
1)Multi-Head Self-Attention(多头自注意力层)
2)Feed-Forward Neural Network (前向传播层)

在encoder模块中,编码器的自注意力层周围有一个残差连接,然后是Layer Norm层归一化操作,归一化的输出再通过前馈网络FNN中(forward neural network)进行映射以进行进一步处理。前馈网络本质上就是几层神经网络层,中间有 ReLU 激活,两层之间也有残差链接,如下2.3章节所述的MLP block。

网络中,残差连接可以帮助梯度的反向传播,让模型更快更好的收敛。层归一化用于稳定网络,减轻深度学习模型数值传递不稳定的问题。

2.2 decoder(解码器)

解码器是服务于生成任务的,如果是判别任务,可以没有解码器结构。解码器需要对编码器的输出结果进行翻译解释,生成我们想要的目标序列。

解码器用于将编码器生成的向量生成输出序列,Decoder 也是由 6 个相同的层组成,每个层包含 3 个部分:
1)Masked Multi-Head Atttention(掩码多头子注意力层)

与Encoder的Multi-Head Attention计算原理一样,只是多加了一个mask码。Transformer 中的掩码(masking)机制用于防止模型在处理序列时访问不应该访问的信息,模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。

a.padding mask

在自然语言处理任务中,为了将不同长度的句子输入到模型中,我们通常需要对较短的句子进行填充,使其与最长句子的长度相同。填充通常使用特殊的符号(如 <pad>)表示。

填充掩码的目的是在自注意力计算过程中忽略这些填充位置。这样做是因为这些填充符号实际上并不携带任何有意义的信息,我们不希望它们影响其他单词之间的注意力权重计算。填充掩码通过将填充位置对应的注意力 logits 设置为一个非常大的负数来实现。这样,在应用 softmax 函数时,填充位置对应的注意力权重会接近于零。

b.sequence mask
sequence mask 是为了使得 decoder 不能看见未来的信息。对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。这在训练的时候有效,因为训练的时候每次我们是将target数据完整输入进decoder中地,预测时不需要,预测的时候我们只能得到前一时刻预测出的输出。
sequence mask 通过在注意力 logits 矩阵中添加一个下三角矩阵(其上三角部分为负无穷)来实现。这样,在应用 softmax 函数时,当前位置之后的单词对应的注意力权重将接近于零。这使得解码器在每个时间步只能关注当前及之前的单词。

c.总结

填充掩码用于忽略填充符号的影响,而序列掩码确保解码器在生成过程中遵循自回归原则。通过掩码,我们可以使模型在处理序列时更加稳定、可靠。在Encoder中的Multi-Head Attention也是需要进行mask地,只不过Encoder中只需要padding mask即可,而Decoder中需要padding mask和sequence mask。

2)Encoder-Decoder Multi-Head Attention(多头编码-解码子注意力层)

Encoder中的Multi-Head Attention是基于Self-Attention地,Decoder中的第二个Multi-Head Attention就只是基于Attention,它的输入Quer来自于Masked Multi-Head Attention的输出,Keys和Values来自于Encoder中最后一层的输出。

3)Feed Forward NN(前向传播层)

同encoder中的相同,采用MLP模块进行实现,如2.3章节所示。

decoder在最终的输出时,首先经过一次线性变换,然后Softmax得到输出的概率分布,通过词典匹配,输出概率最大的对应的单词作为我们的预测输出。

2.3 Position-wise Feed-Forward Networks(FFN)

在Transformer中,Feed Forward(FNN)层是一个MLP,它在自注意力机制之后对序列中的每个向量单独应用,FFN层的表达式如下所示:

 MLP Block由两个全连接层和一个非线性激活函数(如 ReLU 或 GELU)组成,第一个全连接层会将输入的结点个数扩大4倍,因为在最后的输出中有残差连接,所以第二个全连接层会还原回输入的节点个数,如下图所示:

2.4 Positional Encoding(位置编码) 

在self-attention的计算机制中,并没有考虑到位置信息,我们希望将输入序列的每个元素信息进行标识,所以在encoder和decoder的输入阶段,进行Positional Encoding。位置编码是一种表示序列中每个位置信息的向量。位置编码的维度与输入向量的维度相同,这样我们可以将它们逐元素相加,从而保留位置信息。

 位置编码可以是固定的(如基于正弦和余弦函数的编码),也可以是可学习的(通过训练得到的向量)。在Transformer原论文中,作者使用了基于正弦和余弦函数的固定位置编码,对于一个给定位置 pos 和编码维度 i,位置编码的计算公式如下:

PE_{\left ( i,2k \right )}=\sin \left ( \frac{i}{10000^{2k/d}} \right )

PE_{\left ( i,2k+1 \right )}=\cos\left ( \frac{i}{10000^{2k/d}} \right )

其中,PE(i,2k)和PE(i,2k+1)是位置编码矩阵中第i行第2k和2k+1列的值,d是输入向量的维度。通过这个公式,我们可以为输入序列中的每个位置生成一个位置编码向量,该向量具有一定的模式,能够表示该位置在序列中的位置信息。

为了将位置编码添加到输入序列中,我们可以将输入序列中的每个词语向量与对应位置编码向量相加,得到包含位置信息的输入向量,如下图所示:

2.5 Add&Norm

1.Add

  Add,就是在经过计算后的结果的基础上加了一个残差块,加入残差块的目的是为了防止在深度神经网络训练中发生退化问题,退化的意思就是深度神经网络通过增加网络的层数,Loss逐渐减小,然后趋于稳定达到饱和,然后再继续增加网络层数,Loss反而增大。

2.Norm

 在神经网络进行训练之前,都需要对于输入数据进行Normalize归一化,目的有:

1.能够加快训练的速度。

2.提高训练的稳定性。 

Transformer中使用Layer Normalization进行归一化操作,因为在原始的论文中,transformer应用于NLP领域,layer_norm针对的是文本的长度,整条序列的文本,效果要比batch_norm好。

Batch Normalization 的处理对象是对一批样本, Layer Normalization 的处理对象是单个样本。Batch Normalization 是对这批样本的同一维度特征做归一化, Layer Normalization 是对这单个样本的所有维度特征做归一化。


3. 参考博文

1.Encoder-Decoder_qq_47537678的博客-CSDN博客

2.编码器-解码器模型 - 魔法学院小学弟

3. 变形金刚(Transformer) - 魔法学院小学弟

4. 详解Transformer中Self-Attention以及Multi-Head Attention_太阳花的小绿豆 transformer_太阳花的小绿豆的博客-CSDN博客

5.batchNormalization与layerNormalization的区别 - 知乎

6. 史上最小白之Transformer详解_Stink1995的博客-CSDN博客

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

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

相关文章

【尔嵘】感恩四周年,感谢支持

前言 注意&#xff1a;为感谢各位铁粉支持&#xff0c;【尔嵘】将随机一个号码赠送一本vue.js书籍&#xff0c;欢迎评论区留言&#xff01; 在当前互联网领域中&#xff0c;CSDN是一个非常知名的技术社区&#xff0c;在这里你可以接触到很多高质量的技术文章和技术交流。对于技…

九年测试老鸟,写给1~5年的测试工程师的几点建议,满满硬货指导

从15年毕业到现在也从业八年了&#xff0c;普通本科毕业&#xff0c;现在一家互联网公司担任测试部门总监&#xff0c;摸爬打滚&#xff0c;坑坑洼洼也经历了不少。思绪很久决定还是写下这篇&#xff0c;希望对后进的小伙子少走一点弯路。 很多人把职场想得太美好&#xff0c;其…

七人拼团系统开发模式详解

七人拼团是最近兴起的一个模式&#xff0c;它通过更人性化的奖励机制&#xff0c;将产品利润最大化让利给参与拼团的用户&#xff0c;达到促进用户主动积极裂变和团队平台引流提升销量的效果&#xff0c;下面就来详细说一下这个模式。 七人拼团最大的特点&#xff0c;就是结合了…

JVM之栈和堆运行时内存深度剖析

运行时内存篇 程序计数器 也是线程私有的,不共享,因为cpu时间片轮换的缘故,所以需要记录上次未执行完的线程执行到那条字节码指令了,所以每个线程需要记录当前执行的命令的内存指针,以方便线程再次得到执行的时候按照正确的顺序执行 JVM之栈(虚拟机栈) 基础知识 会gc吗 不…

pinpoint安装部署(相关博客合集)

pinpoint安装部署 说明一、PinPoint介绍及工作原理1.1 确定部署的组件及服务 二、相关组件版本兼容情况2.1 确定版本 三、部署3.1 HBASE3.2 agent 说明 本博客写在搭建PinPoint之前&#xff0c;主要是用来记录查阅的相关博客资料&#xff0c;等到动手搭建完再更新实际部署操作…

医学可视化应用简介

VolView VolView是一款为临床专业人员开发的开源放射学查看器。使用VolView&#xff0c;可以通过交互式电影体积渲染对数据有更深入的视觉理解&#xff0c;并轻松地以3D形式可视化DICOM数据。由于VolView在浏览器中运行&#xff0c;不需要安装软件&#xff0c;数据也可以安全地…

SOLIDWORKS技巧培训-绘制零件滚花的两种方法

最近常有朋友咨询SolidWorks零件如何做滚花的效果&#xff0c;下面给大家整理了绘制零件滚花的一个培训教程&#xff1a; 作为机械设计师&#xff0c;滚花应该都不陌生&#xff0c;真要说起来&#xff0c;滚花绘制其实也不算难&#xff0c;跟着我们一步一步来&#xff0c;应该…

DATAX数据同步工具

1&#xff1a;DATAX概览 ​ DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 1.1&#xff1a;DataX3.0框架设计 DataX本身作为离线数据同步框架&am…

NR RLC(四) AM mode

欢迎关注同名微信公众号“modem协议笔记”。 这篇是RLC AM mode的相关内容&#xff0c;RLC的ARQ是一种重传机制&#xff0c;其实NR三个不同的协议层MAC(HARQ)、 RLC(ARQ)和PDCP都有重传功能。为什么三层协议都需要具备重传功能&#xff1f;早期也有思考过这个问题&#xff0c;…

Sui与KuCoin Labs联合推出夏季黑客松,奖池高达28.5万美金!

Sui与KuCoin Labs联合推出的夏季黑客松于2023年5月29日正式开启&#xff0c;本次黑客松将为参赛者提供与Sui基金会团队、KuCoin Labs和其他黑客松合作伙伴及支持者进行技术交流和项目演示的机会。比赛涵盖四个主要赛道&#xff0c;总奖池高达28.5万美金&#xff0c;最终比赛结果…

【目标检测】yolov5模型详解

文章目录 一、Yolov5网络结构1.1 Input1.2 Backbone1.2.1 Conv模块1.2.2 C3模块1.2.3 SPPF模块 1.3 Neck1.4 Head1.4.1 head1.4.2 目标框回归1.4.3 目标的建立1.4.4 NMS&#xff08;Non-Maximum Suppression&#xff09; 二、损失函数2.1 分类损失2.2 置信度损失2.3 定位损失 L…

在Linux系统实现服务器端和客户端的套接字通信

目录 一.创建一个socket文件夹用来存放编写的服务器端和客户端程序 二.编写服务器端代码 三.编写客户端代码 四.编译c语言程序 五.断开连接 六.可能涉及到的一些没接触过的知识点 一.创建一个socket文件夹用来存放编写的服务器端和客户端程序 &#xff08;我系统里的文件…

Revit楼板问题:楼板连接处以及楼板开洞,一键开洞

在我们做楼梯时&#xff0c;楼梯与楼板处的连接处理不是那么符合实际&#xff0c;会出现一些问题&#xff0c;如下图&#xff0c;这样的连接会导致楼梯配筋时钢筋外露。 我们来学习如何调节楼板与楼板连接处的高度&#xff0c;选中楼梯&#xff0c;点击“编辑楼梯”在所需要更改…

STM32堆栈方面知识点

最近弄json&#xff0c;发现经常的堆溢出&#xff0c;然后找问题。因为对STM32堆栈问题没有深刻认识&#xff0c;就花时间好好研究下了堆栈并且做了验证 1.栈地址区间确定 首先找到启动文件&#xff0c;我的启动文件在startup_stm32f40xx.s&#xff0c;一般的启动文件也都在s…

Linux之命令搜索

目录 Linux之命令搜索 Whereis命令 定义 基本信息 举例 which命令 定义 与whereis命令的区别 基本信息 举例 locate 命令 定义 优点 缺点 基本信息 案例 Linux之命令搜索 Whereis命令 定义 whereis --- 搜索系统命令的命令&#xff08;像绕口令一样&#xff09…

Revit中如何为曲面墙体开洞口,一键开洞?

一、Revit中如何为曲面墙体开洞口 直线墙体开洞可以直接通过编辑轮廓来绘制洞口形状即可&#xff0c;或者可以通过选中墙体选择“墙-洞口”命令来开洞口。 但是曲面墙体开洞并没有那么简单&#xff0c;曲面墙体不能够编辑轮廓&#xff0c;并且选中曲面墙体“墙-洞口”命令只能够…

C++const函数的运用:深度解析const函数的魅力

C 深度解析const函数的魅力 1. C const函数的基本概念&#xff08;Basic Concepts of const Functions in C&#xff09;1.1 const函数的定义与特性&#xff08;Definition and Characteristics of const Functions&#xff09;1.2 const函数的使用场景&#xff08;Usage Scena…

docker磁盘空间爆满 通过overlay2 目录名查找对应容器

docker磁盘空间爆满 通过overlay2 目录名查找对应容器 1、docker文件系统占用分析2、使用shell脚本通过overlay2 目录名查找对应容器 1、docker文件系统占用分析 du -sh /var/lib/docker/*看到占用磁盘空间最大的目录是docker存储根目录下的overlay2目录 再查看docker存储根目…

Android智能指针SP WP

1.概述 Android的C部分代码中有大量的sp/wp存在&#xff0c;意思是strong pointer和weak pointer&#xff0c;看字面意思就是指针相关的东西。C是通过new和delete进行内存的分配和释放的&#xff0c;但是有时候开发者会忘记使用delete导致内存泄露&#xff0c;所以Android中就…

设计师们都在用的AI作图神器,你还不抓紧入手一款

人工智能在机器和计算机控制的机器人中模拟人类智能过程。这允许计算机系统执行繁重的任务&#xff0c;帮助人类专注于更重要的事情。因此&#xff0c;多年来&#xff0c;工作场所对 AI 集成的需求不断增加。 同样&#xff0c;人工智能正迅速成为设计行业的一部分。在平面设计…