Attention 和 Self-Attention 总结

news2024/10/7 6:39:06

一、Attention

Attention 的核心逻辑是“从关注全部到关注重点”,将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。

Attention 机制可以更加好的解决序列长距离依赖问题,并且具有并行计算能力。

Attention 并不需要在 Encoder-Decoder 框架下使用,是可以脱离 Encoder-Decoder 框架的。

  • 下面的图片则是脱离 Encoder-Decoder 框架后的原理图解:

  • Attention原理的3步分解:

通过 Query(查询对象) 信息从 Values(被查询对象) 中筛选出重要信息,即:计算 Query 和 Values 中每个信息的相关程度

Attention 通常可以表示为将 Query(Q) 和 key-value pairs(把 Values 拆分成了键值对的形式)映射到输出上,其中 query、每个 key、每个 value 都是向量,输出是 V(被查询对象)中所有 values 的加权,其中权重是由 Query 和每个 key 计算出来的,计算方法分为三步:

第一步:Query与每一个Key计算相似性得到相似性评分s
第二步:将s评分进行softmax转换成[0,1]之间的概率分布
第三步:将[a1,a2,a3…an]作为权值矩阵对Value进行加权求和得到最后的Attention值

公式如下:

具体步骤如下:

二、Self-Attention

2.1 Attention 和 Self-Attention 的区别

1. Attention:

传统的 Attention 机制发生在  Target的元素 和  Source中的所有元素 之间。在一般任务的 Encoder-Decoder 框架中,输入 Source 和输出 Target 内容是不一样的,比如对于英 - 中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子。

2. Self-Attention

Self-Attention 指的不是 Target 和 Source 之间的 Attention 机制,而是 Source 内部元素之间或者 Target 内部元素之间发生的 Attention 机制,其具体计算过程是一样的,只是计算对象发生了变化而已,相当于是 Query=Key=Value,计算过程与attention一样。

自注意力机制是注意力机制的变体,其减少了对外部信息的依赖,更擅长捕捉数据特征的内部相关性。自注意力机制在文本中的应用,主要通过计算单词间的互相影响,解决长距离依赖问题。 

下图是self-attention的一个例子:

如果想知道这句话中的 its 指代的是什么,与哪些单词相关,那么就可以将 its 作为 Query,然后将这句话作为 Key 和 Value 来计算 attention 值,找到与这句话中 its 最相关的单词。通过 self-attention 我们发现 its 在这句话中与之最相关的是 Law 和 application。

总结区别: 

1. Self-attention 关键点在于,规定K-Q-V三者都来源于 X。通过 X 找到 X 中的关键点。可以看作 QKV 相等,都是由词向量线性变换得到的,并不是 Q=V=K=X,而是 X 通过 Wk、Wq、Wv 线性变换而来。

2. Attention 是通过一个查询变量 Q 找到 V 里面重要信息,K 由 V 变换而来,QK=A ,AV = Z(注意力值),Z 其实是 V 的另一种表示,也可以称为词向量,具有句法和语意特征的 V。

3. Self-attention 比 attention 约束条件多了两个:Q=K=V同源;Q,K,V需要遵循attention的做法。

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

神经网络接收的输入是很多大小不一的向量,并且不同向量之间有一定的关系,但是实际训练的时候无法充分发挥这些输入之间的关系而导致模型训练结果效果极差。 例如:

机器翻译问题(序列到序列的问题,机器自己决定多少个标签)
词性标注问题(一个向量对应一个标签)
语义分析问题(多个向量对应一个标签)等文字处理问题

2.3 Self-Attention 详解

对于每个输入向量a,经过蓝色部分 self-attention 后输出一个向量b,这个向量 b 是考虑了所有的输入向量对 a1 产生的影响才得到的,这里有四个词向量a对应就会输出四个向量b。

上图看起来复杂,实际上是分别在计算 a1 跟 [a1,a2,a3,a4] 的相似度,最后得出 b1 。 a1~a4,可能是 input 也可能是 hidden layer的 output。
a1~a4,属于整个 source 的信息,这一步是在计算整个 source 信息之间的关系。

