Transformer 简介

Transformer 是 Google 在 2017 年底发表的论文 Attention Is All You Need 中所提出的 seq2seq 模型。Transformer 模型的核心是 Self-Attention 机制,能够处理输入序列中的每个元素,并能计算其与序列中其他元素的交互关系的方法,从而能够更好地理解序列中的上下文关系。

Transformer 模型能够处理不同长度的序列,捕捉长距离依赖关系,并在大规模数据上进行高效训练。这使得它成为自然语言处理领域取得重大突破的关键模型之一,逐渐取代了 CNN 和 RNN。

目录

  • 一. 预备知识
    • 1. Attention 机制
    • 2. Self-Attention 机制
    • 3. Cross-Attention 机制
    • 4. Multi-Head Attention
    • 5. 位置编码
  • 二. Transformer
    • 1. Input Block
    • 2. Encoder Block
    • 3. Decoder Block
    • 4. Output Block

一. 预备知识

1. Attention 机制

Attention 机制 1 也叫注意力机制,是一种用于改善神经网络 对输入序列中不同部分的关注度 的机制。在传统的神经网络中,所有输入信息都被平等对待,无论其在序列中的位置或重要性。而 Attention 机制允许网络在处理输入序列时更加关注其中的特定部分,使网络能够更灵活地学习输入之间的关系。

Attention 机制的基本思想是:对于每个输出位置,网络都动态地计算一个权重分布,以指示输入序列中哪些位置更重要。这个权重分布是通过计算 Query(即用户提出的问题)与 Key(即模型中的知识摘要)之间的关联度,然后 softmax 归一化取最大概率的结果,最后查询得到 Value(即与 Key 相关联的知识)输出。
在这里插入图片描述

Attention 机制解决了先前 RNN 不能并行计算的问题,节省了训练时间,并且能够获取到局部的关键信息。但 Attention 机制也有一些缺点:

  1. 只能在 Decoder 阶段实现并行运算,Encoder 部分依旧采用的是 RNN、LSTM 等按照顺序编码的模型,无法实现并行运算;
  2. 因为 Encoder 部分仍依赖 RNN,所以中长距离之间的两个词相互之间的关系没有办法很好的获取;

为了改进 Attention 机制的缺点,出现了 Self-Attention。

2. Self-Attention 机制

Self-Attention(自注意力)机制是 Attention 的一种特殊形式,它允许一个 序列中的不同位置之间进行交互,而不是像 Attention 机制那样仅仅对输入序列的不同部分进行关注。在 Self-Attention 中,对于序列中的每个元素,都会计算该元素与序列中所有其他元素之间的关联度,然后利用这些关联度为每个元素分配一个权重。这样,每个元素都能够考虑到整个序列的信息,能够与序列中的所有其他位置进行交互,而不仅仅是局部信息,从而更好地捕捉长距离依赖关系。

Self-Attention 最为突出的应用就是在 Transformer 模型中,它允许模型在处理序列数据时,不受到固定的感受野大小的限制,而能够根据任务的需要自适应地捕捉不同位置的信息。这使得 Self-Attention 成为了处理序列数据的强大工具,被广泛用于自然语言处理和其他领域的任务。

在这里插入图片描述
如图所示,X 是嵌入了 Positional Encoding 的 Input Embedding,每一行都是一个词向量;WQ、WK、WV 分别是用于计算 Query、Keys、Values 的权值矩阵;Q、K、V 分别是 Input Embedding 与权值矩阵计算所得的 Query、Keys、Values 向量,用于计算 Attention 值。

3. Cross-Attention 机制

Cross-Attention(交叉注意力)机制是 Attention 机制的一种扩展,它主要应用于 处理两个不同序列之间的关系,使得模型能够对一个序列中的元素关注另一个序列中的相关部分,从而更好地捕捉两个序列之间的关联信息。

Cross-Attention 机制的引入使得模型能够在处理两个序列时,动态地关注源序列的不同部分,从而更好地理解源序列与目标序列之间的关系。这在处理序列对之间的任务时非常有用,比如在问答、机器翻译等任务中。

Transformer 的 Decoder 部分使用 Cross-Attention 机制来处理输入序列和输出序列之间的关系。具体来说,Decoder 在生成目标序列的每个位置时,能够动态地关注输入序列的不同部分,更好地对应输入和输出之间的对应关系,尤其在翻译等任务中效果显著。

