李宏毅深度学习self-attentin学习笔记

self-attention

  • 一、self-attention的起源
  • 二、self-attention网络架构
  • 三、multi-head self-attention
  • 四、positional encoding
  • 五、pytorch实现

一、self-attention的起源

self-attention初始也是用于解决seq2seq的问题。即input是一堆序列,而output也是一段长度固定或者不固定的序列值。和RNN比较类似。多说一句,从2022年开始李宏毅老师的机器学习课程中已经删除了有关RNN和LSTM的相关内容,因为self-attention完全可以替代RNN,且效果更好。

二、self-attention网络架构

在这里插入图片描述
注意力的本质思想就是说,考虑上下文的输入对当前的输入的影响,然后就和人的注意力一样,将重点放在部分输入上,值得被注意的、更为相关的输入会被分配更大的权重,也意味着更被重视。
如上图所示,注意力要做的类似于上图一样,假设有4个输入,则将4个输入都都进去,然后得到4个输出b1,b2,b3,b4。这4个输出则为考虑了上下文关系之后的4个全新的向量。
当然,这里的输入也可以不是输入向量,而是中间层的隐藏向量。
在说下,这里的上下文并不是指前后2个或4个输入,而是整个sequence的信息。这里为了方便,只展示了4个输入。
在这里插入图片描述
我们需要重点关注如何由a得到b。如何考虑输入和上下文之后的关系呢,可以用一个相关系数 α \alpha α来表征。
在这里插入图片描述
接下来,我们自然会思考,在self-attention中,如何自动决定两个向量之间的相关系数为多少呢,如何自动决定2个变量之间的关联性呢。
我们需要这样一个计算两个变量之间相关性的函数,如上图所示的2个黑色方框里面包围的部分。输入为2个向量,输出为2个向量之间的相关系数 α \alpha α。通常使用最多的是左侧的方法,叫做Dot-product
Dot-product是如何运作的呢,首先分别将两个输入向量和两个向量Wq,Wk进行相乘,相乘之后得到2个向量q,k。之后便可由这2个向量进行点乘dot-product得到相关系数 α \alpha α
我们看来下向量维度的变化。
输入:[N,1],一个列向量
Wq:[M,N],要与输入相乘,则其中一个维度必须对应
q:[M,1]
α \alpha α:一个实数scalar
在这里插入图片描述
点乘的计算公式如图所示。
在这里插入图片描述
具体来说,如何分别计算出第1个与第2个向量之间的系数 α 1 , 2 \alpha_{1,2} α1,2,以及其他相关系数 α 1 , 3 , α 1 , 4 \alpha_{1,3},\alpha_{1,4} α1,3,α1,4呢。
首先,使用Wq乘以a1,再使用Wk分别乘上a2,a3,a4。这样分别得到q1,k2,k3,k4。分别进行点乘dot-production便可得到相关系数。当然,这里
其中q有个名字叫做query,而k有个名字叫做keya1,2称为attention score
另外,a1也可以计算自己与自己的关联性,得到 α 1 , 1 \alpha_{1,1} α1,1
在这里插入图片描述
计算出所有的相关系数 a l p h a alpha alpha之后,便使用softmax函数进行归一化,重新得到新的 α ′ \alpha' α。这里除了用softmax,也可以用其他的方法。用softmax只是为了系数之和为1,方便一些而已。
在这里插入图片描述
而得到了 α ′ \alpha' α之后,便根据 α ′ \alpha' α去提取出整个sequence中比较重要的信息。具体如何抽取呢?
首先,我们把a1,a2,a3,a4左侧分别都统一再乘一个向量Wv,得到v1,v2,v3,v4。之后再乘以各自对应的 α ′ \alpha' α,便得到了对饮的b1
讲到这里,很多人包括我自己一开始都是很懵逼的,没事为啥要搞出3个向量Wq,Wk,Wv出来呢?要计算相关系数很容易啊,直接将两个输入向量直接做dot-production也行啊,也可以直接得到相关系数啊。另外,直接将 α ′ \alpha' α分别乘以输入a1-a4得到b1多好,非得搞个Wv出来增加复杂度,这样操作有什么意义吗?
答案在于复杂化可以包容更好的结果。这是我当前的理解。
计算相关系数确实可以直接将2个输入直接做dot-production,但是,先乘上Wq Wk之后再做dot-production显然已经包含了直接做dot-production的情况,将其设为乘上单位矩阵就行。Wv也是同样的道理,设为单位矩阵后便成了我们想的那种最简单的方式。
用最简单的方式固然也好,但是这样,方法就已经固定了。
使用复杂的方式的原因在于,方法不固定,就可以利用计算结果,利用梯度下降法求出比最简单的方式可能效果更好的一种方法。更容易匹配我们的训练数据。

