从零对Transformer的理解(台大李宏毅)

news2024/12/23 13:20:41

Self-attention layer自注意力

在这里插入图片描述对比与传统cnn和rnn,都是需要t-1时刻的状态然后得到t时刻的状态。我不知道这样理解对不对,反正从代码上看我是这么认为的。而transformer的子注意力机制是在同一时刻产生。意思就是输入一个时间序列,在计算完权重后就直接得到状态。

计算注意力机制的参数q,k,v在这里插入图片描述

那么相信大家肯定看不懂上面的,接下来我来说说a(1,n)怎么计算(如图):
在这里插入图片描述
也就是q1 * kn(n=1,2,3,4)
但是相信大家疑惑的是为什么要除以根号d?
很简单因为k和q的维度一样 但是k的行数越多(听不懂就理解k的变量越多)那么和q分别相加相乘后会导致变量变得很大,这个除以维度根号d也就是启平衡的作用。

接下来是进行和特征v相乘

在这里插入图片描述
看图可以知道 我们要输出的第一sequence的第一个向量是b1 ,但是我们是如何得到的呢,很简单,将我们上一步得到的a(1,n) *v[n]。看着很眼熟,是不是可以把它变成矩阵相乘类型。那这些有什么意义? 你看我们生成b1的时候我们考虑道路a1~a4所有的特征,并且假如我们不想考虑a1的特征的时候,我们只需要在这里插入图片描述

如何把它变成矩阵相乘从而加速?

如图 将上述的乘法变成矩阵相乘

在这里插入图片描述
那么我们可能不懂这个W是干什么的?这个就是相对的特征参数。打个比方就是比如一个蛋糕怎么给三个人分,每个人分多少,也就是权重。

ok。理解之后我们开始做乘法,一开始我们是要用同q1乘以k1~k4得到a(1,n) ,如下图
在这里插入图片描述

那么我们是不是可以这样
在这里插入图片描述
那么我们继续推导,假如我们要得到a(2,n),a(3,n)呢?是不是可以加q2,q3?然后对A矩阵进行softmax。
在这里插入图片描述

那么我要得到最后的b1~b4怎么做?是不是只需要做一个简单的行列相乘就行了。
在这里插入图片描述

那么我们总体可以得到
在这里插入图片描述
在这里插入图片描述

多头注意力机制

ok上面我们懂了什么是自注意力,那么这里我们来了解一下什么是多头?
很简单,多头就是多个特征头,我们以两个头为例子,我们的q,k,v特征可以不仅仅是一个维度,可以是多维度,那么多个维度,我们用两个头来举例,q(n,1),q(n,2) n=(1,2,3,4)。但是我们相乘的话不能交叉?什么意思呢?打个比方,我们和某个人进行比较,我们不能拿我们体重的数据去对比人家的身高数据,这样做的意义不大。所以这里的q,k,v分出的头相乘还是只能跟自注意力机制一样q(n,1)*k(n,1),q(n,2)*k(n,2)这样进行(当然这里是矩阵相乘意思到位就行)。如图
在这里插入图片描述


但是最后我们得到两个sequence之后呢,我们并不是简单的相加,我们也可以进行降维,这是什么意思呢?举个例子就是两个不同的男孩子去追同一个女孩,一个男孩子就喜欢关注女孩的外表从而得出女孩的特征,还一个男孩子就喜欢关注女孩子的内在而得到特征。所以我们的任务是调整这两个特征的权重,而达到我们预期效果。如图在这里插入图片描述

位置编码

其实我们仔细观察前面讲的自注意力 的时候发现了一个问题,就是说我们无论输入的序列怎么颠倒,但是我们获得的信息是一样的?为什么?因为我们对不同的q,k,v权重里面获得了固定的信息。不跟传统rnn一样需要上一个时刻的信息。那么这里我们提到了位置编码?
什么是位置编码?为什么要位置编码?
打个比方,我们清楚一件事,就是一个句子的主谓宾很重要,比如我爱你和你爱我完全两个意思,在你追女孩的时候你更想听到你爱我而不是我爱你。所以我们需要对我们输入的向量的对应位置进行编码,论文做法就是加位置编码e[n]。
在这里插入图片描述

还一个问题,为什么是加而不是concat?
我们加的话不会导致它的特征混淆找不到吗?
这里我们给出解释:
我们假设有一个one-hot编码向量p(i),不知道one-hot的可以自己去学一下
p(i)的i代表着第i维是1其他维度是零。这里我们把p(i),因为e(i)是位置编码,我们可以用one-hot编码来表示词的位置。接着我们将其concat后与权重W相乘得到我们对应的q,k,v。如下图
在这里插入图片描述

