提问:查了很多教程,也仔细看了Transformer的原始论文,大家都在讲Q、K、V矩阵怎么做点积和softmax得到注意力权重,但所有材料都默认我们知道这些Q、K、V矩阵最初是怎么生成的?
一个 layer 的输入不就是一个 tensor 吗,为什么会有 Q,K,V 这三个 tensor?
回答:我一搞NLP的,最近在研究Transformer架构,看到Self-Attention里QKV的设计时也有同样的困惑——为啥非得搞三个矩阵不可?
搜到这个问题后发现大家的解释都挺到位,不过可能还能再接地气点。我试着用"人话"捋了捋思路(画图苦手就不献丑了),理解可能有偏差请多包涵。
本质上注意力机制就是在学一套动态权重,自注意力就是要让数据自己决定谁跟谁更相关。
既然要计算元素间的关系,那确实得给每个输入分配表征向量,然后靠向量运算来捕捉关联。
那问题来了:只用一个向量行不行?明显不够用啊!假设只用单个查询向量q,q1和q2相乘算出a1和a2的关联后,这个结果往哪搁?
更关键的是,a1→a2和a2→a1的关联能等价吗?要是方向性不同怎么办?单向量方案怕不是把问题想简单了...
一个不够就定义两个,于是有了q和k。q你可以理解为代表自己用的,用q去和别的输入找关系;k理解为给别人用的,专门对付来跟你找关系的输入。
这样子,用自己的q去和别人的k(当然和自己的k也行)做乘法,就可以得到找出的关系:权重α了。
仅仅定义q和k两个够吗?恐怕还是不够的。发现的关系是要派上用场的,不用就等于白发现了。
权重α需要对输入信息进行加权,这样才能体现所发现关系的价值。那直接对输入加权行吗?这样操作也不是不可以,就是显得过于直接和粗糙了。
因此又引入了v。要注意的是,v和q、k相同,都是通过参数矩阵对输入a进行线性变换得到的。
所以定义v相当于给a额外增加了一层可学习的参数,然后对经过参数调整后的a再进行加权、将注意力机制学到的关系真正运用起来。
最终,通过α和v的乘积完成加权运算,得到输出o。
综上,我的感觉是,定义这 3 个 tensor,一方面是为了学习输入之间的关系、找到和记录谁和谁的关系权重,一方面也是在合理的结构下引入了可学习的参数,使得网络具有更强的学习能力。
底下这个图把他们之间的关系画得挺好了,来源于“极市平台《搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了》”,侵删。
个人粗浅解读,如有不妥请指教。我继续学习去了……