NLP模型(五)——Transformer模型介绍

news2024/9/24 11:26:44

文章目录

  • 1. Transformer结构
  • 2. Encoder结构
    • 2.1 Transformer输入
    • 2.2 相对位置编码
    • 2.3 Self-Attention
    • 2.4 Multi-Head Attention
    • 2.5 Encoder 整体
  • 3. Decoder结构
    • 3.1 带Mask的Multi-Head Attention
    • 3.2 Multi-Head Attention
  • 4. 预测层

1. Transformer结构

Transformer的结构如下所示:

在这里插入图片描述

左边是编码器结构,负责将信息编码为向量,右边是解码器结构,将向量解码成需要的信息,该结构可以抽象为:
在这里插入图片描述

2. Encoder结构

2.1 Transformer输入

Transformer 中单词的输入表示 x由单词 Embedding 和位置 Embedding 相加得到。

其中单词的 Embedding 有很多种方式可以获取,例如可以采用 Word2Vec、Glove 等算法预训练得到,也可以在 Transformer 中训练得到。

Transformer 中除了单词的 Embedding,还需要使用位置 Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。 所以 Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。

该过程如下:

在这里插入图片描述

位置编码的方法由很多,接下来我们介绍几种常用的。

  • 方法一

    这个方法的分配方式是,将0-1这个范围的,将第一个token分配0,最后一个token分配去1,其余的token按照文章的长度平均分配。具体形式如下:

    我喜欢吃洋葱 【0 0.16 0.32…1】
    我真的不喜欢吃洋葱【0 0.125 0.25…1】

    问题:我们可以看到,如果句子长度不同,那么位置编码是不一样,所以无法表示句子之间有什么相似性。

  • 方法二

    这个方法比较直观,就是按照输入的顺序,一次分配给token所在的索引位置。具体形式如下:

    我喜欢吃洋葱 【1,2,3,4,5,6】

    问题:往往句子越长,后面的值越大,数字越大说明这个位置占的权重也越大,这样的方式无法凸显每个位置的真实的权重。

过去的方法总有这样或者那样的不好,所以Transformer对于位置信息的编码做了改进。

一种好的位置编码方案需要满足以下几条要求:

  • 它能为每个时间步输出一个独一无二的编码;
  • 不同长度的句子之间,任何两个时间步之间的距离应该保持一致;
  • 模型应该能毫不费力地泛化到更长的句子。它的值应该是有界的;
  • 它必须是确定性的。

2.2 相对位置编码

相对位置即关注一个token与另一个token距离差几个token。比如:位置1和位置2的距离比位置3和位置10的距离更近,位置1和位置2与位置3和位置4都只相差1。

还是按照上面"我喜欢吃洋葱"中的“我”为例,看看相对位置关系是什么样子的:

在这里插入图片描述

我们可以看到,使用相对位置的方法,我们可以清晰的知道单词之间的距离远近的关系。

Transformer的作者们提出了一个简单但非常创新的位置编码方法,能够满足上述所有的要求。首先,这种编码不是单一的一个数值,而是包含句子中特定位置信息的 d 维向量(非常像词向量),向量如下:

p i → = [ sin ⁡ ( ω 1 ⋅ t ) cos ⁡ ( ω 1 ⋅ t ) sin ⁡ ( ω 2 ⋅ t ) cos ⁡ ( ω 2 ⋅ t ) ⋮ sin ⁡ ( ω d / 2 ⋅ t ) cos ⁡ ( ω d / 2 ⋅ t ) ] \overrightarrow{p_i}=\left[\begin{array}{c}\sin(\omega_1\cdot t)\\\cos(\omega_1\cdot t)\\\sin(\omega_2\cdot t)\\\cos(\omega_2\cdot t)\\\vdots\\\sin(\omega_{d/2}\cdot t)\\\cos(\omega_{d/2}\cdot t)\end{array}\right] pi = sin(ω1t)cos(ω1t)sin(ω2t)cos(ω2t)sin(ωd/2t)cos(ωd/2t)

其中,频率 w k w_k wk 定义如下:

ω k = 1 1000 0 2 k / d \omega_{k}=\frac{1}{10000^{2k/d}} ωk=100002k/d1

d d d 表示向量维度,这里的 t t t 就是每个 t o k e n token token的位置,比如说是位置1,位置2,以及位置n。