以 a1 为例,分别点积(Dot-product)两个参数矩阵 Wq 和 Wk,得到q1和k1。(q = query,k = key)
a1,1代表a1与a1的相似度或关连程度;a1,2代表a1与a2的相似度或关连程度;同理a1,3和a1,4。
在得到各向量与a1的相关程度之后,用 softmax 计算出一个attention distribution,这样就把相关程度归一化,通过数值就可以看出哪些向量是和a1最有关系。

V与Q和K同理,V1 = Wv * a1

如果 a1 和 a2 关联性比较高,α1,2就比较大,那么,得到的输出 b1 就可能比较接近 v2 ,即 attention score决定了该 vector 在结果中占的分量;

==矩阵形式解析==

把 4 个输入 a 拼成一个矩阵 I,这个矩阵有4个 column,也就是a1到a4,I 乘上相应的权重矩阵W,得到相应的矩阵Q、K、V,分别表示query,key和value。 三个 W 矩阵 (Wq、 Wk 和 Wv)是我们需要学习的参数。

利用得到的 Q 和 K 计算每两个输入向量之间的相关性,也就是计算attention的值α, α的计算方法有多种,通常采用点乘的方式。
矩阵A中的每一个值记录了对应的两个输入向量的Attention的大小α,A' 是经过 softmax 归一化后的矩阵。

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

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

三、Multi-head Self-attention

Self-attention 的进阶版本 Multi-head Self-attention,多头自注意力机制。

因为相关性有很多种不同的形式,有很多种不同的定义,所以有时不能只有一个q,要有多个q,不同的q负责不同种类的相关性。就像语言信息里,语法句意特征非常复杂,仅仅一层 QKV 是不足以处理复杂任务的。

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

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

计算出来q、k、v之后的 self-attention 和上面的过程一样,只不过是1类的一起做,2类的一起做,两个独立的过程,算出来两个b(bi1,bi2)。

最后,把 bi1 和 bi2 拼接成矩阵再乘权重矩阵 W,得到bi,也就是这个self- attention向量 ai 的输出,如下图所示:

四、Positional Encoding

在训练 self attention 的时候,实际上对于位置的信息是缺失的,没有前后的区别,上面讲的 a1,a2,a3 不代表输入的顺序,只是指输入的向量数量,不像 RNN,对于输入有明显的前后顺序。 Self-attention 是同时输入,同时输出

为了解决 Attention 丢失的序列顺序信息,Transformer 的提出者提出了 Position Embedding,也就是对于输入 X 进行 Attention 计算之前,在 X 的词向量中加上位置信息,也就是说 X的词向量为: X~final_embedding = Embedding + Positional Embedding

换一种表示方式:

五、Self-Attention的拓展

5.1 Self-attention vs RNN

引入Self Attention后更容易捕获句子中长距离的相互依赖的特征。

RNN 或者 LSTM,需要按顺序进行序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。 

Self - Attention 在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。

此外,Self Attention 对于增加计算的并行性也有直接帮助作用。正好弥补了attention机制的两个缺点,这就是为何Self - Attention逐渐被广泛使用的主要原因。

5.2 Self-attention vs CNN

Self-Attention 其实可以看作一种基于全局信息的 CNN。

传统 CNN 的卷积核是认为规定的,只能提取卷积核内的信息进行图像特征提取,但 Self-Attention 关注 source 内部特征信息,可以从全局角度出发,去 “学习” 出最合适的一个“卷积核”,最大化的提取图像特征信息。

在数据量小的情况下,Self-Attention 的训练效果差,不如 CNN ;

在数据量大的情况下,Self-Attention 的训练效果好,胜过 CNN ; 

5.3 Self-attention 的优点

参数少:相比于 CNN、RNN ,其参数更少,复杂度更小。所以对算力的要求也就更小。
速度快:Attention 解决了 RNN及其变体模型 不能并行计算的问题。Attention 机制每一步计算不依赖于上一步的计算结果,因此可以和 CNN 一样并行处理。
效果好:在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。

六、Masked Self-attention

Mask是为了解决训练阶段和测试阶段的 gap(不匹配)问题。

Mask 就是沿着对角线把灰色的区域用 0 覆盖掉,不给模型看到未来的信息,如图所示,并且在做完 softmax 之后,横轴结果合为 1。