学过线性代数的我们可以把w堪称wi和wp分别和我们的xi和pi矩阵进行相乘,然后相加。所以相加和concat效果是一样的。但是concat增加了维度,反而会影响训练速度,所以我们选择相加来提高训练速度,不必要做无谓的空间浪费。

Encoder层

我们的编码层做的事情肯定是编码了。
在这里插入图片描述

1.看上这个结构是不是不懂? 不懂就对了。我们来仔细讲讲,首先是Input这里
在这里插入图片描述
这里我们之前讲过的position编号起到作用,意思是我们输入进去的序列需要加上位置信息(也可以成为语序信息)。

2.然后是到多头注意力和残差结构和Norm计算这里我们之前说过了多头注意力这里就不多提
在这里插入图片描述
然后Residual层是残差层,然后norm层是进行序列的计算。具体做法就是求出一个序列的平均然后除以标准差如下图。在这里插入图片描述

做完这些后再进入全连接层后再进行norm和残差就得到我们的一个block的处理。但实际我们有N个encoder叠加进行的,这也是N的意思
在这里插入图片描述

Decoder层

我们得到Encoder的输出后,再输入到Decoder层作为输入
在这里插入图片描述
我们看其实发现我们的Decoder层和我们的Encoder层在主题上差不多(在遮住中间的部分的时候)
但是我们发现有个不同的地方(除去中间遮住的部分),那就是Masked。那我们仔细看看它做了什么

Decoder的功能(以一个序列为例子)

我们看到“机器学习”这四个字,我们Masked做了什么呢?在我们的自注意力机制上面,我们知道我们假如要从输入a1得到b1 那么我们会其他a2-an的qkv进行自注意力计算然后在输出b1,但是我们的Masked却只是计算a1一个人的qkv特征得到b1,b2也只能用a1和a2的特征进行计算得到。一句话就是只能看左边,并且得到的输出会变成下一个词的输入。可能大家还是不懂,看下面的图。
在这里插入图片描述
我们得到机的时候是通过begin得到的(这里说一下,因为我们一个序列要一直做,所以我们会增加begin和end标签),那么我们得到机的时候又把机作为输入得到“器”,但是这个时候的“机”字却包含了之前的begin,以此类推,感觉这个类似rnn。

下面这两张图是对比自注意力和Masked自注意力区别,第一张为自注意力,第二张为Masked自注意力

在这里插入图片描述
在这里插入图片描述

那么中间的部分是什么?

CrossAtention!
它的目的很简单就是把encoder的输出和我们decoder的Masked那一层的输出结合进行crossatention后得到我们的结果。

在这里插入图片描述
具体是这样,从encoder的一个block中获得特征和decoder的Masked提取的特征进行自注意力机制的运算
在这里插入图片描述

最后说一下训练的时候和验证的时候用的损失函数

训练的时候用的交叉熵(也就是一个一个的单词对比),测试的时候用的是bule score 也就是生成的句子和测试的句子之前的对比得分。为什么不在训练的时候用bule score呢?因为不知道怎么用。

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

内存马的错误参数获取,导致原有接口失效解决方案

内存马的错误参数获取,导致接口失效。 前言 java Listener 类型内存马,在使用request.getParameter(String name); 获取请求参数去判断是否是恶意请求的时候,会影响某些框架无法接收到参数。 例子 在Jersey 框架 使用 MultivaluedMap 去接…

MSPM0G3507——创建新的.c.h文件

在项目处点击右键,再点击New File 再命名.c.h即可

mysql中的datetime类型在Java中到底对应哪个时间类型?

因为MySQL中用的是datetime类型(年月日 时分秒) java.sql.Date 在Java中用 java.sql.Date 接收 但是得到的却只有年月日 前端接收到的是时间戳 java.time.LocalDateTime 在Java中使用 java.time.LocalDateTime 接收 得到的是带时区的时间 前端接收到的…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇入口差异切换上线IPC管道ATSC任务Impacket套件UI插件

红队内网攻防渗透 1. 内网横向移动1.1 横向移动入口知识点1.1.1、当前被控机处于域内还是域外1.1.1.1 在域内1.1.1.2 不在域内1.1.1.2.1 第一种方法提权到system权限1.1.1.2.2 第二种方法切换用户上线1.1.1.2.3 kerbrute枚举用户1.1.2、当前凭据为明文密码还是HASH1.2 横向移动…

Vue3中使用el-table遇到的问题

我在使用element-plus中el-table组件的时候&#xff0c;对于某一<el-table-column>标签内的内容设置show-overflow-tooltip属性&#xff0c;但这里溢出展示的tooltip的默认样式是无法像el-tooltip标签那样&#xff0c;直接可以修改的。默认的样式是这样&#xff1a; 因此…

