Self-Attention 自注意力机制

news2024/11/18 13:30:05

输出形式

李宏毅讲到:

  • 模型的输入是只有一种形式——词向量
  • 但是输出的形式却是不唯一的,主要有以下三种:
    • 每一个向量对应一个输出(多对多,且一一对应)
      • image-20211109112016976
    • 每个序列只有一个输出(多对一)
      • image-20211109112047347
    • 一个序列对应一个序列(多对多,长度不确定)
      • image-20211109112106741

自注意力机制引入

[这里以第一种形式来做说明,什么是self-attention]

考虑这样的一个例子:词形标注怎么做?

image-20211109112346840

第一阶段

首先想到的是,也是最容易想到的是,一个个对应输出,但是这样存在一个大问题就是词与词之间是没有关系的,也就是说上图中的第一个saw和最后一个saw的词形输出是相同的,这显然是不对的,那么该怎么处理呢?

第二阶段

既然在第一阶段中突出的一个问题就是没有办法考虑词在全文中的信息,那么我们可不可以将所有的信息连接起来呢,这样的处理方法就是,加入一个window窗口机制,这样每次就只处理一个窗口大小的数据就可以了,效果如下:

image-20211109112906033

但是这样还存在以下几个问题就是:

  1. 在一个句子中,窗口的大小怎么确定?
  2. 对于整个句子来说该怎么用窗口来覆盖?
  3. 句子的长度也不是唯一的,是动态变化的,那么该怎么确定这个窗口大小呢?

第三阶段(引入self-attention)

self-attention机制是可以根据你输入的长度来自动确定输出的长度,示意图如下:

image-20211109123525469

当然,self-attention是可以叠加的,这样的话就可以更好的输出我们想要的结果:

image-20211109123702536

[有关self-attention最重要的一篇文章就是transformer的提出——《Attention is all you need》]


自注意力机制的原理

最重要的机制就是要看self-attention到底是怎么实现的:

image-20211109124030669

相关性

我们先以如何产生 b 1 b^1 b1​来说明这个self-attention机制的:

image-20211109124752408

首先就是判断或者说找到输入序列之间的关系/相关性(这一步的作用就是找到那个整个sequence里面,哪些向量是重要的,哪些是不重要的)。

为了解释方便,这里用 α \alpha α表示向量之间的相关性。


attention模块

这里就需要对上述的 α \alpha α的如何计算做一个说明了,常用的就是Dot-product(transformer里面也是用的这个)。当然还有Additive,这两种方法都是根据输入的两个向量,然后分别对应相乘两个不同的矩阵来做一个运算而得到最后的 α \alpha α

image-20211109125341963

从宏观的角度

那么如何将上面讲到的东西整合一下呢,或者说整合的过程是什么样子的呢?

image-20211109125958671
  • query这个单词的意思就是我们想要查询的向量(也就是要查询的内容),故用单词query来表示,简称为q
  • key相当于关键字,也就是说相对于要查询的向量的,其他的向量就是看成query的关键字key
  • 其实上述的过程就是找与 q 1 q^1 q1相关的k

当然在实际使用的过程中,还会有自己跟自己的匹配,至于有什么用,还不清楚:image-20211109130543463

最后再通过一个soft-max层作为输出最后 α \alpha α输出,当然也可以不用soft-max作为输出,看自己怎么选择:

image-20211109130703250

我们得到了这个 α \alpha α之后还需要做最后的运算——得到我们的预测输出 b 2 b^2 b2

image-20211109171200612

从上图可以看出,对于输入的一个向量总共是有三个参数需要输出并进行运算的,分别是 q i , k i , v i q^i,k^i,v^i qi,ki,vi

从矩阵运算的角度

其实我们细化一下来考虑,就是将向量的运算全部用矩阵来代替实现的:

  • 从输入a得到QKV
image-20211109171935491

[上图也可以用《神经网络与深度学习》P204的图来表示]

  • 从KQ得到softmax
image-20211109172544715
  • 从softmax,V到输出
image-20211109172826827
  • 总结如下:
image-20211109173010086

字注意力机制的改进

多头自注意力机制

2头自注意力机制为例,那么如何实现呢?是什么意思呢?看下图就知道了。

image-20211109173623871

如上图所示,就是在计算完成qi的时候,再去对应相乘两个不同的矩阵,这样就得到了新的向量。

其中 q i , 1 q^{i,1} qi,1表示第i个元素的第1个向量


那么如何做注意力的运算呢?

我们只需要根据前面提到的的方法,对应相乘就好了。

image-20211109173917981

上图中只是一个“头”的计算,那么另一个头的计算方法如下图所示:

image-20211109174118495

最后只需要将结果合并就好了:

image-20211109174801264

位置编码