4. Multi-Head Attention

Multi-Head Attention 是 Transformer 模型中的一种注意力机制,它是对单一 Attention 头的扩展。通过使用多个独立的 Attention 头,模型能够并行地学习不同的关注权重,从而更好地捕捉序列中的不同关系。这有助于提高模型的表达能力和学习复杂关系的能力。

Multi-Head Attention 使用多个独立的 Attention 头,对于每个Attention头,学习三个线性变换,分别用于生成各自的 Query、Key 和 Value;然后使用每个头的 Query、Key 和 Value 并行计算关联度和权重;再将多个头的输出拼接在一起以增加模型对不同关系和特征的表达能力;最后将拼接后的输出通过线性变换生成最终的 Multi-Head Attention 的输出。
在这里插入图片描述

通过使用多个 Attention 头,模型能够学习到数据不同方面的表示,从而更全面地捕捉序列中的关系。这种多头机制在提高模型的性能、泛化能力和处理复杂任务方面都发挥了重要作用。

5. 位置编码

位置编码 (Positional Encoding) 2 是为了在 Transformer 等无法处理序列顺序信息的模型中引入位置信息而设计的一种技术。由于 Transformer 没有像循环神经网络 RNN 那样的内在顺序感知,因此位置编码的目的是为模型提供有关输入序列中元素位置的信息。
在这里插入图片描述

位置编码的一种常见形式是通过将位置信息嵌入到输入向量中来实现,这个向量的设计通常基于三角函数或正弦余弦函数,以确保模型能够学到有关序列位置的有用信息。以正弦余弦函数为例,对 Input Embedding 中每个位于 p o s pos pos 的字符和字符中的位置 i i i,位置编码的计算方式如下 3
PE ( p o s , 2 i ) = sin ⁡ ( p o s 10000 2 i / d ) PE ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 10000 2 i / d ) \text{PE}(pos, 2i) = \sin\left(\frac{pos}{{10000}^{2i/d}}\right)\\ \text{PE}(pos, 2i+1) = \cos\left(\frac{pos}{{10000}^{2i/d}}\right) PE(pos,2i)=sin(100002i/dpos)PE(pos,2i+1)=cos(100002i/dpos)
其中, PE \text{PE} PE 是位置编码, p o s pos pos 是当前字符在输入文本中的位置, i i i 是当前字符编码某一位置的索引, d d d 是 Input Embedding 中每个字符编码的维度。这种位置编码的设计允许模型在不同位置和不同维度上学到有关位置的信息。

在训练过程中,这些位置编码与输入嵌入相加,从而将位置信息引入模型。位置编码的选择是可学习的,因此模型可以根据任务学到最适合的位置表示。通过引入位置编码,Transformer 能够更好地处理序列中元素的顺序关系,从而更好地捕捉长距离的依赖关系。

二. Transformer

Transformer4 是一种神经网络架构,引入了 Self-Attention 机制,允许模型同时处理输入序列中的所有位置信息,而无需使用循环神经网络或卷积神经网络。Transformer 的核心部分是 Encoder 和 Decoder 块:编码器接收一段输入序列,进行一系列的自注意力和全连接网络操作,并输出一段连续的表示;解码器部分接受编码器的输出以及之前解码器的输出,生成新的输出。

在这里插入图片描述

1. Input Block

Transformer 将输入文本分词然后编码为词向量序列,也就是 Input Embedding。词向量可以是 word2vec、GloVe、one-hot 等编码形式,不同词向量都具有相同的维度。处理好 Input Embedding 后需要给每个词向量添加位置编码,来保留输入文本内部的相对位置信息。以输入文本 “Tom chase Jerry” 为例,Input Block 内部如下:
在这里插入图片描述

Input Embedding 和 Output Embedding 都属于 Input Block,只有在训练期间才会接收 Output Embedding 输入,进行预测时 Output Embedding 不接受输入。

2. Encoder Block

Encoder Block 由多个 Encoder 堆叠而成,每个 Encoder 内部包括 Multi-Head Attention 和 Feed Forward:
在这里插入图片描述

