Transformer的一点理解,附一个简单例子理解attention中的QKV

Transformer用于目标检测的开山之作DETR,论文作者在附录最后放了一段简单的代码便于理解DETR模型。

DETR的backbone用的是resnet-50去掉了最后的AdaptiveAvgPool2d和Linear这两层。

self.backbone = nn.Sequential(*list(resnet50(pretrained=True).children())[:-2])

经过一次卷积加上position embedding,输入到transformer,position embedding是直接加和,不是像叠盘子一样的concat。

这里回顾一下transformer

transformer中最重要的attention,这篇文章Attention Is All You Need (Transformer) 论文精读 - 知乎

举了一个简单的例子,去解释attention中的QKV到底是什么含义。 这里

引用上述文章作者的例子:

如果我们有这样姓名和年龄一个数据库

张三:18
李四:22
张伟:19
张三:20

如果查询『所有叫张三的人的平均年龄』,Key==“张三”,可以得到Key对应的两个Value,算出(18+20)/2=19。我们把『所有叫张三的人的平均年龄』这句话称为一个查询(Query)

如果有另一个查询Query‘:『所有姓张的人的平均年龄』, Key[0]==“张”,得到三个Value:(18+20+19)/3=19

这样查询很低效,为了高效,将Query,Key转为向量vector。

将姓名(Key)汉字编码为向量

张三:[1, 2, 0]
李四:[0, 0, 2]
张伟:[1, 4, 0]

如果一个Quary是查询所有姓张的人的平均年龄,那么Quary可以写成向量  [1, 0, 0],将Quary向量和Key向量做点积

dot([1, 0, 0], [1, 2, 0]) = 1
dot([1, 0, 0], [1, 2, 0]) = 1
dot([1, 0, 0], [0, 0, 2]) = 0
dot([1, 0, 0], [1, 4, 0]) = 1

将结果softmax归一化

softmax([1, 1, 0, 1]) = [1/3, 1/3, 0, 1/3]

再将归一化后的结果与Value做点积

dot([1/3, 1/3, 0, 1/3], [18, 20, 22, 19]) = 19

就得到了想要的结果。(说句题外话,这样查询感觉跟布隆过滤器Bloom Filter有点相似的感觉,将文字编码成位数组)

这个计算就是Attention is all you need论文里Scaled Dot-Product Attention

 在transformer中,query key value关系如下图所示,(reference:The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.)

 将文字编码为向量x,x与矩阵W相乘,得到q,q与k做点乘,再除8(the square root of the dimension of the key vectors used in the paper – 64),再softmax,再成v,得到z

 

 

如果是多头注意力,就会得到多个注意力头的z

在RNN中,是按顺序输入,所以网络是知道每个输入的位置次序,但是transformer不是这样,因此还要加一个positional encoding,告诉网络输入的每个词在句子中的位置

 Transformer也使用了和resnet相似的残差连接。

将编码器得到的K,V矩阵输入到解码器

在解码的第一步中,输入K V,得到一个output,而在后续的解码中,将前一部的结果也一起输入解码器。比如第二步中,将第一步的结果 “I”也输入decoder,直到decoder给出 end of sentence为止。

transformer的损失函数,通过交叉熵,使两个分布相同

Output Vocabulary是提前建好的词库,网络输出的是词库中所有词 出现在这个位置的概率。

回到DETR,DETR中叠了6个transformer的encoder和decoder,将transformer输出再分别输入两个Linear,就得到了class和bbox。

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

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

相关文章

电脑乐园杂志电脑乐园杂志社电脑乐园编辑部2023年第3期目录

《电脑乐园》投稿邮箱:cnqikantg126.com(注明投稿“《电脑乐园》”) Q Q :695548262 微信号:f99832970 计算机信息技术 计算机人工智能识别技术的应用探析 (0001) 于洋;李泰元 项目教学法用于 中职计算机应用基础教学中的策略 (0004) 张莉…

LabVIEW如何获取波形图上游标所在位置的数值

LabVIEW如何获取波形图上游标所在位置的数值 获取游标所在位置数值的一种方法是利用波形图的游标列表属性。 在VI的程序框图中,右键单击波形图并选择创建引用 ,然后将创建的引用节点放在程序框图上。 在程序框图上放置一个属性节点,并将其…

后端真批量新增的使用

1,添加真批量新增抽象接口 public interface EasyBaseMapper extends BaseMapper { /** * 批量插入 仅适用于mysql * * return 影响行数 */ Integer insertBatchSomeColumn(Collection entityList); } 2,新增类,添加真批量新增的方法 public class InsertBatchSqlInjector ext…

聚焦数字化项目管理——2023年PMI项目管理大会亮点回顾

11月18日-19日,由PMI(中国)主办的2023年PMI项目管理大会在上海浦东嘉里大酒店圆满召开。本次大会以“数智时代,汇创未来”为主题,聚焦数智时代大背景下的项目管理行业发展和人才培养,吸引了海内外千余名项目…