我们其实一直没有讨论位置信息,因为位置信息是很重要的,比如在词性标注的时候,句子的一开始一般来说不会是动词,这样就可以帮助我们在一定程度上的决策。

下图就是一个计算位置编码的过程,其中右边是 e i e^i ei向量,每一个column代表一个向量 。

image-20211109175415375

至于这个position 的选择,现在也没有一个定论,如何选择,是手动选择还是从数据中自己学习也尚未确定,下图中是一篇论文中提出的相关讨论:

image-20211109223205041

Self-attention v.s. CNN

Self-Attention 在全局中找到相关的pixel,就好像CNN中的窗口(reception field) 是自动学出来的一样。

一下是自监督学习与CNN的区别做了一个简单总结:

  • CNN是一种简单的自注意力机制;(CNN只需要考虑人工设定的区域即可)
  • 反过来说,自注意力机制是一种复杂的CNN;(自注意力机制则是一种)

image-20211109224742063

关于这两个的关系在一篇名为《On the relationship between self-attention and convolution layers》通过严谨的数学公式来证明了这个过程。

下面这张图片表示了在不同数据集上的效果图,发现,在数据集不大的情况下,CNN的效果是优于self- attention的,反之CNN的效果会差一些。

image-20211110002555857

Self-attention v.s. RNN

下图中简单介绍了RNN和self-attention的机制区别,首先是第一个区别就是,在下图中最后面的黄色的输出值在RNN中很难去考虑第一个的RNN的输入(当然双向的RNN也是可以实现的,或者改进的RNN,如LSTM),而在self-attention中是很容易去实现的。

image-20211110003131153

下图是说明了另一个问题——RNN不能够实现并行计算,但是Self-attention是可以实现的。

image-20211110003640915

上面这篇文章提到了self-attention加入了什么东西之后,会变成RNN。

进一步研究

image-20211110004123281

tion是可以实现的。

image-20211110003640915

上面这篇文章提到了self-attention加入了什么东西之后,会变成RNN。

进一步研究

[外链图片转存中…(img-BYvL9z58-1686470533731)]

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

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

相关文章

MySQL 索引的10 个核心要点

文章目录 🍉1. 索引底层采用什么数据结构?为什么不用hash🍉2. B树与B树区别?为何用B树?🍉3. 自增主键理解?🍉4. 为什么自增主键不连续🍉5. Innodb为什么推荐用自增ID&…

代码随想录第59天

1.下一个更大元素II 有两种方法&#xff1a; 1.把两个一样的数组拼起来&#xff1a; // 版本一 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {// 拼接一个新的numsvector<int> nums1(nums.begin(), nums.end());nu…

Chapter7: SpringBoot与数据访问

尚硅谷SpringBoot顶尖教程 1. JDBC 1.1 依赖及配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>mysql</groupId…

《Reinforcement Learning: An Introduction》第4章笔记

Chapter 4 Dynamic Programming 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一类在给定完备环境模型的MDP后用来计算最优策略的算法。动态规划算法在强化学习中因为&#xff1a;1. 假设有一个完美的环境模型&#xff1b;2. 极大的计算代价 实际用处…

树莓派4B连接不了产品开的热点

目的 关于树莓派连接不了产品开的5G热点&#xff0c; 当时还是一头雾水。 参考这篇博客 把思路方向转向了频率&#xff0c; 信道&#xff0c; 通过给的产品A相关规格说明wifi 5.18GHz, 信道36。 于是乎我两款产品A、产品B为例。 树莓派是能连接产品B开的热点&#xff08;5.74…

【Unity SRP】实现基础的Temporal AA(未完)

写在前面 【技术美术图形部分】简述主流及新的抗锯齿技术&#xff0c;花了点时间盘点了一些主流AA技术&#xff0c;再在SRP下的URP管线中实现一下目前游戏用得比较多的TAA。参考Unity的TAA&#xff08;比较容易懂&#xff09;以及sienaiwun的实现思路&#xff0c;也参考了很多…

OpenCV转换HDR图像与源码分析

我们常见的图像位深一般是8bit&#xff0c;颜色范围[0, 255]&#xff0c;称为标准动态范围SDR(Standard Dynamic Range)。SDR的颜色值有限&#xff0c;如果要图像色彩更鲜艳&#xff0c;那么就需要10bit&#xff0c;甚至12bit&#xff0c;称为高动态范围HDR(High Dynamic Range…

Docker部署ES集群、kibana、RabbitMq和chrome安装elasticsearch-head插件

文章目录 [toc] 1.安装ES集群和kibana1.1安装ES集群1.1.1 准备挂载目录1.1.2 准备配置文件1.1.3 启动命令1.1.3.0 启动前设置系统环境变量1.1.3.1 Windows10环境启动命令1.1.3.2 Linux环境启动命令 1.2安装kibana1.2.1 准备挂载目录1.2.2 准备配置文件1.2.3 启动命令1.2.3.1 Wi…

