深度学习:自注意力机制(Self-Attention)

1 自注意力概述

1.1 定义

自注意力机制(Self-Attention),有时也称为内部注意力机制,是一种在深度学习模型中应用的机制,尤其在处理序列数据时显得非常有效。它允许输入序列的每个元素都与序列中的其他元素进行比较,以计算序列的表示。这种机制使模型能够聚焦于输入序列中不同位置的关系,从而捕捉序列内的复杂依赖关系。

1.2 关键组件

  • 查询(Query): 表示当前元素,用于与键进行匹配。

  • 键(Key): 表示序列中的其他元素,用于与查询匹配。

  • 值(Value): 也是序列中的其他元素,一旦键匹配查询,相关的值将用于构建输出。

  • 注意力权重: 通过查询和键之间的相似度计算得出,决定了值对输出的贡献程度。

1.3 优点

  • 并行计算: 不像循环神经网络,自注意力机制允许并行处理序列中的所有元素,提高了计算效率。

  • 捕捉长距离依赖: 自注意力机制能够有效地捕捉序列中长距离的依赖关系。

  • 灵活性: 这种机制可以应用于不同类型的序列数据,并且可以容易地扩展到更长的序列。

1.4 应用

  • 自然语言处理(NLP): 在机器翻译、文本摘要、情感分析等任务中,自注意力机制帮助模型理解词语之间的复杂关系。

  • 计算机视觉: 在图像识别和图像生成任务中,自注意力机制使模型能够捕捉图像中远距离的依赖关系。

  • 序列建模: 在时间序列分析和音频处理中,自注意力机制有助于捕捉长期依赖关系。

2 自注意力深度解析

2.1 注意力机制和自注意力机制的区别

注意力机制(Attention)

传统的Attention机制发生在Target的元素和Source中的所有元素之间。

简单讲就是说Attention机制中的权重的计算需要Target来参与。即在Encoder-Decoder 模型中,Attention权值的计算不仅需要Encoder中的隐状态而且还需要Decoder中的隐状态。

自注意力机制(Self-Attention)

不是输入语句和输出语句之间的Attention机制,而是输入语句内部元素之间或者输出语句内部元素之间发生的Attention机制。

例如在Transformer中在计算权重参数时,将文字向量转成对应的KQV,只需要在Source处进行对应的矩阵操作,用不到Target中的信息。

2.2 引入自注意力机制的目的

神经网络接收的输入是很多大小不一的向量,并且不同向量向量之间有一定的关系,但是实际训练的时候无法充分发挥这些输入之间的关系而导致模型训练结果效果极差。比如机器翻译问题(序列到序列的问题,机器自己决定多少个标签),词性标注问题(一个向量对应一个标签),语义分析问题(多个向量对应一个标签)等文字处理问题。

针对全连接神经网络对于多个相关的输入无法建立起相关性的这个问题,通过自注意力机制来解决,自注意力机制实际上是想让机器注意到整个输入中不同部分之间的相关性。
 

2.3 Self-Attention

针对输入是一组向量,输出也是一组向量,输入长度为N(N可变化)的向量,输出同样为长度为N 的向量。

单个输出

对于每一个输入向量a,经过蓝色部分self-attention之后都输出一个向量b,这个向量b是考虑了所有的输入向量a^{1}产生的影响才得到的,这里有四个词向量a对应就会输出四个向量b。下面以b^{1}的输出为例:

首先,如何计算sequence中各向量与a^{1}的关联程度,有下面两种方法

Dot-product方法是将两个向量乘上不同的矩阵w,得到q和k,做点积得到α,transformer中就用到了Dot-product。

  • 上图中绿色的部分就是输入向量a^{1}a^{2},灰色的W^{q}W^{k}为权重矩阵,需要学习来更新,用W^{k}去和W^{q}相乘,得到一个向量q,然后使用a^{2}W^{k}相乘,得到一个数值k。最后使用q和k做点积,得到α。α也就是表示两个向量之间的相关联程度。

  • 上图右边加性模型这种机制也是输入向量与权重矩阵相乘,后相加,然后使用tanh投射到一个新的函数空间内,再与权重矩阵相乘,得到最后的结果。

        可以计算每一个α(又称为attention score),q称为query,k称为key

