深度学习attention机制中的Q,K,V分别是从哪来的?
找了各种资料,也读了论文原文,都是详细介绍了怎么把Q,K,V通过什么样的运算得到输出结果,始终没有一个地方有解释Q,K,V是从哪来的?一个layer的输入不就是一个tensor吗,为什么会有Q,K,V这三个tensor?
我自己用了一个比较通俗的思维去理解这个QKV,但是不一定对,仅供参考
假设你有一个词库,这里面有100个词,现在有两个词,他们的词向量是A和B
现在你有一个训练任务,假设是翻译,那么attention机制就是将词向量根据你的训练任务细分成了三个属性,即QKV,这3个属性变换需要的矩阵都是训练得到的。
Q(query)可以理解为词向量A在当前训练语料下的注意力权重,它保存了剩下99个词与A之间的关系。
K(key)是权重索引,通过用别的词(比如B)的注意力索引K(key)与A的注意力权重(Query)相乘,就可以得到B对A的注意力加权
V(value)可以理解为在当前训练语料下的词向量,是在原有词向量的基础上,利用当前训练语料进行强化训练后得到的词向量
这样一来通过QK就可以计算出一句话中所有词对A的注意力加权,然后将这个注意力加权与各自对应的新词向量(value)相乘,就可以得到这句话中所有词对A词的注意力加权词向量集,接下来我们就可以通过这个向量集作为输入,预测A的翻译结果。
Transformer用到了两个attention模块:一个模块被用于encoder,一个模块位于decoder。
encoder中的attention叫做self-attention,此时QKV分别为这个模块的输入(第一层为词嵌入,第二层及以后为上一次层的输出)分别乘上三个矩阵得到的结果分别为QKV,这三个矩阵是在训练的时候学习。
decoder中的attention叫做encoder-decoder attention,这个attention的KV来自encoder的最后一层输出,继续乘以不同的矩阵。至于Q就是decoder上一层的输出乘以一个矩阵。
SDPA 的数据流图表示和矩阵形式的计算示例 MHA 的矩阵形式计算示例 我在手机上,公式复制完全都不显示了。具体内容,看看我这篇文章是否能帮助到,后面画了一堆瓶瓶罐罐那部分
https://zhuanlan.zhihu.com/p/353423931?zhuanlan.zhihu.com以encoder为例:
Q,K,V是什么?
query,key,value。
Q,K,V的来源?
Q,K,V来源于input的embedding。
Q,K,V的生成方式?
embedding通过三个不同的线性层生成Q,K,V。
Q,K,V的意义?
Q,K,V表示的意义都是相同的,通过与学习到的参数矩阵相乘,可以说生成了不同的表达方式。
为什么可以这么生成?
大抵是神经网路的哲学。而且我记得,在self-attention之前的attention score function中就有类似通过线性层计算score的方法。(general?
我觉得你可能想要Q K V的基本概念性含义,可以看看我写的这个理解:
viper:transfomer里面self-attention的Q, K, V的含义?zhuanlan.zhihu.comSelf-attention 是 Attention 里面的一种目前比较流行的 Attention,但也是 Attention 框架下的一种特殊情况。
所以要了解 Q,K,V,肯定要从还不 ALL YOU NEED 之前的世界观来理解,比如
Neural Machine Translation by Jointly Learning to Align and Translate?arxiv.orgQKV 不同的情况来理解
三个神经网路,对同一输入进行三次不同变换,生成了Q,K,V
我说是你自己定义的,爱怎么定义怎么定义你肯定不信我。不过事实就是这样的
通俗点说,我们要做一个任务,现在有一组不同的&对,我们需要输入一个Query,来计算得到最终的Value值。
Attention机制中的Q,K,V即是,我们对当前的Query和所有的Key计算相似度,以这个相似度为基准通过Softmax层进行归一化得到一组权重,根据这组权重与对应Value的乘积求和得到Attention下的Value值。
和这个图表现出的一样。QKV这种可以算作Attention机制中最基本的思想。
看一眼代码不就秒懂么。 都是一个东西啊,就是输入的embedding啊 。
推荐阅读: