【变形金刚01】attention和transformer所有信息

图1.来源:Arseny Togulev在Unsplash上的照片

一、说明

        这是一篇 长文 ,几乎讨论了人们需要了解的有关注意力机制的所有信息,包括自我注意、查询、键、值、多头注意力、屏蔽多头注意力和转换器,包括有关 BERT 和 GPT 的一些细节。因此,我将本文分为两部分。在本文中,我将介绍所有注意力块,在下一个故事中,我将深入探讨变压器网络架构。

二、RNN背景知识提要 

  1. RNN 面临的挑战以及转换器模型如何帮助克服这些挑战
  2. 注意力机制

2.1 自我注意

2.2 查询、键和值

2.3 注意力的神经网络表示

2.4 多头注意力

3. 变形金刚(下篇继续)

2.1 介绍

        注意力机制于2014年首次用于计算机视觉,试图理解神经网络在进行预测时正在查看的内容。这是尝试理解卷积神经网络(CNN)输出的第一步。2015年,注意力首先用于对齐机器翻译中的自然语言处理(NLP)。最后,在2017年,注意力机制被用于Transformer网络中的语言建模。此后,变压器已经超越了递归神经网络(RNN)的预测精度,成为NLP任务的最新技术。

2.2 . RNN 的挑战以及转换器模型如何帮助克服这些挑战

        1.1 RNN 问题 1 — 遇到长期依赖问题。RNN 不适用于长文本文档。

        变压器解决方案 — 变压器网络几乎只使用注意力块。注意力有助于在序列的任何部分之间建立连接,因此长期依赖不再是问题。对于变压器,长期依赖性与任何其他短程依赖性具有相同的可能性。

        1.2. RNN 问题 2 — 遭受梯度消失和梯度爆炸。

        变压器解决方案 — 几乎没有梯度消失或爆炸问题。在变压器网络中,整个序列是同时训练的,并且在此基础上仅添加几层。因此,梯度消失或爆炸很少成为问题。

        1.3. RNN 问题 3 — RNN 需要更大的训练步骤才能达到局部/全局最小值。RNN可以可视化为一个非常深的展开网络。网络的大小取决于序列的长度。这产生了许多参数,并且这些参数中的大多数是相互关联的。因此,优化需要更长的训练时间和很多步骤。

        变压器解决方案 — 比 RNN 需要更少的训练步骤。

        1.4. RNN 问题 4 — RNN 不允许并行计算。GPU 有助于实现并行计算。但是RNN作为序列模型工作,也就是说,网络中的所有计算都是按顺序进行的,不能并行化。

        变压器解决方案 — 变压器网络中没有重复出现,允许并行计算。因此,每一步都可以并行进行计算。

三. 注意力机制

3.1 自我注意

图2.解释自我注意的示例(来源:作者创建的图片)

        考虑一下这句话——“吠叫很可爱,他是一只狗”。这句话有9个单词或标记。如果我们只考虑句子中的“他”这个词,我们会发现“和”是“是两个非常接近它的词。但这些词并没有给“他”这个词任何上下文。相反,“吠叫”和“狗”这两个词与句子中的“他”更相关。由此,我们了解到接近并不总是相关的,但上下文在句子中更相关。

        当这个句子被馈送到计算机时,它将每个单词视为一个标记t,并且每个标记都有一个单词嵌入V。但是这些词嵌入没有上下文。因此,我们的想法是应用某种权重或相似性来获得最终的单词嵌入Y,它比初始嵌入V具有更多的上下文。

        在嵌入空间中,相似的单词看起来更靠近或具有相似的嵌入。比如“国王”这个词会更与“女王”和“皇室”这个词相关,而不是与“斑马”这个词相关。同样,“斑马”与“马”和“条纹”的关系比与“情感”一词的关系更大。要了解有关嵌入空间的更多信息,请访问Andrew Ng(NLP和单词嵌入)的视频。

        因此,直觉上,如果“国王”一词出现在句子的开头,而“女王”一词出现在句子的末尾,它们应该相互提供更好的上下文。我们使用这个想法来找到权重向量 W,通过将单词嵌入相乘(点积)以获得更多的上下文。所以,在句子中,Bark非常可爱,他是一只狗,而不是按原样使用单词嵌入,我们将每个单词的嵌入相乘。图 3 应该能更好地说明这一点。