举例1:机器翻译: 源语句(我爱中国),目标语句(I love China)

训练阶段:解码器会有输入,这个输入是目标语句,就是 I love China,通过已经生成的词,去让解码器更好的生成(每一次都会把所有信息告诉解码器)
work阶段:解码器也会有输入,但是此时,测试的时候是不知道目标语句是什么的,这个时候,你每生成一个词,就会有多一个词放入目标语句中,每次生成的时候,都是已经生成的词(测试阶段只会把已经生成的词告诉解码器)  为了匹配,为了解决这个 gap,masked Self-Attention 就登场了,我在训练阶段,我就做一个 masked,当你生成第一个词,我啥也不告诉你,当你生成第二个词,我告诉第一个词。

输出的答案和正确答案的交叉熵越小越好。

训练的时候有正确答案,work的时候没有正确答案。测试的时 Decoder 接收的是自己的输出,可能有错误的;训练时,Decoder接收的是完全正确的; 测试和训练不一致的现象叫 "exposure bias"。
假设 Decoder 在训练时看到的都是正确的信息,那在测试时 它如果收到了错误的信息,它会一步错步步错,放大错误。
所以在训练的时候,给 Decoder 一些错误的信息,反倒会提升模型精确度。 

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

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

相关文章

【计算几何】给定一组点的多边形面积

目录 一、说明二、有序顶点集三、无序顶点集3.1 凸多边形3.2 非凸多边形 四、结论 ​ 一、说明 计算多边形面积的方法有很多种。众所周知的多边形(如三角形、矩形、正方形、梯形等)的面积可以使用简单的数学公式计算。在这篇文章中,我将讨论…

ChatGPT高效提问—prompt常见用法(续篇八)

ChatGPT高效提问—prompt常见用法(续篇八) 1.1 对抗 ​ 对抗是一个重要主题,深入探讨了大型语言模型(LLM)的安全风险。它不仅反映了人们对LLM可能出现的风险和安全问题的理解,而且能够帮助我们识别这些潜在的风险,并通过切实可行的技术手段来规避。 ​ 截至目前,网络…

python web 框架Django学习笔记

2018年5月 python web 框架Django学习笔记 Django 架站的16堂课 MVC架构设计师大部分框架或大型程序项目中一种软件工程的架构模式,把程序或者项目分为三个主要组成部分,Model数据模型、View视图、Controller控制器。 命令及设置相关 创建数据库及中间…

【EAI 014】Gato: A Generalist Agent

论文标题:A Generalist Agent 论文作者:Scott Reed, Konrad Zolna, Emilio Parisotto, Sergio Gomez Colmenarejo, Alexander Novikov, Gabriel Barth-Maron, Mai Gimenez, Yury Sulsky, Jackie Kay, Jost Tobias Springenberg, Tom Eccles, Jake Bruce,…

车载自动化项目:Python

1. 自动化测试用的什么框架? 第一种:PythonSeleniumuittest框架 首先是拿到需求文档,基于这个需求去进行搭建。 用pytestrequestallure 这些第三方库进行编写自动化脚本。 举个例子一般的话整个的一个自动化的搭建是分为6层嘛&#xff1a…

GPIO结构

GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 输入模式下可读取端口的高低电平或电压&#x…

算法学习——LeetCode力扣字符串篇

算法学习——LeetCode力扣字符串篇 344. 反转字符串 344. 反转字符串 - 力扣(LeetCode) 描述 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地…

STM32CubeMX,定时器之定时功能,入门学习,如何设置prescaler,以及timer计算PWM输入捕获方法(重要)

频率变小,周期变长 1,参考链接(重要) STM32CubeMX——定时器之定时功能(学习使用timer定时器的设置) STM32测量PWM信息(学习使用设置pwm输入捕获) 通用定时器中两个重要参数的设置心…

