学习Transformer前言(Self Attention Multi head self attention)

news2024/11/24 10:50:29

一、前言

一直在做项目,也比较懒没有挤出时间去学习新的东西,感觉停滞很久了,好长一段时间都没有新的知识输入,早就需要就去学习transformer了,因此先来学习注意力机制,本文为个人的一个笔记总结。主要是基于李宏毅老师的一个课程视频笔记,论文原文,加上B站UP主的霹雳吧啦Wz的视频。

二、理论

2.1模型的输入类别

self-attention和CNN不同,这是另外一种网络结构,与CNN不同,网络输入不再是一个向量,而是一个向量序列,而且输入的向量序列长度是不定的。举例,在文字处理时,我们需要输入一个句子判断它的每一个单词的词性,如果我们输入this is a cat, 可以使用onehot向量来表示每一个单词,可以把这个onehot向量维度设为超大的一个向量,这样onehot编码就能表示所有的向量了,但是这样编码是会带来很大的问题,因为这样编码相当于假设所有的词汇之间是没有任何关系的,这显然是不合理的,因为dog和cat和明显都是动物,它们之间是有关联的。

为了解决上面的问题,研究者提出word embedding的方法,这种编码方式就将单词之间的联系考虑了进去。

其他可能需要多个向量作为向量序列作为输入的情况,例如:语音的输入编码,分子结构,图网络等。

2.2模型的输出类别

有三种情况,第一种每一个向量都有一个对应一个输出,输入和输出数量一样多,也称为sequence labeling,第二种整个输入向量只有一个输出,最后一种就是输出个数是不定的。

2.3如何更好的考虑到模型输入?

本文基于第一种输出,例如假如我们还是按照以前的做法来进行输出,每一个向量分别输入到全连接层得到对应的结果。看似也能解决问题,但是这其实会存在一些问题,例如如果我们是在做一个词性判断的任务,输入一个句子, I saw a saw,很显然这两个位置的词的词性显然不相同,如果还是采用上面的方式来输入网络,理论上两个saw得到的结果是一样的,因此直接分别输入全连接层得到结果是不合理的,如何改进?很容易就想到我们应该考虑到上下文的关系。也就是在输入每一个向量时候,考虑到其他的向量,这样就包含了上下文的关系

那么如何考虑上下文的关系?

有一种做法就是考虑前后相邻的一个窗口的信息,但是这也存在问题,如何设置这个窗口的长度,有人可能会想提出直接设置窗口长度为最大的向量序列的长度,这会导致全连接层的参数巨大,而且还需要我们去统计向量序列的最长长度。因此这不是很好的方法,因此我们引入的了self-attention

2.4.self-attention的提出

在这里我们引入了self-attention的模块来处理每一个向量,每一个经过self-attention模块的向量都包含了整个向量序列的信息。而且self-attation和卷积一样可以重复使用,可以在经过self-attention处理再继续添加self-attention模块。事实上,虽然self-attention在很多paper已经提出,但提到self-attention往往想到的是transformer,而transformer第一次提出是在Attention is all you need这篇paper。

2.5.self-attention模块

具体来看经过self-attention处理的向量都会考虑到之前输入的整个向量序列的信息。举例来看也就是b1是由a1, a2, a3,a4经过某种操作得到的。

那么这种操作是什么?

有很多种操作,本文主要是dot-product,前面提到我们需要考虑到整个向量序列的信息,也就是需要知道每两个向量之间的联系,我们可以用α来衡量这两个向量之间的关系。因此dot-product就是输入两个需要计算关系的向量,得到他们的关系。

那么如何操作?

在dot-product中,我们对于输入的两个向量分别乘以𝑊𝑞和𝑊𝑘分别得到q和k,再将q和k做点积得到α(原论文会除以根号d,d为向量的长度,除以根号d的原因主要是为了防止点乘后数值过大,导致softmax处理后梯度很小)

则在整个向量序列计算时就会有如下表:

1

2

分析:其实可以看到对于一整个self-attention的计算中b1的计算,我们需要先分别计算a1, a2, a3, a4与a1的attention scores也即α,然后经过softmax处理来归一化(softmax处理不是必须的,也可以使用其他的方法),然后我们在分别得到v1, v4,这样最终得到的b1相当于将各个部分乘以权重得到的值。