图3.查找权重并获得最终嵌入(来源:作者创建的图像)

        如图 3 所示,我们首先通过将第一个单词的初始嵌入乘以(点积)与句子中所有其他单词的嵌入来找到权重。这些权重(W11 到 W19)也归一化为总和为 1。接下来,将这些权重乘以句子中所有单词的初始嵌入。

        W11 V1 + W12 V2 + ....W19 V9 = Y1

        W11 到 W19 都是具有第一个单词 V1 上下文的权重。因此,当我们将这些权重乘以每个单词时,我们实际上是在将所有其他单词重新加权到第一个单词。因此,从某种意义上说,“吠叫”这个词现在更倾向于“”和“可爱”这两个词,而不是紧随其后的词。这在某种程度上提供了一些背景。

        对所有单词重复此操作,以便每个单词从句子中的其他单词中获得一些上下文。

图4.上述步骤的图形表示(来源:作者创建的图像)

        图4使用图形图更好地理解了获得Y1的上述步骤。

        有趣的是,没有训练权重,单词的顺序或接近度彼此没有影响。此外,该过程不依赖于句子的长度,也就是说,句子中更多或更少的单词无关紧要。这种为句子中的单词添加一些上下文的方法称为自我注意

3.2 查询、键和值

        自我注意的问题在于没有任何东西被训练。但也许如果我们添加一些可训练的参数,网络就可以学习一些模式,从而提供更好的上下文。此可训练参数可以是训练其值的矩阵。因此,引入了查询、键和值的概念。

        让我们再考虑一下前面的一句话——“吠叫很可爱,他是一只狗”。在自我注意的图 4 中,我们看到初始词嵌入 (V) 使用了 3 次。1st作为句子中第一个单词嵌入和所有其他单词(包括其自身,2nd)之间的点积以获得权重,然后再次将它们(第3次)乘以权重,以获得带有上下文的最终嵌入。这 3 个出现的 V 可以替换为三个术语查询、

        假设我们想使所有单词与第一个单词 V1 相似。然后,我们将 V1 作为查询词发送。然后,这个查询词将对句子中的所有单词(V1 到 V9)做一个点积——这些就是键。因此,查询和键的组合为我们提供了权重。然后将这些权重再次与充当值的所有单词(V1 到 V9)相乘。我们有它,查询,键和值。如果您仍然有一些疑问,图 5 应该能够清除它们。

图5.表示查询、键和值(来源:作者创建的图像)

        但是等等,我们还没有添加任何可以训练的矩阵。这很简单。我们知道,如果将 1 x k 形向量乘以 k x k 形矩阵,我们得到一个 1 x k 形向量作为输出。记住这一点,让我们将每个键从 V1 乘以 V10 到 V1(每个形状为 6 x k),并乘以形状为 k x k 的矩阵 Mk(键矩阵)。类似地,查询向量乘以矩阵 Mq(查询矩阵),值向量乘以值矩阵 Mv。这些矩阵 Mk、Mq 和 Mv 中的所有值现在都可以由神经网络训练,并且比仅仅使用自我注意提供更好的上下文。同样,为了更好地理解,图 <> 显示了我刚才解释的内容的图形表示。

图6.键矩阵、查询矩阵和值矩阵(来源:作者创建的图像)

        现在我们知道了键、查询和值的直觉,让我们看看数据库分析以及注意力背后的官方步骤和公式。

        让我们通过查看数据库的示例来尝试理解注意力机制。因此,在数据库中,如果我们想根据查询 q 和键 k i 检索某个值 vi,可以执行一些操作其中我们可以使用查询来识别对应于某个。注意力可以被认为是与此数据库技术类似的过程,但以更概率的方式。下图对此进行了演示。

        图 7 显示了在数据库中检索数据的步骤。假设我们将一个查询发送到数据库中,一些操作会找出数据库中哪个键与查询最相似。找到密钥后,它将发送与该密钥对应的值作为输出。在图中,该操作发现查询与键 5 最相似,因此为我们提供了值 5 作为输出。