[C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改

问题描述 WPF中DataGrid的选中行或选中者单元格&#xff0c;在焦点失去后&#xff0c;颜色会很淡&#xff0c;很不明显&#xff0c;不容易区分。 解决方法 在失去焦点的情况下&#xff0c;如何设置行或单元格与选中的时候颜色一样&#xff1f; <DataGrid.Resources>&…

【Linux】构建模块

&#x1f525;博客主页&#xff1a;PannLZ &#x1f38b;系列专栏&#xff1a;《Linux系统之路》 &#x1f94a;不要让自己再留有遗憾&#xff0c;加油吧&#xff01; 文章目录 构建第一个模块1模块的makefile2内核树内构建3内核树外构建 构建第一个模块 可以在两个地方构建模…

Linux操作系统基础(七):Linux常见命令(二)

文章目录 Linux常见命令&#xff08;二&#xff09; 一、kill命令 二、ifconfig命令 三、clear命令 四、重启与关机命令 五、which命令 六、hostname命令 七、grep命令 八、|管道 九、useradd命令 十、userdel命令 十一、tar命令 十二、su命令 十三、ps命令 Linu…

滑块识别验证

滑块识别 1. 获取图片 测试网站&#xff1a;https://www.geetest.com/adaptive-captcha-demo 2. 点击滑块拼图并开始验证 # 1.打开首页 driver.get(https://www.geetest.com/adaptive-captcha-demo)# 2.点击【滑动拼图验证】 tag WebDriverWait(driver, 30, 0.5).until(la…

Python爬虫——请求库安装

目录 1.打开Anaconda Prompt 创建环境2.安装resuests3.验证是否安装成功4.安装Selenium5.安装ChromeDriver5.1获取chrom的版本5.1.1点击浏览器右上三个点5.1.2点击设置5.1.3下拉菜单&#xff0c;点击最后关于Chrome&#xff0c;获得其版本 5.2 打开网址 [chromedriver](https:/…

SolidWorks学习笔记——入门知识1

目录 1、固定最近文档 2、根据需要自定义菜单栏 3、根据需要增添选项卡 4、命令搜索框 5、鼠标右键长按快速切换视图 6、鼠标笔势 自定义鼠标笔势 1、固定最近文档 图1 固定最近文档 2、根据需要自定义菜单栏 图2 根据需要自定义菜单栏 3、根据需要增添选项卡 图3 根据…

服务器被黑,安装Linux RootKit木马

前言 疫情还没有结束&#xff0c;放假只能猫家里继续分析和研究最新的攻击技术和样本了&#xff0c;正好前段时间群里有人说服务器被黑&#xff0c;然后扔了个样本在群里&#xff0c;今天咱就拿这个样本开刀&#xff0c;给大家研究一下这个样本究竟是个啥&#xff0c;顺便也给…

尚硅谷 Vue3+TypeScript 学习笔记(中)

目录 三、路由 3.1. 【对路由的理解】 3.2. 【基本切换效果】 3.3. 【两个注意点】 3.4.【路由器工作模式】 3.5. 【to的两种写法】 3.6. 【命名路由】 3.7. 【嵌套路由】 3.8. 【路由传参】 query参数 params参数 3.9. 【路由的props配置】 3.10. 【 replace属性…

HiveSQL——sum(if()) 条件累加

注&#xff1a;参考文章&#xff1a; HiveSql面试题10--sum(if)统计问题_hive sum if-CSDN博客文章浏览阅读5.8k次&#xff0c;点赞6次&#xff0c;收藏19次。0 需求分析t_order表结构字段名含义oid订单编号uid用户idotime订单时间&#xff08;yyyy-MM-dd&#xff09;oamount订…

日本的便宜服务器有哪些?

年底之际&#xff0c;无非是云服务器优惠的黄金时期&#xff0c;对于个人用户和独立开发者来说&#xff0c;无论你是搭建个人网站还是个人博客&#xff0c;现在都是行动的好时机。那么&#xff0c;对于这时要入手日本服务器的用户&#xff0c;该怎么找便宜厂商呢&#xff1f;这…

机器学习系列——(十三)多项式回归

引言 在机器学习领域&#xff0c;线性回归是一种常见且简单的模型。然而&#xff0c;在某些情况下&#xff0c;变量之间的关系并不是线性的&#xff0c;这时候我们就需要使用多项式回归来建模非线性关系。多项式回归通过引入高次项来扩展线性回归模型&#xff0c;从而更好地拟…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toggle组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Toggle组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Toggle组件 组件提供勾选框样式、状态按钮样式及开关样式。 子组件 仅当Toggl…