将这个向量与模型的嵌入词向量 ψ ( w t ) \psi\left(w_{t}\right) ψ(wt) 直接相加喂给模型: ψ ′ ( w t ) = ψ ( w t ) + p t ′ → \psi'\left(w_t\right)=\psi\left(w_t\right)+\overrightarrow{p_t^{\prime}} ψ(wt)=ψ(wt)+pt

为了保证这种相加操作正确,让位置向量(PE)的维度等于词向量(WE)的维度。

问题:这样的方式虽说可以表示出相对的距离关系,但是也是有局限的。其中一个比较大的问题是:只能的到相对关系,无法得到方向关系。所谓的方向关系就是,对于两个token谁在谁的前面,或者谁在谁的后面是无法判断的。

2.3 Self-Attention

Transformer中编码器和解码器都含有Self-Atteention的结构,在这里我们就先介绍Self-Attention的计算。

Self-Attention的结构如下:

在这里插入图片描述

在计算的时候需要用到矩阵 Q(查询), K(键值), V(值)。在实际中,Self-Attention 接收的是输入(单词的表示向量 x组成的矩阵 X) 或者上一个 Encoder block 的输出。而 Q, K, V 正是通过 Self-Attention 的输入进行线性变换得到的。

首先,我们有一个由输入单词组成的矩阵 X ,其每一行都代表每一个单词的表示,然后将其使用线性变换矩阵WQ, WK, WV 计算得到 Q, K, V,如下如所示。

在这里插入图片描述

得到矩阵 Q, K, V之后就可以计算出 Self-Attention 的输出了,计算的公式如下:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V

其中 d k d_k dkQ, K 矩阵的列数,即向量维度,为了防止内积过大,因此除以 d k \sqrt{d_k} dk ,得到的矩阵 Q K T QK^T QKT 行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的 attention 强度。

得到 Q K T QK^T QKT之后,使用 Softmax 计算每一个单词对于其他单词的 attention 系数,公式中的 Softmax 是对矩阵的每一行进行 Softmax,即每一行的和都变为 1。

在这里插入图片描述

得到 Softmax 矩阵之后可以和 V相乘,得到最终的输出矩阵 Z

在这里插入图片描述

上图中 Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数,最终单词 1 的输出 Z1 等于所有单词 i 的值 Vi 根据 attention 系数的比例加在一起得到,如下图所示:
在这里插入图片描述

2.4 Multi-Head Attention

Multi-Head Attention 是由多个 Self-Attention 组合形成的,其结构如下:

在这里插入图片描述

从上图可以看到 Multi-Head Attention 包含h个 Self-Attention 层,首先将输入 X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵 Z。下图是 h=8 时候的情况,此时会得到 8 个输出矩阵 Z

在这里插入图片描述

得到 8 个输出矩阵 Z1 到 Z8 之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个 Linear层,得到 Multi-Head Attention 最终的输出 Z

在这里插入图片描述

可以看到 Multi-Head Attention 输出的矩阵 Z与其输入的矩阵 X 的维度是一样的。

2.5 Encoder 整体

因为每个Encoder的结构都是一样的,所以我们单独看一个Encoder的结构,单独的Encoder结构如下图红框所示:

在这里插入图片描述

可以看到Encoder是由Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm 组成的,Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:

LayerNorm ( X + MultiHeadAttention ( X ) ) LayerNorm ( X + FeedForward ( X ) ) \begin{aligned}\text{LayerNorm}&\big(X+\text{MultiHeadAttention}(X)\big)\\\text{LayerNorm}&\big(X+\text{FeedForward}(X)\big)\end{aligned} LayerNormLayerNorm(X+MultiHeadAttention(X))(X+FeedForward(X))

AddX+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到。

Norm指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

Feed Forward 层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下:

max ⁡ ( 0 , X W 1 + b 1 ) W 2 + b 2 \max(0,XW_1+b_1)W_2+b_2 max(0,XW1+b1)W2+b2

X是输入,Feed Forward 最终得到的输出矩阵的维度与 X 一致。

3. Decoder结构

在这里插入图片描述

上图红色部分为 Transformer 的 Decoder block 结构,与 Encoder block 相似,但是存在一些区别:

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

3.1 带Mask的Multi-Head Attention

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

Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。下面以 “我有一只猫” 翻译成 “I have a cat” 为例,了解一下 Masked 操作。那么在预测第 i 个输出时,就要将第 i+1 之后的单词掩盖住,注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的,下面用 0 1 2 3 4 5 分别表示 “<Begin> I have a cat <end>”