Spring IOC基于XML和注解管理Bean(一)

Spring IOC基于XML和注解管理Bean&#xff08;二&#xff09; 文章目录 1、IoC容器1.1、控制反转&#xff08;IoC&#xff09;1.2、依赖注入1.3、IoC容器在Spring的实现 2、基于XML管理Bean2.1、搭建模块spring-first2.2、实验一&#xff1a;获取bean①方式一&#xff1a;根据i…

过滤器和拦截器实现

说明&#xff1a;当用户未经登录&#xff0c;直接访问后台网址时&#xff0c;为了避免可以直接访问后台内容&#xff0c;就需要使用过滤器或拦截器将此类请求在服务器响应数据之前做核对&#xff0c;如果未登录&#xff0c;则驳回请求&#xff0c;返回登录页面&#xff0c;如果…

PyQt5桌面应用开发(20):界面设计结果自动测试(一)

本文目录 PyQt5桌面应用系列PyQt5的测试驱动开发&#xff08;Test-Driven Development&#xff0c;TDD&#xff09;QTestUI动作函数信号测试 最平凡的例子unittest框架总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开…

【Apache Pinot】简单聊聊前面没讲的 Deep Store 和 Cluster

背景 前面3篇文章讲解了 Pinot 用的最多的几个组件&#xff0c;现在就聊最后剩下的两个&#xff0c;一个是 Cluster&#xff0c;另外一个就是 Deep Store。 Cluster 其实 Cluster 比较简单&#xff0c;就是一个概念的集合&#xff0c;他说有 Server&#xff0c;Broker 和 Co…

代码随想录算法训练营第五十六天 | 力扣 583. 两个字符串的删除操作, 72. 编辑距离

583. 两个字符串的删除操作 题目 583. 两个字符串的删除操作 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 解析 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 …

学会这个Python库,做接口测试不是手拿把掐吗?

我们在做接口测试时&#xff0c;大多数返回的都是json属性&#xff0c;我们需要通过接口返回的json提取出来对应的值&#xff0c;然后进行做断言或者提取想要的值供下一个接口进行使用。 但是如果返回的json数据嵌套了很多层&#xff0c;通过查找需要的词&#xff0c;就很不方便…

三、Typora软件的介绍及安装

1、Typora软件的介绍 (1)Typora时一款Markdown编辑器和阅读器。 (2)Typora使用起来十分简洁&#xff0c;十分方便&#xff0c;可用于记录日常的笔记等。 (3)Markdown 是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档。 2、Typora软件的安装 …

都说未来AI测试辅助自动化测试,难道手工测试真的要被淘汰了吗?

目录 前言 AI测试的迷思 第一个问题&#xff1a;AI辅助测试真的能用吗&#xff1f; 第二个问题&#xff1a;AI辅助测试已经发展到什么程度了&#xff1f; 第三个问题&#xff1a;哪些软件系统能用AI辅助测试&#xff1f; 总结 总结&#xff1a; 前言 近年来&#xff0c;…

FPGA实现简易的自动售货机模型

文章目录 前言一、系统设计1、模块框图2、状态机框图3、RTL视图 二、源码1.蜂鸣器驱动模块2.按键消抖模块3、PWM模块4、sale_goods模块(状态机部分)5、数码管驱动模块6、Sales(顶层模块) 三、效果四、总结五、参考资料 前言 环境&#xff1a; 1、Quartus18.1 2、vscode 3、板子…

华为OD机试 JavaScript 实现【简单密码】【牛客练习题 HJ21】,附详细解题思路

一、题目描述 现在有一种密码变换算法。 九键手机键盘上的数字与字母的对应&#xff1a; 1--1&#xff0c; abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0&#xff0c;把密码中出现的小写字母都变成九键键盘对应的数字&#xff0c;如&#xff1a;a …

Python实现面向对象版学员管理系统

如有错误&#xff0c;敬请谅解&#xff01; 此文章仅为本人学习笔记&#xff0c;仅供参考&#xff0c;如有冒犯&#xff0c;请联系作者删除&#xff01;&#xff01; 1.1需求分析 1.1.1使用面向对象编程思想完成学员管理系统的开发&#xff0c;具体如下&#xff1a; 系统要求…

城镇供水产销差问题分析与对策

城镇自来水与其它商品的经营活动一样存在着产销差&#xff0c;产销差的高低&#xff0c;直接影响着供水企业的经济效益。供水企业的经营活动中不单考虑企业的经济效益&#xff0c;还要考虑社会效益。产销差是客观存在的&#xff0c;造成产销差的原因是多样的&#xff0c;复杂的…