transformer中对于QKV的个人理解

2024-06-10 00:36
文章标签 理解 transformer 个人 qkv

本文主要是介绍transformer中对于QKV的个人理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

目录

1、向量点乘

2、相似度计算举例

3、QKV分析

4、整体流程

(1) 首先从词向量到Q、K、V

(2) 计算Q*(K的转置),并归一化之后进行softmax

(3) 使用刚得到的权重矩阵,与V相乘,计算加权求和。

5、多头注意力


 

eb2919d2e03c4e1eaf437f0c569ecb42.png

上面这个transformer中的注意力公式,相信大家不会陌生。公式并不复杂,但是why? 为什么是这个公式,为什么大家都说QKV代表Query(查询)、Key(键)和Value(值)?

之前了解transformer的时候,对于QKV的设定感到很奇怪,后来慢慢接受了这个设定,今天记录一下自己的理解。

1、向量点乘

首先从向量点乘说起,是用于计算两个向量的相似度。

2e40f19a064b4282900ac287ec489801.png

图中可以看到如果两个向量的方向相同或相近,它们的点乘结果会很,表示这两个向量相似度。相反,如果向量方向相反,点乘结果会很小或为负值

10412f0f2eca4378b39b90879253e0d5.png

向量x和向量y点乘表示向量x在向量y上的投影再乘以向量y。反应两个向量的相似度。

假设矩阵X由n个行向量组成,每个行向量xi代表一个词的词向量,整个矩阵由这些词向量组成。简而言之,矩阵X是一个词向量矩阵,每个元素都是一个词的向量表示。

具体来说,矩阵X是一个n×n的方形矩阵,其中包含n个行向量(n个词的向量)

ba62c2208ccf46bda9ee934514c0bd66.png

当矩阵X与它的转置XT进行乘法运算时,得到的是目标矩阵XXT。这个目标矩阵的每一个元素是通过矩阵X中的行向量与列向量的点乘得到的。如下图所示

bd2ec682373e4919850e337e3c719a1d.png

例如,目标矩阵XXT中的第一行第一列元素X0​⋅X0​,实际上是向量𝑋X0​与自身做点乘,这表示的是向量𝑋X0​与自身的相似度,也就是它自身的模的平方。

同样地,第一行第二列元素X0​⋅X1​表示的是向量X0​与向量X1​之间的相似度,即它们之间的点乘结果。

这个过程可以推广到矩阵X的所有行和列,从而得到整个XXT矩阵,其中每个元素都表示了对应向量之间的相似度

2、相似度计算举例

下面以词向量矩阵为例,这个矩阵中,每行为一个词的词向量。矩阵与自身的转置相乘,生成了目标矩阵,目标矩阵其实就是一个词的词向量与各个词的词向量的相似度。

6b75a7dac5694b159641ce3cf57fe13d.png

最终的矩阵数值代表了词向量之间的相似度。
我们为什么要求相似度,是为了合理分配权重。这个时候可以加上softmax

f50fafd313be45128cb69f59ad64be18.png

406c3fe78b384c31bb1132030cafd358.png

对上述得到的相似度矩阵应用Softmax函数,进行归一化处理。Softmax函数将每个元素转换成一个概率分布,使得每个元素的值都在0到1之间,并且所有元素的和为1。
这样,每个词向量与其他所有词向量的相似度都被转换成了一个概率权重。

接下来,将这个权重矩阵与原始的词向量矩阵 X 相乘。这个过程可以看作是每个词向量根据其权重与其他所有词向量进行加权求和。

a5a7366a573746348df8a030f57dcd2b.png

98e315d1fd614513bea90ab445bf0a94.png

权重矩阵中某一行分别与词向量的一列相乘,词向量矩阵的一列其实代表着不同词的某一维度。经过这样一个矩阵相乘,相当于一个加权求和的过程,得到结果词向量是经过加权求和之后的新表示。
这个新词向量综合了输入词向量矩阵中所有词的信息,权重由它们之间的相似度决定。