在这里插入图片描述
同样,要计算出b2也是一样的道理。需要额外值得说明额是,b1,b2,b3,b4并不是先计算b1,再计算b2这种。而是一次性同时被算出来的。
在这里插入图片描述
我们如果从矩阵运算的角度来理解self-attention,每个输入a都会生成qkv三个向量,统一起来如上图所示。
Wq,Wk,Wv的系数都是被learning出来的。其中I表示由4个输入拼接而成的矩阵。
在这里插入图片描述
qkinner product/dot production的过程也可以看作是矩阵的乘法。
在这里插入图片描述
在这里插入图片描述

整个self-attention的过程如上图所示,本质上就是一系列的矩阵乘法运算。其中A'也叫做attention matrix.整个过程的输入是a1,a2,a3,a4,输出是b1,b2,b3,b4,而整个过程中需要学习的参数只有Wq,Wk,Wv

三、multi-head self-attention

为什么会有multi-head self-attention呢?因为前面有说过,相关其实有很多种情况都是相关,不能只有一种形式。因此在NN中,可以在多个地方定义相关的类型。
在这里插入图片描述
其中,qi分别乘上2个矩阵得到qi1和qi2。区分出1和2类别后,1类的分别做self-attention得到bi1,2类的再一起做self-attention得到bi2
在这里插入图片描述
得到bi1bi2之后可以再将其接起来,得到新的bi

四、positional encoding

上面讲述了self-attention之后,我们可以看下对于a1而言,a2,a4有任何关于位置上的差别吗?没有,把a2,a4调换位置好像也没有所谓。
问题在于,我们前面讲述的模型其实是缺了一个信息的,这个信息就是位置信息。上面的可以概括为天涯若比领,所有位置上的输入位置关系是一模一样远的。
这样做可能会存在一些问题。解决的方法叫做positional encoding
在这里插入图片描述
解决的方法就是为每个位置设定一个vector,ei。等于告诉self-attention位置信息,可以清楚知道哪个输入属于哪个位置。
positional encoding可以根据data学习出来,也可以人工设定,目前仍然是一个尚待研究的问题。

五、pytorch实现

在这里插入图片描述

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

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

相关文章

网络层--IP协议

