当前位置: 首页 > news >正文

transformer中为什么使用不同的K 和 Q, 为什么不能使用同一个值?

我也有过题主的疑问,但是感觉其他人都没有回答到点子上。

题主应该是想问,既然K和Q差不多(唯一区别是W_k和W_Q权值不同),直接拿K自己点乘就行了,何必再创建一个Q?创建了还要花内存去保存,不断去更新,多麻烦。

(这个是self-attention的公式,主要有Q,K,V三个向量)

想要回答这个问题,我们首先要明白,为什么要计算Q和K的点乘。

现补充两点

  1. 先从点乘的物理意义说,两个向量的点乘表示两个向量的相似度。

  2. Q,K,V物理意义上是一样的,都表示同一个句子中不同token组成的矩阵。矩阵中的每一行,是表示一个token的word embedding向量。假设一个句子"Hello, how are you?"长度是6,embedding维度是300,那么Q,K,V都是(6, 300)的矩阵

简单的说,K和Q的点乘是为了计算一个句子中每个token相对于句子中其他token的相似度,这个相似度可以理解为attetnion score,关注度得分。比如说 "Hello, how are you?"这句话,当前token为”Hello"的时候,我们可以知道”Hello“对于” , “, “how”, “are”, “you”, "?"这几个token对应的关注度是多少。有了这个attetnion score,可以知道处理到”Hello“的时候,模型在关注句子中的哪些token。

这个attention score是一个(6, 6)的矩阵。每一行代表每个token相对于其他token的关注度。比如说上图中的第一行,代表的是Hello这个单词相对于本句话中的其他单词的关注度。添加softmax只是为了对关注度进行归一化

虽然有了attention score矩阵,但是这个矩阵是经过各种计算后得到的,已经很难表示原来的句子了。然而V还代表着原来的句子,所以我们拿这个attention score矩阵与V相乘,得到的是一个加权后结果。也就是说,原本V里的各个单词只用word embedding表示,相互之间没什么关系。但是经过与attention score相乘后,V中每个token的向量(即一个单词的word embedding向量),在300维的每个维度上(每一列)上,都会对其他token做出调整(关注度不同)。与V相乘这一步,相当于提纯,让每个单词关注该关注的部分。

好了,该解释为什么不把K和Q用同一个值了。

经过上面的解释,我们知道K和Q的点乘是为了得到一个attention score 矩阵,用来对V进行提纯。K和Q使用了不同的W_k, W_Q来计算,可以理解为是在不同空间上的投影。正因为有了这种不同空间的投影,增加了表达能力,这样计算得到的attention score矩阵的泛化能力更高。这里解释下我理解的泛化能力,因为K和Q使用了不同的W_k, W_Q来计算,得到的也是两个完全不同的矩阵,所以表达能力更强。

但是如果不用Q,直接拿K和K点乘的话,你会发现attention score 矩阵是一个对称矩阵。因为是同样一个矩阵,都投影到了同样一个空间,所以泛化能力很差。这样的矩阵导致对V进行提纯的时候,效果也不会好。

推荐看一下这篇文章,对Q,K,V进行了很详细的讲解。

https://medium.com/dissecting-bert/dissecting-bert-part-1-d3c3d495cdb3

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法
  • FIOT/浙江信达可恩消防股份有限公司25周年庆典隆重召开
  • 网络编程(5)——模拟伪闭包实现连接的安全回收
  • 如何部署北斗定位应用,基于国产自主架构LS2K1000LA-i处理器平台
  • 未来数字世界相关技术、应用:AR/VR/MR;数字人、元宇宙、全息显示
  • 智源研究院与百度达成战略合作 共建AI产研协同生态
  • 从零预训练一个tiny-llama#Datawhale组队学习Task2
  • OJ在线评测系统 前端 完善题目提交服务 细讲异步前端请求与后端接口交互
  • 基于nodejs+vue的游戏陪玩系统
  • uniapp视频禁止用户推拽进度条并保留进度条显示的解决方法——方案二
  • AI 驱动旅游创业新机遇,旅游卡与共享旅游的融合发展
  • Java面试题之JVM20问
  • 进阶:反转二叉树的奇数层
  • SLF4J报错log4j又报错
  • 【C++】入门基础知识-1
  • Apache Spark Streaming 使用实例
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • IDEA常用插件整理
  • Just for fun——迅速写完快速排序
  • Python十分钟制作属于你自己的个性logo
  • SOFAMosn配置模型
  • Vue学习第二天
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 对JS继承的一点思考
  • 规范化安全开发 KOA 手脚架
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 强力优化Rancher k8s中国区的使用体验
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用quicker-worker.js轻松跑一个大数据遍历
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 飞书APP集成平台-数字化落地
  • # 数据结构
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (译)2019年前端性能优化清单 — 下篇
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core 6 集成和使用 mongodb
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .Net Core中Quartz的使用方法
  • .NET 给NuGet包添加Readme
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • :class的用法及应用
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945