3、QKV分析

注意力Attention机制的最核心的公式为:

eb2919d2e03c4e1eaf437f0c569ecb42.png

a5a7366a573746348df8a030f57dcd2b.png

很相似。

daa232a6af8d45a29d2a80cb40134010.png

QKV的由来可以用图片演示为:

8f77ecb2f0c64fa1961e21f5e7d0869b.png

这些乘法操作是线性变换,它们将输入矩阵 X 映射到不同的表示空间,为注意力机制的计算提供基础。

注意力机制不直接使用原始的输入矩阵 X,而是使用经过这三个权重矩阵变换后的Q、K、V。因为使用三个可训练的参数矩阵,可增强模型的拟合能力。

dde1b4a960c44e2ea10007a21a6941bf.png

在上面这张论文中关于注意力的原图中,包含了我们之前所解释的过程,可以看到输入的是QKV,也就是真正输入到注意力的是这三个矩阵。流程解释如下:
04d5d81b41cb4c09b8da9341f6c1ed23.png

Mask是机器翻译等自然语言处理任务中经常使用的方法。在机器翻译等NLP场景中,每个样本句子的长短不同,对于句子结束之后的位置,无需参与相似度的计算(比如后面补充的数据为很大的负数,这样在softmax中这项就会接近于0),否则影响Softmax的计算结果。

4、整体流程

利用流程图重新整理一下整体的流程。

(1) 首先从词向量到Q、K、V

9d3d5a29a7ae434ab4c826da6056b9a0.png

(2) 计算Q*(K的转置),并归一化之后进行softmax

f4bc3ba133be4b9d95b4280e39820416.png

 

(3) 使用刚得到的权重矩阵,与V相乘,计算加权求和。

8230db7367134085bdbd213ce3be5dbe.png

5、多头注意力

为了增强拟合性能,Transformer对Attention继续扩展,提出了多头注意力(Multiple Head Attention)。如下图

c525035103c1420d87ebc2f7d1c0733c.png

其实就是重复之前的步骤,如下图

6ac527a6b8ff486eaae4abd7b9c61b7f.png

定义多组可训练的参数矩阵,生成多组Q、K、V。
比如我们定义8组参数,同样的输入X,最终会得到8个不同的输出,从Z0-Z7。

8042b2c5b55449238aa74269fe20c47d.png

在输出到下一层前,需要将8个输出拼接到一起,乘以矩阵WO, 将维度降低回我们想要的维度。

1cc8f48a1c6d498eabc24d36366627d2.png

输入的X是2行4列,QKV是2行3列,经过QKT得到2行2列,再乘以V得到2行3列的Z,8个Z拼接成2行24列的矩阵,通过乘以一个24行4列的矩阵WO可以变回X的2行4列,之后继续输入到下一层

 当前为后续层时,即不是第一层的编码器,输入数据不再是原始文本,而是上一层编码器的输出。这意味着每一层都会接收前一层的输出作为自己的输入。 

6、个人理解(如有不对,还请指正)

其实大家常说的Q 是Query,K 是Key,V 是Value,并非一定就是以我们主观上理解的逻辑。更多的是为transformer的有效性找到合理的解释,我个人理解为transformer的设计是empirical,那些解释是由果推因。

多头注意力机制为模型提供了一种并行处理信息的能力,允许它同时在多个表示子空间中捕捉数据的特征。这种设计不仅拓宽了模型的感知范围,而且使其能够在不同的潜在特征空间中探索更为丰富的信息维度。
这些特征空间中蕴含的信息,可能超出了人类直观理解的范畴,但正是这些难以捉摸的特征,为模型提供了更深层次的数据理解能力,从而在各种任务中展现出卓越的性能。

 

 

 

 

这篇关于transformer中对于QKV的个人理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046745

相关文章

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念