基于Android校园交流uniAPP+vue 微信小程序v7e1

本系统结合现今XX校园交流APP的功能模块以及设计方式进行分析,使用Android平台和Ssm框架进行开发设计,具体研究内容如下: (1) 系统管理员主要对用户管理、类型管理、娱乐天地管理、投诉举报管理、学习平台、我的收藏管理、系统管理等功能进…

利用opencv/暗通道方法检测图像是否有雾-利用opencv/暗通道方法对深度学习目标检测算法结果进行二次识别提高准确率

目录 1 Python版本 2 C++版本 本来利用yolov5检测浓雾的,但是发现yolov5的检测结果会把一些正常天气检测成雾天,这种时候其实可以通过增加正常类,也就是将正常天气被误检成浓雾的图片当成一个正常类别去训练,但是不想标注图片,也不想重新训练算法了,因此想是不是可以用…

wvp-gb28181-pro打包

生成可执行jar cd wvp-GB28181-pro mvn package复制错误已复制 生成war cd wvp-GB28181-pro mvn package -P war 生成的包的路径 wvp-GB28181-pro\target

每日汇评:黄金从月度高点回落,但下行前进似乎有限

在美国FOMC会议纪要基调更加鹰派之后,金价走低; 美元疲软可能为金价提供一些支撑,并有助于限制进一步下跌; 金价屡次未能突破 2000 美元大关,多头必须保持谨慎; 金价延续了隔夜从2007美元区域(或…

海康威视监控相机的SDK与opencv调用(非工业相机)

1.研究内容 本篇主要对海康威视的监控相机的SDK回调进行研究,并于opencv结合,保存图像,以供后续其他处理,开发语言为C 2.步骤及方法 2.1 海康SDK介绍 海康SDK下载地址 根据自身编译环境,下载对应的SDK,需要注意的是…

身份证号码校验

根据《新版外国人永久居留身份证适配性改造要点》,公司需要把代码中对身份证的校验进行优化 就文档内容可以看到需要优化的要点是: 新版永居证号码以 9 开头 受理地区代码出生日期顺序码校验码;(共18位) eg&#xff…

python获取灰度图

思路很简单,就是读取图片,获取高宽,创造一个图片的模板,然后依次将三个通道的像素加权融合一下,再保存。 import cv2 import numpy as np import osroot "./test" for file in os.listdir(root):print(…

渗透工具---BurpSuite 插件开发之HelloWorld

本文主要记录如何利用burp官方的新版API即MontoyaApi 写helloworld(上一篇的demo使用旧版api写的,这篇及后续开发将采用新版api) 先看效果图 更多详细内容见下方 这里有更详细更全面的代码内容 以及配置相关的内容 https://mp.weixin.qq.co…

UnityAI——常用感知类型的实现

游戏中最常用的感知类型是视觉和听觉。对于视觉,需要配对的触发器和感知器,听觉也是。总的来说,游戏中有多个触发器和感知器,可以通过事件管理器同意对其进行管理 所有触发器的基类——Trigger类 在介绍感知之前,需要…

HarmonyOS ArkTS 基础组件的使用(四)

1 组件介绍 组件(Component)是界面搭建与显示的最小单位,HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件,我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类:…

8-flask django执行原生sql和sqlalchemy执行原生sql、flask-sqlalchemy使用、flask-migrate使用

1 原生sql(django-orm如何执行原生sql) 1.1 django执行原生sql 1.2 sqlalchemy执行原生sql 2 flask-sqlalchemy使用 3 flask-migrate使用 1 原生sql(django-orm如何执行原生sql) 1.1 django执行原生sql import osos.environ.setdefault(DJANGO_SETTINGS_MODULE, djangoProjec…

为什么要学习 Linux?

为什么要学习 Linux? 用 Linus 本人的话来说,用户不需要接触到操作系统。操作系统的功能是给应用程序提供API,因而,只有开发人员才需要学习操作系统。 最近很多小伙伴找我,说想要一些Linux的资料,然后我根…

【Unity细节】如何调节标签图标的大小(select icon)—标签图标太大遮住了物体

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

nginx的location中配置路径讲解

初次接触:可能会遇到404找不到页面的错误,主要原因是配置路径问题; 规则:ip port 等于 root,假设server的配置如下: server { listen 80; #端口号 location / { root /opt/sta…

Rust 9.2 Patterns and Matching

Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 18: Patterns and Matching src/main.rs fn main() {//match arms// match VALUE {// …

C/C++结构体给函数传参

C语言中结构体给函数传参有两种方法: 1.值传递(修改形参不改变原值) void fun(STUDENT student){……} int main(){fun(student); }2.引用传递(传的是地址,修改形参会改变原值) void fun(STUDENT * stud…