自注意力机制(Self-Attention)

 注意:本文引用自专业人工智能社区Venus AI
更多AI知识请参考原站(【http://www.aideeplearning.cn】)

Transformer模型中最关键部分就是自注意力(Self-Attention)机制,正如 Transformer 的论文的标题是“Attention Is All You Need”!以文本问题为例来讲解这个机制。在处理文本问题时,自注意力机制会告诉模型:在处理句子中的每个单词时,特别关注某些重要的单词,并或多或少地忽略其它单词。简单来说,就是给句子中不同单词分配不同的权重。这是符合常理的,因为一句话中的每个单词重要程度是不一样的,从语法角度说,主谓宾语比其它句子成分更重要,self-attention机制就是模型尝试学习句子成分重要程度的方法。

self-attention可以通过学习句子成分重要程度更好的理解语言的上下文,而上下文对于语言模型来说是至关重要的。例如,看一下机器人第二定律:

机器人第二定律机器人必须服从人类发出的命令,除非这些命令第一定律相冲突。

当模型处理这句话时,它必须能够知道:

  • 指的是机器人
  • 这种命令指的是法律的前半部分,即“人类发出的命令”
  • 第一定律指的是整个第一定律

如果不结合它们所指的上下文,就无法理解或处理这些单词。这就是自注意力的作用。它加深了模型对相关和关联词的理解,这些词在处理某个词(将其通过神经网络传递)之前解释了该词的上下文。它通过为片段中每个单词的相关程度分配分数,并将它们的向量表示相加来实现这一点。

例如,顶部块中的自注意力层在处理“it”一词时正在关注“a robots”。它将传递给神经网络的向量是三个单词中每个单词的向量乘以它们的权重分数的总和(这里忽略了那些权重分数低的不重要的单词)。

自注意力过程(self-attention)

自注意力机制重要组成部分是三个向量:

  • query:在注意力机制中,查询表示当前正在处理的单词或token的表示方式。它用于评估与其他单词之间的相关性。简而言之,查询是我们要关注的中心对象。
  • key:键向量是对文本中所有单词的标签或描述。它类似于我们用来在搜索相关单词时进行匹配的内容。在注意力机制中,我们会使用查询和键之间的关系来确定不同单词之间的相关性。
  • value:值向量是实际的单词表示方式,通常是通过神经网络学习得到的。一旦我们使用查询和键来评估不同单词之间的相关性,我们将使用这些值向量来计算当前单词的最终表示。值向量会被加权组合,以代表当前单词的含义或重要性。

这三个向量的创建过程在模型实现时非常简单,通过神经网络层的映射即可得到。具体来说,输入数据为token本身(假设64维),而映射后的输入向量可以是192维,此时第0-63维作为q向量,64-127维作为k向量,而128-192维作为v向量。请注意,查询向量、键向量和值向量是为计算和思考注意力机制而抽象出的概念,或者说是我们对模型的学习期望。因为这三个新向量在刚创建时是随机初始化的,没有特殊含义,是经过模型训练分别得到了类似查询、回复、存值等向量功能,一个词向量可以通过它们与其它词向量进行互动来建模词与词之间的相关性。在读者阅读完接下来的全部计算过程之后,就会明白它们名字的由来。

一个粗略的类比是将其想象为在文件柜中搜索。该查询就像一张便签纸,上面写着您正在研究的主题。钥匙就像柜子内文件夹的标签。当你将标签与便签匹配时,我们取出该文件夹的内容,这些内容就是值向量。只不过您不仅要查找一个值,还要从多个文件夹中进行相关内容的查找。

每个文件夹的权重分数是通过查询向量与正在评分的相应单词的键向量的点积计算得出的。点积的公式:a×b=|a|×|b|×cosθ。其意义就是比较两个向量的相关程度,相关性越高,分数越大。注意,点积后需要对结果进行softmax映射得到权重分数,Softmax映射后的分数决定了每个词在句子中某个位置的重要性。

图片[3]-自注意力机制(Self-Attention)-VenusAI

我们将每个值向量乘以它的权重分数并求和——得到我们的自注意力结果。

图片[4]-自注意力机制(Self-Attention)-VenusAI

这种值向量的加权混合会产生一个向量,该向量将 50% 的“注意力”集中在单词robot,30% 的“注意力”集中在单词a,19% 的“注意力”集中在单词it等等。

自注意力计算到此为止。生成的向量是可以发送到前馈神经网络的向量。然而,在实际的实现中,会将输入向量打包成矩阵,以矩阵形式完成此计算,以便更快地在计算机中计算处理,如下图所示

图片[5]-自注意力机制(Self-Attention)-VenusAI

其公式表示如下:

Attention(Q,K,V)=Softmax(\left(\frac{QK^\mathrm{T}}{\sqrt{d_k}}\right)V)

其中, Q、K 和 V 是输入矩阵, 分别代表查询矩阵、键矩阵和值矩阵, dk 是向量维度。Attention公式的作用是通过对 Q 和 K 的相似度进行加权, 来得到对应于输入的 V 的加权和。
具体来说,这个公式分为三个步骤:
(1)计算 Q 和 K 之间的相似度,即 QK^{T} 。
(2)由于 Q 和 K 的维度可能很大, 因此需要将其除以 \sqrt{d_{k}} 来缩放。这有助于避免在 Softmax 计算时出现梯度消失或梯度爆炸的问题。
(3) 对相似度矩阵进行 Softmax 操作, 得到每个查询向量与所有键向量的权重分布。然后, 将这些权重与值矩阵 V 相乘并相加, 得到自注意力机制的输出矩阵。

多头自注意力层(Multi-heads self-attention)

该论文通过添加一种称为“多头注意力”(Multi-heads self-attention)的机制进一步细化了自注意力层。对于多头注意力,其中有多组查询向量、键向量和值向量,这里把一组q, k, v称之为一个头,Transformer原论文中使用八个注意力头。每组注意力头都是可训练的,经过训练可以扩展模型关注不同位置的能力。

举一个形象的类比:把注意力头类比成小学生,那么多个小学生在学习过程中会形成不同的思维模式,对同样的问题会产生不同的理解。这就是为什么要使用多头的原因,就是希望模型可以从不同的角度思考输入信息,如下图所示。

但是,多头注意力机制也给带来了一个问题。如果使用八个头,经过多头注意力机制后会得到8个输出,但是,实际上只需要一个输出结果。所以需要一种方法将这八个输出压缩成一个矩阵,方法也很简单,将它们乘以一个额外的权重矩阵即可。这个操作可以通过一个神经网络层的映射完成,如图:

图片[7]-自注意力机制(Self-Attention)-VenusAI

掩码自注意力机制(Masked Self-Attention)

在本小节中,我们将详细了解Self-Attention如何完成此操作。并讲解它的变体掩码自注意力机制,这在GPT等语言模型中非常常见。以一个简单的自注意力模块举例,它一次只能处理四个token。

自注意力的应用通过三个主要步骤:

  1. 为每个输入token创建查询、键和值向量。
  2. 对于每个输入token,使用其查询向量针对所有其他键向量进行评分
  3. 将值向量与其相关分数相乘后求和。

图片[8]-自注意力机制(Self-Attention)-VenusAI

为每个token创建q,k,v向量的过程如下,其中Wq,Wk和Wv矩阵可以看成神经网络层的参数,也就是说我们可以将token x经过神经网络层的映射得到对应的q,k,v向量。

图片[15]-自注意力机制(Self-Attention)-VenusAI

现在我们有了向量,我们在步骤 2 中使用查询向量和键向量进行点积。当前我们专注于第一个token,因此我们将其查询乘以所有其他键向量,然后再经过softmax的映射从而得出四个token中每个token的权重分数。

图片[10]-自注意力机制(Self-Attention)-VenusAI

现在我们可以将分数乘以值向量。在我们将它们相加之后,得分高的值将构成结果向量中占有重要地位。

图片[11]-自注意力机制(Self-Attention)-VenusAI

如果我们对每个输入执行相同的操作,我们最终会得到一个表示每个token的向量,其中包含该token的适当上下文。然后将它们呈现给Transformer块中的下一个子层(前馈神经网络):

图片[7]-自注意力机制(Self-Attention)-VenusAI

现在我们已经了解了 Transformer 的 self-attention 步骤,让我们继续看看 masked self-attention。实际上,masked self-attention与自注意力十分相似,除了第 2 步之外。假设模型只有两个token作为输入,并且我们正在观察第二个token。在这种情况下,最后两个token被屏蔽,其对应的权重分数也将是0。

图片[13]-自注意力机制(Self-Attention)-VenusAI

下面我们进行详细的示例计算推导。这种掩蔽通常通过被称为注意掩蔽的矩阵来实现。如下图所示:

图片[14]-自注意力机制(Self-Attention)-VenusAI

我们举个实例,想象一个由四个单词组成的序列(例如“robot must obey orders”)。先可视化其注意力分数的计算:

图片[15]-自注意力机制(Self-Attention)-VenusAI

相乘之后,我们使用注意掩蔽矩阵。它将我们想要屏蔽的单元格设置为 -无穷大或一个非常大的负数(例如 GPT2 中的 -10 亿):

图片[16]-自注意力机制(Self-Attention)-VenusAI

然后,在每一行上应用 softmax 会产生用于自注意力的实际分数:

图片[17]-自注意力机制(Self-Attention)-VenusAI

这个分数表的含义如下:

  • 当模型处理数据集中的第一个示例(第 1 行)时,该示例仅包含一个单词(“机器人”),其 100% 的注意力将集中在该单词上。
  • 当模型处理数据集中的第二个示例(第 2 行)时,其中包含单词(“机器人必须”),当模型处理单词“必须”时,48% 的注意力将集中在“机器人”上,而 52% 的注意力将集中在“机器人”上。 %的注意力将集中在“必须”上。

最后,让我们介绍 GPT-2 的masked self-attention。实际上,我们可以让 GPT-2 完全按照 masked self-attention 的方式运行。但在评估过程中,当我们的模型在每次迭代后仅添加一个新单词时,沿着已处理的token的早期路径重新计算自注意力将是低效的。

在本例中,我们处理第一个token(<s>暂时忽略)。

图片[18]-自注意力机制(Self-Attention)-VenusAI

对于单词token“a”,GPT-2 保留它的键向量和值向量。实际上,每个自注意力层都保留每个单词token各自的键向量和值向量:

图片[19]-自注意力机制(Self-Attention)-VenusAI

现在,在下一次迭代中,当模型处理单词”robot“时,它不需要为token “a“生成查询、键和值查询。它只是重用第一次迭代中保存的内容:

图片[20]-自注意力机制(Self-Attention)-VenusAI

这种改进的masked self-attention,可以让q,k,v的计算更加高效快速。最后,我们探讨一个GTP-2自注意力机制中的前向网络( 全连接神经网络)。

全连接神经网络:这是一个用于进一步处理自注意力模块输出的神经网络。它通常包括两个层(或称为层次)。

  • 第一层:这一层通常会有大量的节点(神经元)。节点的数量通常设置为输入token的数量的四倍。例如,如果输入文本的token数量是768,那么第一层将有768 * 4 = 3072 个神经元。这个大的第一层可以用来捕捉输入文本中的各种特征和关系。
  • 第二层:第一层的输出被投影回到模型的维度,通常是768(在这个描述中提到了GPT-2模型的维度)。这意味着第二层将输出一个与模型维度相匹配的结果,以便与其他模型部分进行连接和整合。

图片[21]-自注意力机制(Self-Attention)-VenusAI

相关资源

  • 自注意力机制详解
  • Transformer算法讲解
  • OpenAI 的GPT2博文讲解
  • OpenAI 的GPT3博文讲解
  • Bert,ELMo大语言模型
  • 除了 GPT2 之外,还可以查看Hugging Face的pytorch-transformers库,它实现了 BERT、Transformer-XL、XLNet 等前沿 Transformer 模型。
  • 本博文的插图来自于Jay Alammar的博客,在此给予真诚的感谢。

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

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

相关文章

【Vue3】函数式编程(h 函数)

h 函数的原理就是 createVNode。可以使用 h 函数封装一些小组件。 <template><table border><tr><th>name</th><th>age</th><th>操作</th></tr><tr v-for"item in list" :key"item.age"&…

shell封装

shift 命令用于对参数的移动(左移)&#xff0c;通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理&#xff08;常见于Linux中各种程序的启动脚本&#xff09; shift(shift 1) 命令每执行一次&#xff0c;变量的个数($#)减一&#xff0c;移动2位可以 执行…

数据结构实现-线性表

顺序存储 #include<iostream> using namespace std; #define MaxSize 50 //静态顺序表 template<typename ElemType> struct sqList{ElemType data[MaxSize];//元素int length;//长度 }; //动态顺序表 #ifdef DEBUG //关闭启用 #define InitSize 100 template<…

嵌入式LINUX移植、配置ssh

编译 https://quantum6.blog.csdn.net/article/details/136299665 编译时指定prefix&#xff0c;产生的文件会自带这个目录。所以直接忽略。 ./configure# 不指定编译路径&#xff0c;手动复制。 复制 编译后的整个目录打包&#xff0c;复制到开发板。写个脚本&#xff0c…

kamacoder13.镂空三角形的C语言解法

13. 镂空三角形 时间限制&#xff1a;1.000S 空间限制&#xff1a;32MB 题目描述 把一个字符三角形掏空&#xff0c;就能节省材料成本&#xff0c;减轻重量&#xff0c;但关键是为了追求另一种视觉效果。在设计的过程中&#xff0c;需要给出各种花纹的材料和大小尺寸的三角…

零拷贝技术深入分析

一、零拷贝 在前面的文章“深浅拷贝、COW及零拷贝”中对零拷贝进行过分析&#xff0c;但没有举例子&#xff0c;也没有深入进行展开分析。本文将结合实际的例程对零拷贝进行更深入的分析和说明。 在传统的IO操作中&#xff0c;以文件通过网络传输为例 &#xff0c;一般会经历以…

go语言是如何连接mysql数据库的?

在 Go 语言中连接 MySQL 数据库通常使用第三方库。目前比较流行的 MySQL 客户端库包括 github.com/go-sql-driver/mysql、github.com/go-xorm/xorm、github.com/jmoiron/sqlx 等。下面是一个使用 github.com/go-sql-driver/mysql 库连接 MySQL 数据库的简单示例&#xff1a; 首…

GOPATH set to GOROOT (/usr/local/go) has no effect

这个警告信息指出 GOPATH 环境变量被设置为与 GOROOT 相同的值。GOPATH 环境变量用于指定 Go 工作区的位置&#xff0c;而 GOROOT 指定 Go 安装的位置。将 GOPATH 设置为 GOROOT 表示 Go 工作区和 Go 安装位置位于同一目录&#xff0c;这是不推荐的。为了解决此问题&#xff0c…

Zookeeper集群docker部署

集群角色 zookeeper 集群中的机器分为一下三种角色 leader:为客户端提供读写服务(事务性操作)&#xff0c;并维护集群状态&#xff0c;它是由集群选举所产生的&#xff1b; follower:为客户端提供读(非事务性操作)&#xff0c;转发给leader写(事务性操作)&#xff0c;参与选举操…

K8s控制器

控制器: Deployment: Deployment概述: replicaset:自动创建pod的控制器 Delpoyment控制器: pod的名字需要唯一,在这不写名字,利用标签进行创建 replicas:表示你想要克隆的数量,selector:通过标签.识别哪个pod是我创建出来的.这里的标签和后面元数据里的标签要一致. Cluster…

NCDA设计大赛获奖作品剖析:UI设计如何脱颖而出?

第十二届大赛简介 - 未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;开始啦&#xff01;视觉传达设计命题之一: ui 设计&#xff0c;你想知道的都在这里。为了让大家更好的参加这次比赛&#xff0c;本文特别为大家整理了以往NCDA大赛 UI 设计的优秀获奖作品&a…

【探索AI】十四深度学习之第2周:深度神经网络(三)-过拟合与正则化技术

过拟合与正则化技术 过拟合的概念 在机器学习和深度学习的领域中&#xff0c;过拟合&#xff08;Overfitting&#xff09;是一个常见且重要的问题。首先&#xff0c;我们来理解一下什么是过拟合。 过拟合是指模型在训练数据上表现得过于优秀&#xff0c;以至于在训练集上的错…

2024年腾讯云优惠券_代金券_云服务器折扣券免费领取链接

腾讯云优惠代金券领取入口共三个渠道&#xff0c;腾讯云新用户和老用户均可领取8888元代金券&#xff0c;可用于云服务器等产品购买、续费和升级使用&#xff0c;阿腾云atengyun.com整理腾讯云优惠券&#xff08;代金券&#xff09;领取入口、代金券查询、优惠券兑换码使用方法…

【SpringBean】bean的作用域和bean的生命周期

目录 前言 一 bean的作用域 1. singleton——唯一 bean 实例 2. prototype——每次请求都会创建一个新的 bean 实例 3. request——每一次HTTP请求都会产生一个新的bean&#xff0c;该bean仅在当前HTTP request内有效 4. session——每一次HTTP请求都会产生一个新的 bean&…

程序员的金三银四求职宝典!

目录 ​编辑 程序员的金三银四求职宝典 一、为什么金三银四是程序员求职的黄金时期&#xff1f; 二、如何准备金三银四求职&#xff1f; 1. 完善简历 2. 增强技术能力 3. 提前考虑目标公司 4. 提前准备面试 三、程序员求职的常见面试题 1. 数据结构和算法 2. 数据库 …

一次电脑感染Synaptics Pointing Device Driver病毒的经历,分享下经验

没想到作为使用电脑多年的老司机也会电脑中病毒&#xff0c;周末玩电脑的时候突然电脑很卡&#xff0c;然后自动重启&#xff0c;奇怪&#xff0c;之前没出现这个情况。 重启后电脑开机等了几十秒&#xff0c;打开任务管理器查看开机进程&#xff0c;果然发现有个Synaptics Po…

LeetCode 刷题 [C++] 第121题.买卖股票的最佳时机

题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…

php儿童服装销售管理系统计算机毕业设计项目包运行调试

php mysql儿童服装销售网 功能&#xff1a;前台后台 前台&#xff1a; 1.服装资讯 文章标题列表 详情 2.服装选购中心 分页查看图文列表 详情 3.用户注册 登陆 退出 4.服装加入收藏 5.加入购物车 6.对服装进行评论 会员中心&#xff1a; 1.我的账户 查看 修改 2.我的收藏 查看 …

STM32 中断流程介绍

STM32可以产生中断的事件多种多样&#xff0c;比如&#xff1a;定时器时间结束、串口接收到数据、某个GPIO检测到电平变化等等等等。 1、STM32 gpio 中断处理流程介绍 1、从引脚进入的高低电平首先由输入驱动器处理&#xff0c;如下图 2、经过输入驱动器处理后的信号会进…

大数据数据平台的数仓体系分类有哪些?

大数据平台的数仓体系最初由数据库发展而来&#xff0c;主要分为三类架构&#xff0c;分别是Shared-Nothing、Shared-Data、Shared-Everything。 Shared-Nothing&#xff08;也称 MPP&#xff09;架构在 很长一段时间成为主流。 随云原生能力增强&#xff0c;Snowflake 为代表…