输入矩阵包含 “<Begin> I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。

在这里插入图片描述

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

在这里插入图片描述
在得到 Q K T QK^T QKT 之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用 Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:

在这里插入图片描述

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

使用 Mask Q K T QK^T QKT 与矩阵 V相乘,得到输出 Z,则单词 1 的输出向量 Z1 是只包含单词 1 信息的。

在这里插入图片描述

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

3.2 Multi-Head Attention

这里的多头注意力的具体细节和encoder是相同的,唯一的区别就是,encoder的多头注意力里的Q、K、V是初始化多个不同的 矩阵得到的。而decoder的K、V是来自于encoder的输出,Q是上层Masked Self-Attention的输出。

如果解码部分的多头注意力有多层,那么输入到每层多头注意力里的K、V都来自于encoder。除了第一层的Q来自于masked Multi-Head Attention的输出,其余的Q都来自于上层dncoder的输出。

4. 预测层

最后使用一个线性层和Softmax层对下一个单词的概率进行预测。

我们假设自己的模型从训练数据集中共学会了10,000个不同的英语单词(我们模型的“输出词汇表”)。这将使线性层的宽度变为10,000个单元,每个单元对应各个单词的得分。我们将会通过这样的方式来解释模型的输出。

然后,softmax层将会把这些分数转换为概率(全部为正数,各项相加和为1.0)。概率最高的单元被选中,且与该单元相关联的单词将成为该步的输出。

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

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

相关文章

go锁--读写锁

每个锁分为读锁和写锁&#xff0c;写锁互斥 没有加写锁时&#xff0c;多个协程都可以加读锁 加了写锁时&#xff0c;无法加读锁&#xff0c;读协程排队等待 加了读锁&#xff0c;写锁排队等待 w:互斥锁作为写锁 writerSem:作为写协程队列 readerSem:作为读协程队列 readerCoun…

Linkedin营销小技巧,开发客户必看

众所周知&#xff0c;Linkedin是发展业务、拓展人脉的好地方&#xff0c;在过去的一年里&#xff0c;93%的B2B营销人员最常使用该平台来有机分发内容。Linkedin也因为能产生较好的营销效果而成为跨境业务开发的选择平台。 有些企业可以使用Linkedin向潜在用户进行营销和接触&a…

Leetcode1006笨阶乘

思路&#xff1a;以4为一个分组分别进行处理 class Solution:def clumsy(self, n: int) -> int:answer_dict {0:0,1: 1, 2: 2, 3: 6, 4: 7}if n > 4:answer n * (n - 1) // (n - 2) n - 3n - 4else:print(answer_dict[n])return answer_dict[n]print(answer)while n …

2023年京东方便食品行业数据分析(京东数据报告)

​疫情中方便食品的销售一度火爆&#xff0c;但随着当前消费场景的开放&#xff0c;方便食品销售又恢复常态并开始下滑。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份&#xff0c;京东平台方便食品的销量为800万&#xff0c;环比降低约23%&#xff0c;同比降…

基于Spring Boot的人才公寓管理系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的人才公寓管理系统设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

【Vue3 知识第四讲】数据双向绑定、事件绑定、事件修饰符详解

文章目录 一、数据双向绑定二、事件绑定详解2.1 **Vue中的事件绑定指令**2.2 **事件函数的调用方式**2.3 **事件函数参数传递** 三、事件修饰符3.1 **Vue中常用的事件修饰符**3.2 **按键修饰符** 四、属性绑定五、类与样式的绑定5.1 class 类的绑定5.2 style 样式绑定 一、数据…

数据库知识3