江协科技51单片机学习- p11 静态数码管显示

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

包含网关的概念及案例演示

包容网关 知识点讲解 包容网关可以看作排他网关和并行网关的结合体。与排他网一样&#xff0c;可以在外出顺序流上定义条件&#xff0c;但与排他网关不同的是&#xff0c; 进行决策判读时&#xff0c;包容网关所有条件为true的后继分支都会被依次执行。如果所有分支条件都为fa…

24年火爆全网的企业信贷产品-民生惠详解

今年&#xff0c;民生惠企业信贷产品非常火爆&#xff01;客户想申请这信用贷款前&#xff0c;先确认下自己是不是在白名单里。有些地区还能加进白名单&#xff0c;不在的话就别申请了&#xff0c;这是专门给受邀的小微企业的。 这款产品的细节是这样的&#xff1a; 额度&am…

实用软件下载:会声会影2023最新安装包及详细安装教程

可以说它不仅符合家庭或个人所需的影片剪辑功能&#xff0c;甚至能够挑战专业级的影片剪辑软件&#xff0c;适合一般大众使用&#xff0c;操作简单易懂&#xff0c;界面简洁明快。从总体上来看影片制作向导模式&#xff0c;只要三个步骤就可快速做出DV影片&#xff0c;入门初学…

一篇快速教你如何创建专业级数据可视化库

Seaborn 是一个基于 matplotlib 的 Python 库,主要用于数据探索、统计可视化和交互式分析.它提供了一种更高级、更美观的方式来绘制统计图表. 安装&#xff1a; pip install seaborn示例&#xff1a; import seaborn as sns import pandas as pd import matplotlib.pyp…

服务器SSH 免密码登录

1. 背景 为了服务器的安全着想&#xff0c;设置的服务器密钥非常长。但是这导致每次连接服务器都需要输入一长串的密码&#xff0c;把人折腾的很痛苦&#xff0c;所以我就在想&#xff0c;能不能在终端SSH的时候无需输入密码。 windows 可以使用 xshell 软件&#xff0c;会自…

nvidia历史版本驱动

打开官网 https://www.nvidia.cn windows GTX-1060为例 标准

Centos Stream9 和Centos Stream10的下载网址

Index of /https://mirror.stream.centos.org/

Redis进阶 - Redis 淘汰策略

我们知道Redis是分布式内存数据库&#xff0c;基于内存运行&#xff0c;可是有没有想过比较好的服务器内存也不过几百G&#xff0c;能存多少数据呢&#xff0c;当内存占用满了之后该怎么办呢&#xff1f;Redis的内存是否可以设置限制&#xff1f; 过期的key是怎么从内存中删除的…

SQLite数据库(数据库和链表双向转换)

文章目录 SQLite数据库一、SQLite简介1、SQLite和MySQL2、基于嵌入式的数据库 二、SQLite数据库安装三、SQLite的常用命令四、SQLite的编程操作1、SQLite数据库相关API&#xff08;1&#xff09;头文件&#xff08;2&#xff09;sqlite3_open()&#xff08;3&#xff09;sqlite…

VBA技术资料MF164:列出文件夹中的所有文件和创建日期

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【Arduino】实验使用ESP32单片机根据光线变化控制LED小灯开关(图文)

今天小飞鱼继续来实验ESP32的开发&#xff0c;这里使用关敏电阻来配合ESP32做一个我们平常接触比较多的根据光线变化开关灯的实验。当白天时有太阳光&#xff0c;则把小灯关闭&#xff1b;当光线不好或者黑天时&#xff0c;自动打开小灯。 int value;void setup() {pinMode(34…

STM32驱动-ads1112

汇总一系列AD/DA的驱动程序 ads1112.c #include "ads1112.h" #include "common.h"void AD5726_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE );//PORTA、D时钟使能 G…

C++入门 vector部分模拟实现

目录 vector大致框架 vector常见接口模拟实现 begin迭代器 & end迭代器 capacity( ) & size( ) reserve operator[ ] push_back( ) & pop_back( ) sort vector大致框架 vector的内部的成员变量大概有三部分构成&#xff1a; namespace bit {template<c…

python字符串如何删除后几位

1、首先在jupyter notebook中新建一个空白的python文件&#xff1a; 2、然后定义一个字符串&#xff0c;用字符串截取的方式打印出排除最后三个字符的结果&#xff0c;这里的“s[:-3]”的意思就是从字符串取第0个字符至倒数第三个字符的前一个字符&#xff0c;这样就截取了最后…