以上为理论的做法,只计算了单独一个b1,下面主要考虑加入矩阵的思想来得到所有的经过self-attention的值

2.6.self-attention的矩阵表示

1

2

3

4

分析:

这样看来self-attention其实就是一系列的矩阵乘法,看似复杂,其实真正未知的只有𝑊𝑞 和𝑊𝑘以及𝑊𝑣,这三个矩阵参数需要学习。

2.7多头注意力Multi-head-attention

本质上在self-attention中,我们使用的是单个q,k去寻找两个向量之间的关系,但是当关系有多种时,我们应该去使用多个q,和多个K来计算他们的多个相关性。

例如:当计算两个attention时有,有如下步骤

1

2

3

4

三、self-attention与CNN以及RNN的对比

3.1.self attention 与 CNN

由于self-attention考虑的是一整个图像的讯息,而CNN考虑到的是感受野里面的讯息,所以我们可以说CNN是简化版的self-attention,self-attention是更复杂的CNN

由于CNN是更简单的模型,因此CNN相比self attention更适合在小的数据量上进行训练,而self attention 更适合在大的数据量上训练,下面这张表显示了在不同的数据量卷积模型和注意力机制的模型效果。在数据量更大的时候,看到self attention 的效果是好于CNN的。

3.2.self attention 与RNN

与RNN相比,self attention有两个明显的优势,一个就是self-attention可以平行化处理,而RNN必须等前面的处理完才能继续处理。另外一个优势就是RNN更难考虑真个向量序列的信息,不同的向量之间存在远近的关系,而self attention更容易考虑整个向量序列的向量之间的关系,因为不同的向量之间是“等距的”。

四、学习视频与论文地址

李宏毅老师视频地址:第四节 2021 - 自注意力机制(Self-attention)(上)_哔哩哔哩_bilibili

论文原文地址:Attention is all you need

B站up主视频地址:Transformer中Self-Attention以及Multi-Head Attention详解_哔哩哔哩_bilibili

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

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

相关文章

Linux系统编程(三)—— 文件编程(3)进程环境

一、main函数 现在的格式:int main(int argc, char *argv[])以前的main函数有三个参数,另一个参数就是环境变量 二、进程的终止(两种都要背下来) 2.1 正常终止 (1)从main函数返回 main函数被称为程序的…

第10章:堆

堆是什么? 堆是一种特殊的完全二叉树。 完全二叉树:每层节点都完全填满,最后一层若是没填满,则只缺少右边的节点。所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。jav…

软考——数据结构,算法基础,程序设计语言,法律法规,多媒体基础

数据结构与算法基础 数组与矩阵线性表广义表树与二叉树图排序与查找算法基础及常见算法 数组 稀疏矩阵 直接把(0,0)带入,排除B,C 将(1,1)带入,排除D, 最终…

Python | 人脸识别系统 — 博客索引

本博客为人脸识别系统的博客索引 工具安装、环境配置:Python | 人脸识别系统 — 简介 1、UI代码 UI界面设计:Python | 人脸识别系统 — UI界面设计UI事件处理:Python | 人脸识别系统 — UI事件处理 2、用户端代码 用户端博客索引:…

Jupyter Notebook入门教程

Jupyter Notebook(又称Python Notebook)是一个交互式的笔记本,支持运行超过40种编程语言。本文中我们将介绍Jupyter Notebook的主要特点,了解为什么它能成为人们创造优美的可交互式文档和教育资源的一个强大工具。 首先&#xff…

vue diff算法与虚拟dom知识整理(4) h函数虚拟节点嵌套

那么 先补充上文有一个没强调的点 h函数 当你不需要属性时 其实是可以不传的 例如 我们打开案例 打开 src下的index.js 修改代码如下 import {init,classModule,propsModule,styleModule,eventListenersModule,h,} from "snabbdom";//创建patch函数const patch ini…

CUBLAS 和 CUDNN

文章目录 一、什么是CUBLASCUBLAS实现矩阵乘法CUBLAS中的Leading DimensionCUBLAS LEVEL3函数 : 矩阵矩阵CUBLAS实现矩阵乘法 二、cuDNN使用CuDNN实现卷积神经网络 四、CUBLAS和CUDNN实践 一、什么是CUBLAS cuBLAS是BLAS的一个实现。BLAS是一个经典的线性代数库&am…