另外,也可以计算a^{1}和自己的关联性,再得到各向量与a^{1}的相关程度之后,用softmax计算出一个attention distribution,这样就把相关程度归一化,通过数值就可以看出哪些向量是和a1最有关系。

 下面需要根据 α′ 抽取sequence里重要的资讯:

先求v,v就是键值value,v和q、k计算方式相同,也是用输入a乘以权重矩阵W,得到v后,与对应的α′ 相乘,每一个v乘与α'后求和,得到输出b^{1}

如果a^{1}a^{2}关联性比较高, a_{1,2}^{'}就比较大,那么,得到的输出b^{1}就可能比较接近v^{2},即attention score决定了该vector在结果中占的分量;

矩阵形式

用矩阵运算表示b^{1}的生成:

Step 1:q、k、v的矩阵形式生成

写成矩阵形式:

 

把4个输入a拼成一个矩阵I,这个矩阵有4个column,也就是a^{1}a^{4}I乘上相应的权重矩阵W,得到相应的矩阵Q、K、V,分别表示query,key和value。

三个W是我们需要学习的参数

Step 2:利用得到的Q和K计算每两个输入向量之间的相关性,也就是计算attention的值α, α的计算方法有多种,通常采用点乘的方式。

先针对q^{1},通过与k^{1}k^{4}拼接成的矩阵K相乘,得到a_{1,n}拼接成的矩阵。

同样,q^{1}q^{1}也可以拼接成矩阵Q直接与矩阵K相乘:

公式为:

矩阵形式:

矩阵A中的每一个值记录了对应的两个输入向量的Attention的大小α,A'是经过softmax归一化后的矩阵。

Step 3:利用得到的A'和V,计算每个输入向量a对应的self-attention层的输出向量b:

写成矩阵形式:

 对self-attention操作过程做个总结,输入是I,输出是O:

矩阵W^{q}W^{k}W^{v}是需要学习的参数。

2.4 Multi-head Self-attention

self-attention的进阶版本Multi-head Self-attention,名称为多头自注意力机制。因为相关性有很多种不同的形式,有很多种不同的定义,所以有时不能只有一个q,要有多个q,不同的q负责不同种类的相关性。

对于1个输入a

首先,和上面一样,用a乘权重矩阵W得到q^{i},然后再用q^{i}乘两个不同的W,得到两个不同的q^{i,n},i代表的是位置,1和2代表的是这个位置的第几个q。

这上面这个图中,有两个head,代表这个问题有两种不同的相关性。

同样,k和v也需要有多个,两个k、v的计算方式和q相同,都是先算出来k^{i}v^{i},然后再乘两个不同的权重矩阵。

对于多个输入向量也一样,每个向量都有多个head:

算出来q、k、v之后怎么做self-attention呢?

和上面讲的过程一样,只不过是1那类的一起做,2那类的一起做,两个独立的过程,算出来两个b。

对于1:

对于2:

这只是两个head的例子,有多个head过程也一样,都是分开算b。

最后,把b^{i,1},b^{i,2}拼接成矩阵再乘权重矩阵W,得到b^{i},也就是这个self- attention向量a^{i}的输出,如下图所示:

2.5 Positional Encoding

在训练self attention的时候,实际上对于位置的信息是缺失的,没有前后的区别,上面讲的a^{1},a^{2},a^{3}不代表输入的顺序,只是指输入的向量数量,不像rnn,对于输入有明显的前后顺序,比如在翻译任务里面,对于“机器学习”,机器学习依次输入。而self-attention的输入是同时输入,输出也是同时产生然后输出的。

如何在Self-Attention里面体现位置信息呢?就是使用Positional Encoding

也就是新引入了一个位置向量e^{i},非常简单,如下图所示:

每一个位置设置一个vector,叫做positional vector,用e^{i}表示,不同的位置有一个专属的e^{i}

如果a^{i}加上了e^{i},就会体现出位置的信息,i是多少,位置就是多少。vector长度是人为设定的,也可以从数据中训练出来。

2.6 Self-Attention和RNN的区别

Self-attention和RNN的主要区别在于:

  • Self-attention可以考虑全部的输入,而RNN似乎只能考虑之前的输入(左边)。但是当使用双向RNN的时候可以避免这一问题。

  • Self-attention可以容易地考虑比较久之前的输入,而RNN的最早输入由于经过了很多层网络的处理变得较难考虑。

  • Self-attention可以并行计算,而RNN不同层之间具有先后顺序。

(1)Self-attention可以考虑全部的输入,而RNN似乎只能考虑之前的输入(左边)。但是当使用双向RNN的时候可以避免这一问题。

比如,对于第一个RNN,只考虑了深蓝色的输入,绿色及绿色后面的输入不会考虑,而Self-Attention对于4个输入全部考虑

(2)Self-attention可以容易地考虑比较久之前的输入,而RNN的最早输入由于经过了很多层网络的处理变得较难考虑。

比如对于最后一个RNN的黄色输出,想要包含最开始的蓝色输入,必须保证蓝色输入在经过每层时信息都不丢失,但如果一个sequence很长,就很难保证。而Self-attention每个输出都和所有输入直接有关。

 (3)Self-attention可以并行计算,而RNN不同层之间具有先后顺序。Self-attention的输入是同时输入,输出也是同时输出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTP深度解析:构建高效与安全网络的关键知识

1. HTTP基础及其组件 我首先想和大家分享的是HTTP的基础知识。HTTP,即超文本传输协议,是互联网上最常用的协议之一。它定义了浏览器和服务器之间数据交换的规则,使得网页内容可以从服务器传输到我们的浏览器上。想象一下,每当你点…

迅腾文化品牌网络推广助力企业:保持品牌稳定,发展更多消费者信任,提升品牌忠诚度

迅腾文化品牌网络推广助力企业:保持品牌稳定,发展更多消费者信任,提升品牌忠诚度 在当今快速发展的互联网时代,品牌网络推广已经成为企业发展的重要手段。迅腾文化作为专业的品牌网络推广公司,致力于帮助企业实现品牌…

产品Axure的元组件以及案例

前言 产品<Axure的安装以及组件介绍-CSDN博客经过上文我们可以知道我们Axure是一款适用于网站、移动应用和企业软件的交互式原型设计工具。它可以帮助用户创建高保真的交互式原型,包括线框图、流程图、模型、注释和规格等,以便与客户、开发人…

【Flink系列七】TableAPI和FlinkSQL初体验

Apache Flink 有两种关系型 API 来做流批统一处理:Table API 和 SQL Table API 是用于 Scala 和 Java 语言的查询API,它可以用一种非常直观的方式来组合使用选取、过滤、join 等关系型算子。 Flink SQL 是基于 Apache Calcite 来实现的标准 SQL。无论输…

K8S(二)—介绍

K8S的整体结构图 k8s对象 在 Kubernetes 系统中,Kubernetes 对象是持久化的实体。 Kubernetes 使用这些实体去表示整个集群的状态。 具体而言,它们描述了如下信息: 哪些容器化应用正在运行(以及在哪些节点上运行)可…

10进制和16进制数据互相翻译(windos版本)

window按winR键出现运行窗口,输入clac回车,进入计算器。 点击左上角,点击程序员,计算器就会变成可以进行进制转化的模式 鼠标点击DEC代表输入10进制,当我输入10时HEX变成A,A就是10转化16进制的数据, 反之如…

如何实现填表后分配序列号、活动抢票抽奖、自助分配座位号?

📱发布者想要实现让用户在填表后自动分配序列号、座位号,或制作活动抢票抽奖系统,该如何实现? 📌使用教程 📖案例1:制作活动抽奖系统 使用预置数据分配的随机分配功能,以活动抽奖为例…

实操Nginx(七层代理)+Tomcat多实例部署,实现负载均衡和动静分离

目录 Tomcat多实例部署(192.168.17.27) 1.安装jdk,设置jdk的环境变量 2.安装tomcat在一台已经部署了tomcat的机器上复制tomcat的配置文件取名tomcat1 ​编辑 编辑配置文件更改端口号,将端口号改为8081 启动 tomcat&#xff…

前端自定义验证码,校验验证码,验证码时效

最近做的项目&#xff0c;不需要后端接口&#xff0c;只需要前端验证&#xff0c;如图 初始页面 获取验证码 验证码的文件&#xff0c;直接复制就行 <template><div class"s-canvas"><canvasid"s-canvas":width"contentWidth":…

【Axure RP9】的详细安装及Axure入门应用

目录 一 Axure入门安装 1.1 Axure是什么? 1.2 Axure应用场景 1.3 Axure安装 1.3.1 汉化 1.3.2 授权 二, Axure应用 1.1 Axure软件界面概述 1.2 Axure的应用 1.2.1备份 1.2.2 视图显示及网格设置 1.2.3 生成HTML文件 1.2.4 备注说明 一 Axure入门安装 1.1 Axure…

吉林省文旅厅联合高德地图上线自驾游精品线路指南

12月15日消息&#xff0c;今日&#xff0c;吉林省文化和旅游厅联合高德地图推出“吉林省自驾游精品线路指南”&#xff0c;依托全省冬夏两季特色资源&#xff0c;推出了基于位置的8条自驾游品牌路线、百余个吉林省重点旅游场景&#xff0c;游客可以根据季节、地理位置、资源类型…

SoC中跨时钟域的信号同步设计(单比特同步设计)

一、 亚稳态 在数字电路中&#xff0c;触发器是一种很常用的器件。对于任意一个触发器&#xff0c;都由其参数库文件规定了能正常使用的“建立时间”&#xff08;Setup time&#xff09;和“保持时间”&#xff08;Hold time &#xff09;两个参数。“建立时间”是指在时钟…

【C语言】C的面向对象

一、BREW接口实现 高通的BREW&#xff08;Binary Runtime Environment for Wireless&#xff09;是一个早期为手机设备开发的应用程序平台&#xff0c;用于开发在CDMA手机上运行的软件。尽管这个平台目前已经不太流行&#xff0c;但是在其使用高峰时期&#xff0c;开发者需要使…

【深度学习目标检测】七、基于深度学习的火灾烟雾识别(python,目标检测,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…

C/C++ STL提供的序列式容器之deque

deque是双向开口的连续内存空间&#xff08;动态将多个连续空间通过指针数组接合在一起&#xff09;&#xff0c;随时可以增加一段新的空间。 deque 的最大任务就是在这些分段的连续空间上&#xff0c;维护其整体连续的假象&#xff0c;并提供随机存取的接口。 特点 1. 一…

v-show和v-if有什么区别?使用场景分别是什么?

一、v-show与v-if的共同点 我们都知道在 vue 中 v-show 与 v-if 的作用效果是相同的(不含v-else)&#xff0c;都能控制元素在页面是否显示 在用法上也是相同的 <Model v-show"isShow" /> <Model v-if"isShow" />1 2 当表达式为true的时候&…

RK3588安装TVM-CPU版本

1.背景 TVM是一个开源的机器学习编译器栈&#xff0c;用于优化和编译深度学习模型&#xff0c;以在各种硬件平台上实现高效性能。以下是关于TVM的详细介绍&#xff1a; TVM的目标是将深度学习模型的优化和编译过程自动化&#xff0c;以便开发人员可以轻松地将其模型部署到各种…

HACON error #2453:

问题&#xff1a;HALCON handle is NULL in operator grab_image_async" 分析&#xff1a;句柄为空&#xff0c;因为提前hv_AcqHandle.Dispose();将句柄释放掉了 解决方案&#xff1a;屏蔽此语句

【Spring】06 生命周期之销毁回调

文章目录 1. 回调是什么2. 销毁回调2.1 实现 DisposableBean 接口2.2 配置 destroy-method 3. 执行顺序4. 应用场景总结 在 Spring 框架中&#xff0c;生命周期回调&#xff08;Lifecycle Callbacks&#xff09;是一种强大的机制&#xff0c;它允许我们在 Spring 容器中的 Bean…

【Vue】日期格式化(全局)

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…