Multi-Head Attention 就是在 Self-Attention 的基础上,使用多组 WQ、WK、WV 得到多组 Query、Keys、Values,然后每组分别计算得到一个 Z 矩阵,最后进行拼接。
在这里插入图片描述

Feed Forward 是一个普通的全连接网络,依次做线性、ReLU 非线性等变换。

Multi-Head Attention 和 Feed Forward 后面都加入了 Add 和 Normalize 层:Add 层就是在 Z 的基础上添加残差块 X(其实就是 Multi-Head Attention 的输入 X),防止在深度神经网络训练中发生退化问题;Normalize 层用于对输入数据 Normalize 归一化,从而加快训练速度、提高训练的稳定性。

3. Decoder Block

Decoder 的输入分训练和预测两种:训练时的输入就是已经准备好的 target 数据,例如翻译任务中 Encoder 输入"Tom chase Jerry",Decoder 输入 “汤姆追逐杰瑞”;预测时的输入则是上一时刻 Transformer 的输出。

Decoder Block 相较于 Encoder Block 只增加了 Masked Multi-Head Attention:
在这里插入图片描述
Masked Multi-Head Attention 就是在 Multi-Head Attention 的基础上多加了一个 mask 码,对部分值进行掩盖使其在参数更新时不产生效果。

4. Output Block

Output Block 结构简单:先经过一次线性变换,然后 Softmax 就可以得到输出的概率分布。


  1. 史上最小白之Attention详解 ↩︎

  2. transformer学习笔记:Positional Encoding(位置编码) ↩︎

  3. Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[J]. Advances in neural information processing systems, 2017, 30. ↩︎

  4. 史上最小白之Transformer详解 ↩︎

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

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

相关文章

再见了Future,图解JDK21虚拟线程的结构化并发

Java为我们提供了许多启动线程和管理线程的方法。在本文中,我们将介绍一些在Java中进行并发编程的选项。我们将介绍结构化并发的概念,然后讨论Java 21中一组预览类——它使将任务拆分为子任务、收集结果并对其进行操作变得非常容易,而且不会不…

Unity中Shader黑白阀值后处理效果

文章目录 前言一、我们先来PS看一下黑白阀值的效果二、使用step(a,b)函数实现效果三、实现脚本控制黑白阀值1、在Shader属性面板定义控制阀值变量2、把step的a改为_Value3、在后处理脚本设置公共成员变量,并且设置范围为(0,1)4、在Graphics.B…

Cocos Creator:创建棋盘

Cocos Creator:创建棋盘 创建地图三部曲:1. 创建layout组件2. 创建预制体Prefab,做好精灵贴图:3. 创建脚本LayoutSprite.ts收尾工作: 创建地图三部曲: 1. 创建layout组件 使用layout进行布局,…

四十三、Redis基础

目录 一、认识NoSql 1、定义: 2、常见语法 3、与关系型数据库(SQL)的区别: 二、认识Redis 1、定义: 2、特征: 3、Key的结构: 三、安装Redis 四、Redis常见命令 1、数据结构介绍 2、…

关于DNS服务器地址总是127.0.0.1且无法解析域名地址

问题 笔者尝试nslookup解释域名时,出现服务器变成本地环回口地址,导致无法解析域名 C:\Users\Zsy>nslookup www.baidu.com 服务器: UnKnown Address: 127.0.0.1*** UnKnown 找不到 www.baidu.com: Server failed排查思路 尝试关闭虚拟网卡&#…

CSS的逻辑组合伪类