引入: IP协议主要解决什么问题呢? IP协议提供一种将数据从主机A 发送到 主机B的能力。(有能力不一定能做到,比如小明很聪明,可以考100分,但是他也不是每次搜能考100分&#xff0…

java面试题(17):链表两数相加

两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头…

基于SpringBoot+微信小程序的智慧医疗线上预约问诊小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 近年来,随…

MyBatis 框架入门理论与实践

文章目录 1. MyBatis 框架介绍1.1 MyBatis优点1.2 MyBatis 不足 2. MyBatis 框架整体架构3. MyBatis 的 ORM 介绍4. MyBatis 框架入门开发4.1 入门案例的搭建4.1.1 准备SQL数据4.1.2 新建 SpringBoot 项目4.1.3 pom文件:4.1.4 配置文件4.1.5 mapper 和 mapper.xml4.…

mysql修改密码

1.mysql5.7以后和8.0版本的修改方法 摘要:经常会遇到mysql忘记密码,以及在公司中,交接没有完成导致无法进入数据库,下面提供了mysql的修改密码方法和使用图形化工具连接数据库的方法以及不需要密码直接进入数据库。 启动mysqld进…

电商类面试问题--01Elasticsearch与Mysql数据同步问题

在实现基于关键字的搜索时,首先需要确保MySQL数据库和ES库中的数据是同步的。为了解决这个问题,可以考虑两层方案。 全量同步:全量同步是在服务初始化阶段将MySQL中的数据与ES库中的数据进行全量同步。可以在服务启动时,对ES库进…

二分搜索树层序遍历(Java 实例代码)

目录 二分搜索树层序遍历 Java 实例代码 src/runoob/binary/LevelTraverse.java 文件代码: 二分搜索树层序遍历 二分搜索树的层序遍历,即逐层进行遍历,即将每层的节点存在队列当中,然后进行出队(取出节点&#xff0…

注意力机制讲解与代码解析

一、SEBlock(通道注意力机制) 先在H*W维度进行压缩,全局平均池化将每个通道平均为一个值。 (B, C, H, W)---- (B, C, 1, 1) 利用各channel维度的相关性计算权重 (B, C, 1, 1) --- (B, C//K, 1, 1) --- (B, C, 1, 1) --- sigmoid 与原特征相…

Jmeter进阶使用指南-使用参数化

Apache JMeter是一个广泛使用的开源负载和性能测试工具。在进行性能测试时,我们经常需要模拟不同的用户行为和数据,这时候,参数化就显得尤为重要。此文主要介绍如何在JMeter中使用参数化。 什么是参数化? 参数化是一种将静态值替…

机器学习:自然语言处理上的对抗式攻击

Attacks in NLP 相关话题 Introduction 以前的攻击专注于图像和语音上,而NLP上的内容比较少。而NLP的复杂度跟词典有关系: NLP只能在embedding后的特征上加噪声 Evasion Attacks 电影的评论情感分类,将film换成films后,评论从…

制作立体图像实用软件:3DMasterKit 10.7 Crack

3DMasterKit 软件专为创建具有逼真 3D 和运动效果的光栅图片而设计:翻转、动画、变形和缩放。 打印机、广告工作室、摄影工作室和摄影师将发现 3DMasterKit 是一种有用且经济高效的解决方案,可将其业务扩展到新的维度,提高生成的 3D 图像和光…

STM32低功耗分析

1.ARM发布最新内核 2023 年5 月 29 日,Arm 公司今天发布了处理器核心:Cortex-X4、Cortex-A720 和Cortex-A520。这些核心都是基于 Arm v9.2 架构,只支持 64 位指令集,不再兼容 32 位应用。Arm 公司表示,这些核心在性能…

postgresql-常用日期函数

postgresql-常用日期函数 简介计算时间间隔获取时间中的信息截断日期/时间创建日期/时间获取系统时间时区转换 简介 PostgreSQL 提供了以下日期和时间运算的算术运算符。 获取当前系统时间 select current_date,current_time,current_timestamp ;-- 当前系统时间一周后的日…

Selenium - Tracy 小笔记2

selenium本身是一个自动化测试工具。 它可以让python代码调用浏览器。并获取到浏览器中加们可以利用selenium提供的各项功能。帮助我们完成数据的抓取。它容易被网站识别到,所以有些网站爬不到。 它没有逻辑,只有相应的函数,直接搜索即可 …

在Linux系统上用C++将主机名称转换为IPv4、IPv6地址

在Linux系统上用C将主机名称转换为IPv4、IPv6地址 功能 指定一个std::string类型的主机名称&#xff0c;函数解析主机名称为IP地址&#xff0c;含IPv4和IPv6&#xff0c;解析结果以std::vector<std::string>类型返回。解析出错或者解析失败抛出std::string类型的异常消…

用友U8与MES系统API接口对接案例分析

企业数字化转型&#xff1a;轻易云数据集成平台助力 U8 ERPMES 系统集成 为什么选择数字化转型&#xff1f; 领导层对企业资源规划&#xff08;ERP&#xff09;的深刻理解促使了数字化转型的启动。采用精确的“N5”滚动计划&#xff0c;为供应商提供充分的预期信息&#xff0c…

Tomcat多实例与负载均衡

Tomcat多实例与负载均衡 一、Tomcat多实例1.1、安装JDK1.2、安装tomcat1.3、配置tomcat环境变量1.4、修改tomcat中的主配置文件1.5、修改启动脚本和关闭脚本1.6、 启动tomcat并查看 二、NginxTomcat负载均衡、动静分离2.1、部署Nginx负载均衡2.2、部署第一台tomcat2.3、部署第二…

【Jetpack】Jetpack 简介 ( 官方架构设计标准 | Jetpack 组成套件 | Jetpack架构 | Jetpack 的存在意义 | AndroidX 与 Jetpack 的关系 )

文章目录 一、Google 官方推出的架构设计标准 Jetpack二、Jetpack 组成套件三、Jetpack 架构四、Jetpack 的存在意义1、提高开发效率2、最佳架构方案3、消除样本代码4、设备系统兼容性5、改善应用性能6、测试支持 五、AndroidX 与 Jetpack 的关系 一、Google 官方推出的架构设计…

SpringBoot结合MyBatis实现多数据源配置

SpringBoot结合MyBatis实现多数据源配置 一、前提条件 1.1、环境准备 SpringBoot框架实现多数据源操作&#xff0c;首先需要搭建Mybatis的运行环境。 由于是多数据源&#xff0c;也就是要有多个数据库&#xff0c;所以&#xff0c;我们创建两个测试数据库&#xff0c;分别是…

使用最新android sdk 将jar文件编译成dex

最近需要一些比较骚的操作&#xff0c;所以需要将gson编译成dex。 因为手上有jar包&#xff0c;所以就拿出了android sdk准备一把入魂&#xff0c;结果报错不断&#xff0c;让人无奈。只好根据报错来调整编译步骤&#xff0c;不得不为安卓环境更新Debug。 1、dx变d8 并不确定…