Attention与Self-Attention
对于很多从事计算机视觉的小伙伴来说,刚接触到Vision Transformer时,不理解其Self-Attention中的QKV到底表示什么,在这里简单记录自己的学习理解过程。
本文章结合沐神的动手学深度学习及B站大佬们的相关视频进行理解与学习,在此做记录:
视频1
视频2
沐神视频
文章中的图片内容均来自上方视频和动手学深度学习第二版。
什么是attention
对于数据来说,我们可以知道哪些对我们是重要的,哪些不是重要的,但是对于一个模型来说(CNN、RNN)很难去抉择哪些是重要哪些不重要。因此,从人类注意力的角度出发研究注意力机制。
假设,我们的桌子上放着一个红色的杯子,两本颜色不太明显的笔记本和书,我们第一眼肯定会被颜色突出的杯子吸引,这就是我们非自主性的注意力被吸引。但如果我们此时自主性的想去读书,此时我们的注意力就会关注我们想要的书的特征,从而自主性的将注意力转移到书上。
查询、键和值
通过自主性与非自主性的角度去解释注意力机制。
注意力机制显性的考虑自主性的思维。将"人"自主性的思维作为查询与“环境”中非自主性特征进行相似度计算,从而将选择引导至感官输入,引导至最匹配的值(目标)。(这里可能有点抽象,后面会有示例。)
注意力评分函数
如图所示,注意力汇聚函数可以表示为
其中表示为注意力权重:
其中表示注意力评分函数,不同的注意力评分函数会导致不同的注意力汇聚操作。下面将简单介绍加性注意力和缩放点积注意力
加性注意力
一般的当查询和键(Q和K)是不同长度的矢量是,可以使用加性注意力作为评分函数:
给定q ∈ \in ∈ R q {\Reals^q} Rq, ( k 1 , v 1 ) , … … , ( k m , v m ) (k_1, v_1),……,(k_m, v_m) (k1,v1),……,(km,vm), k i ∈ R k , v i ∈ R v k_i \in {\Reals^k}, v_i \in {\Reals^v} ki∈Rk,vi∈Rv; W q ∈ R h ∗ q W_q \in{\Reals^{h*q}} Wq∈Rh∗q、 W k ∈ R h ∗ k W_k \in{\Reals^{h*k}} Wk∈Rh∗k、 w v ∈ R h w_v \in {\Reals^h} wv∈Rh。
给定长度不等的q和k,首先通过可学习的参数 W q , W k W_q,W_k Wq,Wk对q和k进行处理,生成长度都为 h h h的 W q q , W k k W_qq,W_kk Wqq,Wkk,然后将两个向量相加,经过激活函数后与 w v w_v wv相乘,生成注意力分数。
缩放点积注意力
当q与k的长度相同时,我们可以使用缩放点积注意力评分函数,效率更高,缩放点积注意力评分函数为:
为什么要使用缩放点积,而不是直接点积呢,下面举个例子:
假设a1 = 51, a2 = 49 , 经过softmax后 0.51, 0.49,两个概率差距不大,但如果 a1 = 70, a2 = 30, 经过softmax后,0.99999, 0.000001,可能就会导致梯度消失等问题。假设向量长度 d = 64 , d = 8 d=64,\sqrt{\smash[b]{d}}=8 d=64,d=8,此时,a1 = 70 / 8 = 8.*, a2 = 30 / 8 = 3.8 经过softmax后,可能就是0.7,0.3,避免了上述情况。
由上述评分函数可以推出缩放点积注意力:
总结:注意力分数是query和key得相似度,注意力权重是分数得softmax结果。
两种常见得注意力分数计算:
加行注意力分数函数;缩放点积注意力分数函数。
下面通过一个简单得例子进行分析,摘自文章开篇视频1中的内容。
举例
视频1](https://www.bilibili.com/video/BV1dt4y1J7ov/?spm_id_from=333.337.search-card.all.click)
给定一组数据,如图中腰围与体重的关系,此时如果我们想查询腰围为57时,体重为多少,最简单的方法就是 43 ∗ 0.5 + 48 ∗ 0.5 43*0.5+48*0.5 43∗0.5+48∗0.5,也就是我们给定图中 K 2 K_2 K2和 K 3 K_3 K3各50%的权重,但根据其他数据可以看出,腰围与体重之间并不是简单直接的线性关系,我们需要考虑到其他的k,v对q的影响,因此可以得出
其中,
最后得出
当Q、K、V为多维数据时,
当Q为时,根据得到
最后求出注意力权重 f ( q ) f(q) f(q)。
Self-Attention
根据上面的描述,我们可以看出以缩放点积为评分函数的注意力机制流程如下图所示。
那self-Attention与Attention有什么关系呢??
当查询、键和值来源于同一组输入时,则被称为自注意力。源于同一组输入并不代表 Q = K = V Q=K=V Q=K=V。
在上面的Attention中,我们拿到的时一组 q 1 , … … , q n q_1,……,q_n q1,……,qn和一组 ( k 1 , v 1 ) , … … , ( k m , v m ) (k_1,v_1),……,(k_m,v_m) (k1,v1),……,(km,vm)组合,注意力输出为 y 1 , … … , y n y_1,……,y_n y1,……,yn。
而在自注意力中我们拿到一组序列 x 1 , x 2 , … … , x n x_1,x_2,……,x_n x1,x2,……,xn,注意力输出同样为 y 1 , … … , y n y_1,……,y_n y1,……,yn。其中:
下面举个例子,我们拿到仅一个 X X X,按照Attention的思想, f ( X ) f(X) f(X)应给为:
但上面我们也说了QKV来源一同一组输入,但并不是Q=K=V,根据Transformer原文中我们可以看出,Self-Attention的Q、K、V等于 X W Q , X W K , X W V XW_Q,XW_K,XW_V XWQ,XWK,XWV。因此,实际的 f ( X ) f(X) f(X)应该是
到这里,Attention到Self-Attention的转变以基本完成。
最后
简单进行记录,如有问题请大家指正。