解决C语言的缺陷【C++】

文章目录 命名空间展开了命名空间域指定访问命名空间域域作用限定符命名空间定义 C输入&输出缺省参数全缺省参数半缺省参数缺省参数应用 函数重载参数类型不同参数个数不同参数类型顺序不同 引用引用的特性引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实…

基于Radon-分数傅里叶变换对消器的海杂波弱目标检测

海面微弱目标检测面临的主要困难来自: 慢速小目标回波微弱;空时变海杂波异常复杂,海杂波特性认知难度大;目标模型难以建立;目标、海杂波类别非平衡。 ARU效应 是由于海面波浪的起伏和涟漪引起的。在雷达回波信号中&am…

nodejs开发 | 安全工具端口扫描器

今天分享一个nodejs的demo,可以扫描出指定IP的端口开放情况。 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8…

[笔记]Python计算机视觉编程《一》 基本的图像操作和处理

文章目录 前言环境搭建 计算机视觉简介Python和NumPy第一章 基本的图像操作和处理1.1 PIL:Python图像处理类库1.1.1 转换图像格式1.1.2 创建缩略图1.1.3 复制和粘贴图像区域1.1.4 调整尺寸和旋转 1.2 Matplotlib1.2.1 绘制图像、点和线 前言 今天,图…

python基础实战6-python字符串

1字符串的表达方式 字符串是 Python 中最常用的数据类型。我们可以使用引号 ( 或 " ) 来创建字符串。 字符串表达方式 a " I m Tom" #一对双引号 b ’Tom said:" I am Tom" #一对单引号 c ‘Tom said: " I\m Tom" #转义字符 d T…

python库,科学计算与数据可视化基础,知识笔记(numpy+matplotlib)

文章目录 1、numpyndarray对象,数组指定形状创建(要会)数组的索引,切片与遍历(要会)数组的相加,转置,展开(要会)数组元素增删改查(最好会&#xf…

当CRM遇见ChatGPT,AI如何帮销售打造“最强大脑”

导读:这一轮AI浪潮将对CRM企业带来哪些新机遇? ChatGPT诞生至今不过100多天,但它已经对很多行业产生了巨大影响。 企业直面市场的一线战场——销售、营销、客服等领域也是如此。以ChatGPT为代表的人工智能技术热潮正在改变着传统营销、销售的…

MySQL--group by--聚合函数--内置函数--0415 22

目录 1.聚合函数 1.1 count 1.2 sum 1.3 avg 1.4 max 和 min 2. group by 2.1 group by 的条件筛选——having 2.2 总结 3.日期函数 4.字符串函数 concat replace substring 以首字母大写,其余字母小写的方式显示员工的姓名 5.数学函数 format rand()…

C plus plus ——【继承与派生】

系列文章目录 C plud plus ——【面向对象编程】 C plus plus ——【继承与派生】 文章目录 系列文章目录前言一、继承1.1 类的继承1.2 继承后可访问性1.3 构造函数访问顺序1.4 子类隐藏父类的成员函数 二、重载运算符2.1重载运算符的必要性2.2重载运算的形式与规则2.3 转换运…

数字信号处理学习1

基本上算是没怎么学过数字信号处理这门课,因为本科的时候,专业方向用不上,现在没法子了,专业使然,只能自己自学了,但是我又不知道该从何学起,就买了一本现代数字信号处理,结果发现人…

数据结构/队列实现栈

前言 在学习数据结构的过程当中,我们会学到栈和队列,在本篇文章中,重点讲解的是队列实现栈,在上篇文章中已经简单介绍过栈和队列的使用说明,以及栈实现队列。(2条消息) 数据结构/栈实现队列_Y君的进化史的博客-CSDN博客…

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己 主要是吴恩达的网课,还有部分github的prompt-engineering-for-developers项目,以及部分自己的经验。 一、常用使用技巧 prompt最好是英文的,如果是中文的prompt&am…

Day961.老城区前端改造 -遗留系统现代化实战

老城区前端改造 Hi,我是阿昌,今天学习记录的是关于老城区前端改造的内容。 什么是“改造老城区”。改造老城区模式 是指对遗留系统内部的模块进行治理,让模块内部结构合理、模块之间职责清晰的一系列模式。 也就是说,在遗留系统…