找了各种资料,也读了论文原文,都是详细介绍了怎么把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.com图标

Self-attention 是 Attention 里面的一种目前比较流行的 Attention,但也是 Attention 框架下的一种特殊情况。

所以要了解 Q,K,V,肯定要从还不 ALL YOU NEED 之前的世界观来理解,比如

Neural Machine Translation by Jointly Learning to Align and Translate?

arxiv.org

QKV 不同的情况来理解


三个神经网路,对同一输入进行三次不同变换,生成了Q,K,V


我说是你自己定义的,爱怎么定义怎么定义你肯定不信我。不过事实就是这样的


通俗点说,我们要做一个任务,现在有一组不同的&对,我们需要输入一个Query,来计算得到最终的Value值。

Attention机制中的Q,K,V即是,我们对当前的Query和所有的Key计算相似度,以这个相似度为基准通过Softmax层进行归一化得到一组权重,根据这组权重与对应Value的乘积求和得到Attention下的Value值。

和这个图表现出的一样。QKV这种可以算作Attention机制中最基本的思想。


看一眼代码不就秒懂么。 都是一个东西啊,就是输入的embedding啊 。


推荐阅读:
相关文章