CSS 的逻辑组合伪类有 4 种,分别是::not()、:is()、:where()和:has()。 否定伪类:not() :not 伪类选择器用来匹配不符合一组选择器的元素。由于它的作用是防止特定的元素被选中,它也被称为反选伪类(negation pseudo-…

自动化测试框架 —— pytest框架入门篇

今天就给大家说一说pytest框架。 今天这篇文章呢,会从以下几个方面来介绍: 01、pytest框架介绍 pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持非常丰富的插件,同时兼容 unittest 框架。…

【C++】:AVL树

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关多态的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结…

用python 网络自动化统计交换机有多少端口UP

用python统计交换机有多少端口UP 用python统计交换机有多少端口UP,可以间接的反馈有多少个用户在线。我们使用上次的脚本将可达的网络设备ip统计到reachable_ip.txt中,这次我们使用reachable_ip.txt来登陆设备来统计多少端口是UP的 云配置 拓扑 交换机…

【Cisco Packet Tracer】VLAN通信 多臂/单臂路由/三层交换机

在进行本文的实验之前,请确保掌握以下内容: 【Cisco Packet Tracer】交换机 学习/更新/泛洪/VLAN实验 【Cisco Packet Tracer】路由器实验 静态路由/RIP/OSPF/BGP 【Cisco Packet Tracer】路由器 NAT实验 本文介绍VLAN间的通信方法, 包括…

FreeRTOS的任务优先级、Tick以及状态讲解(尊敬的嵌入式工程师,不妨进来喝杯茶)

任务优先级和Tick 在FreeRTOS中,任务的优先级和Tick是两个关键的概念,它们直接影响任务的调度和执行。 任务优先级 每个任务都被分配一个优先级,用于决定任务在系统中的调度顺序。 优先级是一个无符号整数,通常从0开始&#xff0…

Mysql- 流程函数-(If, CASE WHEN)的使用及练习

目录 4.1 If函数语法格式 4.2 CASE WHEN 条件表达式格式 4.3 update与 case when 4.4 练习题1 4.5 练习题2 4.6 练习题3-行转列 4.7 牛客练习题 4.8 LeetCode练习题 4.1 If函数语法格式 IF(expr1,expr2,expr3) 解释&#xff1a; 如果表达式expr1true(expr1 <>…

Xcode doesn’t support iOS 16.6

xocde版本低&#xff0c;手动放入16.6的依赖文件 https://gitee.com/qiu1993/iOSDeviceSupport/blob/master/iOS16/16.6.zip 路径 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

分割回文串

分割回文串 描述 : 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 题目 : LeetCode 131.分割回文串 : 131. 分割回文串 分析 : 字符串如何判断回文本…

20 Redis进阶 - 运维监控

1、理解Redis监控 Redis运维和监控的意义不言而喻&#xff0c;可以以下三个方面入手 1.首先是Redis自身提供了哪些状态信息&#xff0c;以及有哪些常见的命令可以获取Redis的监控信息; 2.一些常见的UI工具可以可视化的监控Redis; 3.理解Redis的监控体系;2、Redis自身状态及命…

Vue3-02-ref() 响应式详解

ref() 是什么 ref() 是一个函数&#xff1b; ref() 函数用来声明响应式的状态&#xff08;就是来声明变量的&#xff09; ref() 函数声明的变量&#xff0c;是响应式的&#xff0c;变量的值改变之后&#xff0c;页面中会自动重新渲染。ref() 有什么特点 1.ref() 可以声明基础…

VUE语法--toRefs与toRef用法

1、功能概述 ref和reactive能够定义响应式的数据&#xff0c;当我们通过reactive定义了一个对象或者数组数据的时候&#xff0c;如果我们只希望这个对象或者数组中指定的数据响应&#xff0c;其他的不响应。这个时候我们就可以使用toRefs和toRef实现局部数据的响应。 toRefs是…

MIT线性代数笔记-第28讲-正定矩阵,最小值

目录 28.正定矩阵&#xff0c;最小值打赏 28.正定矩阵&#xff0c;最小值 首先正定矩阵是一个实对称矩阵 由第 26 26 26讲的末尾可知正定矩阵有以下四种判定条件&#xff1a; 所有特征值都为正左上角所有 k k k阶子矩阵行列式都为正&#xff08; 1 ≤ k ≤ n 1 \le k \le n …

DDD系列 - 第6讲 仓库Repository及Mybatis、JPA的取舍(一)

目录 一、领域层定义仓库接口1.1 设计聚合1.2 定义仓库Repository接口二 、基础设施层实现仓库接口2.1 设计数据库2.2 集成Mybatis2.3 引入Convetor2.4 实现仓库三、回顾一、领域层定义仓库接口 书接上回,之前通过一个关于拆解、微服务、面向对象的故事,向大家介绍了如何从微…

58.Nacos源码分析2

三、服务心跳。 3.服务心跳 Nacos的实例分为临时实例和永久实例两种&#xff0c;可以通过在yaml 文件配置&#xff1a; spring:application:name: order-servicecloud:nacos:discovery:ephemeral: false # 设置实例为永久实例。true&#xff1a;临时; false&#xff1a;永久ser…