图7.数据库中的值检索过程(来源:作者创建的图像)

        注意力机制是一种模仿这种检索过程的神经架构。

  1. 注意力机制测量查询 q 和每个键值 k i 之间的相似性
  2. 此相似性为每个键值返回一个权重。
  3. 最后,它生成一个输出,该输出是我们数据库中所有值的加权组合。

        从某种意义上说,数据库检索和注意力之间的唯一区别是,在数据库检索中,我们只得到一个值作为输入,但在这里我们得到一个值的加权组合。在注意力机制中,如果查询与键 1 和键 4 最相似,那么这两个键将获得最多的权重,输出将是值 1 和值 4 的组合。

        图 8 显示了从查询、键和值获取最终注意力值所需的步骤。下面将详细解释每个步骤。(键值 k 是向量,相似性值 S 是标量,权重值 (softmax) 值 a 是标量,值 V 是向量)

图8.获得注意力值的步骤(来源:作者创建的图像)

第 1 步。

        步骤 1 包含键和查询以及相应的相似性度量。查询 q 会影响相似性。我们拥有的是查询和键,并计算相似性。相似性是查询 q 和键 k 的某些函数。查询和键都是一些嵌入向量。相似性 S 可以使用各种方法计算,如图 9 所示。

图9.计算相似性的方法(Souce:作者创建的图像)

        相似性可以是查询和键的简单点积。它可以是缩放点积,其中qk的点积除以每个键的维数d的平方根。 这是查找相似性最常用的两种技术。

        通常,使用权重矩阵 W 将查询投影到新空间中,然后使用键 k 创建点积。内核方法也可以用作相似性。

第 2 步。

        第 2 步是查找权重 a。这是使用“SoftMax”完成的。公式如下所示。(exp 是指数级的)

        相似性像完全连接的层一样与权重相连。

第 3 步。

        步骤 3 是 softmax (a) 的结果与相应值 (V) 的加权组合。a 的第一个值乘以 V 的第一个值,然后与 a 的第 1 个值与值 V 的第 2 个值的乘积相加,依此类推。我们获得的最终输出是所需的结果注意力值。

三个步骤的摘要:

W在查询 q 和键 k 的帮助下,我们获得注意值,它是值 V 的加权和/线性组合权重来自查询和键之间的某种相似性。

3.3 注意力的神经网络表示

图 10.注意力块的神经网络表示(来源:作者创建的图像)

图 10 显示了注意力块的神经网络表示。词嵌入首先传递到一些线性层中。这些线性层没有“偏差”项,因此只不过是矩阵乘法。其中一个层表示为“键”,另一个表示为“查询”,最后一个层表示为“值”。如果在键和查询之间执行矩阵乘法,然后进行规范化,我们将得到权重。然后将这些权重乘以值并相加,得到最终的注意力向量。这个块现在可以在神经网络中使用,被称为注意力块。可以添加多个这样的注意力块以提供更多上下文。最好的部分是,我们可以获得梯度反向传播来更新注意力块(键、查询、值的权重)。

3.4 多头注意力

        为了克服使用单头注意力的一些陷阱,使用了多头注意力。让我们回到那句话——“吠叫很可爱,他是一只狗”。在这里,如果我们使用“狗”这个词,从语法上我们理解“吠叫”、“可爱”和“他”应该与“狗”这个词有某种意义或相关性。这些话说,狗的名字叫树皮,是公狗,是一只可爱的狗。仅凭一种注意力机制未必能正确识别出这三个词与“狗”相关,我们可以说,这里用“狗”这个词来表示这三个词更好。这减少了一个注意力查找所有重要单词的负担,也增加了轻松找到更多相关单词的机会。

        因此,让我们添加更多的线性层作为键、查询和值。这些线性层是并行训练的,并且彼此具有独立的权重。所以现在,每个值、键和查询都为我们提供了三个输出,而不是一个。这 3 个键和查询现在提供三种不同的权重。然后用矩阵乘以这三个值,得到三个倍数输出。这三个注意力块最终连接起来,给出一个最终的注意力输出。此表示如图 11 所示。