DML 语言 SQL 语言 DDL语言 数据库定义语言 创 create 改 alter 删 dropDML语言 数据库操作语言 对表中的数据进行操做 增 insert 删 delete 改 update insert 插入操作 格式1: insert into 表名(列名1&#xff0c;列名2&#xff0c;…) values(values1&#xff0c;values2&…

【全国大学生IoT设计竞赛】安谋科技赛题三等奖分享:灵飞云卫——基于MM32F5的IOT智慧门禁系统

本文参加极术社区和灵动微电子组织的【有奖征集】分享作品传播技术成果&#xff0c;更有奖品等你来领&#xff01;线上征集活动。 2023年全国大学生物联网设计竞赛已经落下帷幕&#xff0c;下面将为大家分享我们的作品。 团队介绍 参赛单位&#xff1a;河海大学 队伍名称&…

图 Graph

关键词&#xff1a;图、邻接矩阵、邻接表、广度优先搜索、最短路径、深度优先搜索、拓扑排序、最小生成树、单源最短路径、Dijkstra算法、 图的表示 图的两种表示方法&#xff1a;邻接矩阵表示和邻接表表示。 图的广度优先搜索 可处理无向图或有向图 从起始顶点s出发的广度优…

群晖NAS:DS Video、Jellyfin等视频电影电视剧海报、背景墙搜刮器

群晖NAS&#xff1a;DS Video、Jellyfin等视频电影电视剧海报、背景墙搜刮器 本文只使用豆瓣插件方式&#xff0c;系统默认的 The Movie Database 好注册&#xff0c;但是授权码输入后域名不通过&#xff0c;很麻烦。 1、插件地址&#xff1a; https://www.aliyundrive.com/s…

visual studio编写DLL,python调用

选择第一个c DLL&#xff0c; 然后项目源文件下右击新建项&#xff0c;这里名字随便取&#xff0c;在代码中输入一下内容&#xff1a; #include <iostream>#define EXPORT extern "C" __declspec(dllexport)EXPORT int sub(int a, int b) {return a - b; } 在…

虚幻引擎4中关于设置关于体坐标系下的物体速度的相关问题

虚幻引擎4中关于设置关于体坐标系下的物体速度的相关问题 文章目录 虚幻引擎4中关于设置关于体坐标系下的物体速度的相关问题前言全局坐标系转体坐标系速度设置X轴方向的体坐标系速度设置Y轴方向的体坐标系速度XY轴体坐标系速度整合 Z轴速度的进一步设置解决办法 小结 前言 利…

图扑软件 | 参展用友 2023 全球商业创新大会

2023 年 8 月 18 日&#xff0c;以“数据驱动&#xff0c;智能运营”为主题的用友 2023 全球商业创新大会&#xff0c;在上海国家会展中心圆满举行。此次大会旨在汇聚全球商业智慧&#xff0c;用数智化创新客户价值、释放企业潜能&#xff0c;助力更多的企业成为数智企业。 图…

运动耳机需要具备哪些功能、挂耳式运动蓝牙耳机推荐

作为运动爱好者&#xff0c;长时间的运动很容易枯燥&#xff0c;所以我会选择佩戴耳机来缓解运动的枯燥感&#xff0c;一款好的运动耳机可以让运动变得更加激情&#xff0c;还可以更好的享受运动的乐趣。 但现在的运动耳机产品实在是五花八门&#xff0c;到底什么样的运动蓝牙耳…

ssm+vue框架的购物网站源码和论文

ssmvue框架的购物网站源码和论文113 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归…

Node 执行命令时传参 process.argv

process 对象是一个全局变量&#xff0c;提供当前 Node.js 进程的有关信息&#xff0c;以及控制当前 Node.js 进程。 因为是全局变量&#xff0c;所以无需使用 require()。 process.argv 属性返回一个数组&#xff0c;这个数组包含了启动Node.js进程时的命令行参数&#xff0c…

仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增列赋值

达梦数据库&#xff0c;对自增主键赋值插入&#xff0c;报错仅当指定列列表&#xff0c;且SET IDENTITY_INSERT为ON时&#xff0c;才能对自增列赋值&#xff1b; INSERT INTO cloud.account (id, uuid, account_name, type, role_id, domain_id, account."default")…

python实现个税计算器

本文主要内容&#xff1a;实现个税计算器 这里要用到两个计算公式&#xff1a; 1.应纳税所得额 工资金额 &#xff0d; 各项社会保险费 - 起征点(3500元) 2.应纳税额 应纳税所得额 税率 &#xff0d; 速算扣除数 税率按照以下表格计算&#xff1a; 代码如下&#xff1a;…

恒流电路的三种设计方案

作为硬件研发工程师相信对恒流电路不会陌生&#xff0c;本文介绍下三种恒流电路的原理图。 三极管恒流电路 三极管恒流电路 三极管的恒流电路&#xff0c;主要是利用Q2三极管的基级导通电压为0.6~0.7V这个特性&#xff1b;当Q2三极管导通&#xff0c;Q1三极管基级电压被拉低而…

链表OJ练习(1)

一、移除链表元素 本题为力扣原题203 题目介绍&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 列表中的节点数目范围在 0~10000内 1<Node.val<50 0<val<50 …