我对 attention 机制的理解
attention 在很多网络模型中都用到,并且结合很广泛。由于attention在文章中出现频率很高,所以我试图了解attention机制。我只是说说我对attention的理解,attention使用意义,可能片面,如果有补充和纠正欢迎指出。
前置知识储备
在这里首先默认,你对attention有初步的了解:知道Q K V 矩阵, A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V ,并且对它的运算有了解
self-attention
attention用来学习向量。如果用self-attention,目的是表示自身向量,希望自身向量中包含同类的向量信息。
比如说,我有一组超市购物记录,按照时间排序。我希望每一条消费记录不只是由这条记录本身组成,还包括前后时间的消费记录。因为从常识来说,时间上先后的消费记录们可能和这条记录有关(如买了面包之后大概率买果酱)。
问:让自身向量包含同类向量,这么做的目的是什么呢?
答:首先明确的是,同类向量不是随便找的,同类向量按有关特征有权重。
(比如说,超市购物记录,我希望时间越近的记录越相关,所以我把时间间隔作为权重,间隔越小,权重越大)
权重高的同类记录,向量的有关特征越明显,在自身向量中的占比越高。
从运算角度来看,self-attention Q K V 的输入都是自己,因为是自身获取同类向量,本质都在同一组中。权重用w表示加在运算Value前:
S
e
l
f
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
t
+
w
d
k
)
∗
V
SelfAttention(Q,K,V)=softmax(\frac{QK^t+w}{\sqrt{d_k}})*V
SelfAttention(Q,K,V)=softmax(dkQKt+w)∗V
包含这些同类向量,能获得隐藏的潜在相关信息。我说的不是很利于理解,举个例子:以超市购物为例,我的目的是获得商品间的潜在联系。单单买面包和买果酱,这两条信息独立互相没有影响,无法获得。如果面包中包含果酱的特征,可以理解为他们间有某种关系联系,这种联系在向量中没有表现但可以获得(可能都有早餐特征,也可能果酱一般配合面包食用等等)。联系可能有各种各样,我不知道是什么具体联系,但通过self-attention指定有关特征,可以获得存在联系。
attention
self-attention 是attention的一种特殊例子。传统的attention的 Q K V 对象一般都不同:
我对QKV的理解是:
Q:每个元素对应的查询向量
K:每个元素对应的键(key)向量
V:每个元素对应的值(value)向量
Q
K
T
QK^T
QKT 计算查询向量和key的相似度,以点积为例,得到相似度权重
s
o
f
t
m
a
x
(
Q
K
T
)
V
softmax(QK^T)V
softmax(QKT)V 归一化权重后,以权重*值的形式作为结果
同样是超市购物例子,现在我用attention举例(不是self-attention)。我希望根据一组超市消费记录(按时间排序),以超市中所有物品为范围,获得下一组可能的消费记录(未知)
Q:每个元素对应的查询向量->以超市购物为例,Q 是所有商品的编号id 的Embedding
K:每个元素对应的键值向量 ->以超市购物为例,K 是每条消费商品编号id的Embedding
V:每个元素对应的隐藏值向量 -> 以超市购物为例,V就是物品间的相关度
解释:下一组消费 和 物品的相关度有关, 我们认为相关度越高, 作为下一组消费的可能性越大.相关度可以由多种因素衡量(消费时间,物品类别等等)
从运算角度来看,
S
e
l
f
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
t
+
w
d
k
)
∗
V
SelfAttention(Q,K,V)=softmax(\frac{QK^t+w}{\sqrt{d_k}})*V
SelfAttention(Q,K,V)=softmax(dkQKt+w)∗V 的Embedding 大小为:
E(Q):(n,embedding) n为所有商品数量
E(K): (m,embedding) m为消费记录数量
E(V): (m,n) 相关度
Q
∗
K
T
−
>
(
n
,
m
)
Q*K^T -> (n,m)
Q∗KT−>(n,m)
(
Q
∗
K
T
)
V
−
>
(
n
)
(Q*K^T)V -> (n)
(Q∗KT)V−>(n)
最后Value的地方可能理解的不是很对,望理解.
multi-head attention
传统 attention一个输入对应一组QKV矩阵, 得到一个输出,能够学习关于一个相关特征的表示.
Multi-head 的意思是 一个输入对应多组QKV矩阵, 得到多个输出,能够学习多个相关特征表示,再将多个结果汇成一个.
这么看Multi-head的计算空间是翻倍的: 学习的参数矩阵数量翻倍,最后连接的时候还需要一个参数矩阵做连接.但因为是并行计算,时间上理论不会变化, 最后增加一个矩阵连接的计算.