图 11.具有3个线性层的多头注意力(来源:作者创建的图像)

        但 3 只是我们选择的随机数。在实际场景中,这些可以是任意数量的线性层,这些层称为头部(h)。也就是说,可以有 h 个线性层,给出 h 个注意力输出,然后将其连接在一起。这正是它被称为多头注意力(多头)的原因。图 11 的简化版本,但头部数量为 h 如图 12 所示。

图 12.具有“h”层的多头注意力(来源:作者创建的图片)

        N由于我们了解了注意力、查询、键、值和多头注意力背后的机制和思想,我们已经涵盖了变压器网络的所有重要构建块。在下一个故事中,我将讨论所有这些块如何堆叠在一起形成变压器网络,并讨论一些基于变压器的网络,例如BERT和GPT。

四、引用:

2017. 注意力就是你所需要的一切。第31届神经信息处理系统国际会议论文集(NIPS'17)。Curran Associates Inc.,Red Hook,NY,USA,6000–6010。

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

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

相关文章

Vue3 引用第三方Swiper内容触摸滑动简单应用

去官网查看更多教程→&#xff1a;Swiper官网 → 点击教程在vue中使用Swiper→ 在Vue中使用Swiper cd 到项目 安装Swiper&#xff1a; cnpm install --save swiper 安装指定版本 cnpm install --save swiper8.1.6 9.4.1 10.1.0…

excel 下载方法封装

1.首先需要拿到后端返回的URL下载地址 2.写个下载方法 // url 接口返回的下载地址。例如&#xff1a;https://cancer-research.oss-cn-beijing.aliyuncs.com/yuance-platform-permission/校内共享数据导入模板.xlsx // name 文件名称 例如&#xff1a; 校内共享数据导入模板 /…

若依vue -【 100 ~ 更 ~ 110 】

100 主子表代码生成详解 1 新建数据库表结构&#xff08;主子表&#xff09; -- ---------------------------- -- 客户表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

设计模式——建造者(Builder)模式

建造者模式&#xff08;Builder Pattern&#xff09;&#xff0c;又叫生成器模式&#xff0c;是一种对象构建模式 它可以将复杂对象的建造过程抽象出来&#xff0c;使这个抽象过程的不同实现方法可以构造出不同表现的对象。建造者模式是一步一步创建一个复杂的对象&#xff0c;…

Elasticsearch的一些基本概念

文章目录 基本概念&#xff1a;文档和索引JSON文档元数据索引REST API 节点和集群节点Master eligible节点和Master节点Data Node 和 Coordinating Node其它节点 分片(Primary Shard & Replica Shard)分片的设定操作命令 基本概念&#xff1a;文档和索引 Elasticsearch是面…

【Unity造轮子】制作一个简单的2d抓勾效果(类似蜘蛛侠的技能)

前言 欢迎阅读本文&#xff0c;本文将向您介绍如何使用Unity游戏引擎来实现一个简单而有趣的2D抓勾效果&#xff0c;类似于蜘蛛侠的独特能力。抓勾效果是许多动作游戏和平台游戏中的常见元素&#xff0c;给玩家带来了无限的想象和挑战。 不需要担心&#xff0c;即使您是一…

车载智能座舱开发核心技术——SystemServer

SystemServer在车载开发中扮演着重要角色&#xff0c;它是Android系统的核心组件之一&#xff0c;负责管理和调度其他系统服务。我们这篇内容将对SystemServer技术进行深入解析&#xff0c;并以实战代码示例加以分析&#xff0c;帮助读者更好地理解和应用该技术。 一、SystemS…

leetcode 力扣刷题 旋转矩阵(循环过程边界控制)

力扣刷题 旋转矩阵 二维矩阵按圈遍历&#xff08;顺时针 or 逆时针&#xff09;遍历59. 旋转矩阵Ⅱ54. 旋转矩阵剑指 Offer 29. 顺时针打印矩阵 二维矩阵按圈遍历&#xff08;顺时针 or 逆时针&#xff09;遍历 下面的题目的主要考察点都是&#xff0c;二维数组从左上角开始顺…

Camx--概述

该部分代码主要位于 vendor/qcom/proprietary/ 目录下&#xff1a; 其中 camx 代表了通用功能性接口的代码实现集合&#xff08;CamX&#xff09;&#xff0c;chi-cdk代表了可定制化需求的代码实现集合&#xff08;CHI&#xff09;&#xff0c;从图中可以看出Camx部分对上作为H…

Typora常用手册

常用快捷键 加粗&#xff1a; Ctrl B 标题&#xff1a; Ctrl H 插入链接&#xff1a; Ctrl K 插入代码&#xff1a; Ctrl Shift C – 无法执行 行内代码&#xff1a; Ctrl Shift K 插入图片&#xff1a; Ctrl Shift I 无序列表&#xff1a;Ctrl Shift L – 无法执行…

Spring事务

Spring事务 一、什么是事务、事务的特性、事务的隔离级别二、Spring中事务实现编程式事务&#xff1a;手动写代码操作事务声明式事务&#xff1a;使用注解自动开启和提交事务 三、Spring事务隔离级别及设置方法四、Spring的事务传播机制Spring事务失效的情况Transactional注解参…

玩赚音视频开发高阶技术——FFmpeg

随着移动互联网的普及&#xff0c;人们对音视频内容的需求也不断增加。无论是社交媒体平台、电商平台还是在线教育&#xff0c;都离不开音视频的应用。这就为音视频开发人员提供了广阔的就业机会。根据这些年来网站上的音视频开发招聘需求来看&#xff0c;音视频开发人员的需求…

Redis缓存读写策略(三种)数据结构(5+3)

Redis缓存读写策略&#xff08;三种&#xff09; Cache Aside Pattern&#xff08;旁路缓存模式&#xff09; Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式&#xff0c;比较适合读请求比较多的场景。 写&#xff1a; 先更新 db然后直接删除 cache 。 读 : …

Leetcode链表篇 Day3

.24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 1.构建虚拟结点 2.两两一组&#xff0c;前继结点一定在两两的前面 3.保存结点1和结点3 19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 1.双指针&#xff1a;快慢指针 两个指针的差…

【BASH】回顾与知识点梳理(二十三)

【BASH】回顾与知识点梳理 二十三 二十三. Linux 账号管理&#xff08;二&#xff09;23.1 账号管理新增与移除使用者&#xff1a; useradd, 相关配置文件, passwd, usermod, userdelusermoduserdel 23.2 用户功能&#xff08;普通用户可使用&#xff09;idfingerchfnchsh 23.3…

Linux知识点 -- 进程信号(二)

Linux知识点 – 进程信号&#xff08;二&#xff09; 文章目录 Linux知识点 -- 进程信号&#xff08;二&#xff09;一、信号保存1.相关概念2.信号保存的相关接口3.对所有的信号都进行自定义捕捉4.将2号信号block&#xff0c;并打印pending信号集5.将所有信号都block 二、处理信…

.NET6使用SqlSugar操作数据库

1.//首先引入SqlSugarCore包 2.//新建SqlsugarSetup类 public static class SqlsugarSetup{public static void AddSqlsugarSetup(this IServiceCollection services, IConfiguration configuration,string dbName "ConnectString"){SqlSugarScope sqlSugar new Sq…

bilibili倍数脚本,油猴脚本

一. 内容简介 bilibili倍数脚本&#xff0c;油猴脚本 二. 软件环境 2.1 Tampermonkey 三.主要流程 3.1 创建javascript脚本 点击添加新脚本 就是在 (function() {use strict;// 在这编写自己的脚本 })();倍数脚本&#xff0c;含解析 // UserScript // name bi…

Leetcode链表篇 Day2

203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 1.暴力移除&#xff1a;分删除的为头结点和不为头节点 while删除头节点时&#xff1a;直接从下一个结点开始&#xff0c;headhead->next while不是头节点时&#xff1a;从head开始遍历(需记录的为 前继结点pre) 虚…

计算机竞赛 opencv 图像识别 指纹识别 - python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…