写在前面
注意力机制是一个很不错的科研创新点方向,但是没有系统记录过学习过程,这里记录科研中遇到的各种注意力机制。
本质上来说用到attention的任务都有Query,Key,Value三个关键components,目标则是输入query,然后根据query和key的关系以及key和value的关系求出最终的value。总结来说注意力机制可以分为三步:
1.输入Query;
2.计算Query和Key的注意力权重
α
\alpha
α ;
3.根据
α
\alpha
α来计算输入信息对Value的加权平均。
参考视频,这个大佬up讲的非常好,值得大家去一键三连!
如图1.1.1所示,这个例子是想通过输入一个腰围(
q
q
q),得到最后的体重预测值(
k
k
k)。每一个
k
k
k对应一个
v
v
v,但是
q
q
q要跟三个
k
k
k都有一个加权,如图1.1.2所示。
其中,
α
(
q
,
k
1
)
\alpha(q, k_1)
α(q,k1?)这个就是注意力权重,代表着
q
q
q和
k
1
k_1
k1?的相关性,也就是
q
q
q要在多大程度上参考
k
1
k_1
k1?对应的
v
1
v_1
v1?。
α
(
q
,
k
1
)
\alpha(q, k_1)
α(q,k1?)的计算方式有很多,比如采用余弦距离、欧式距离、皮尔森等距离度量函数。但是需要注意的就是每一个注意力权重都是在经过距离函数计算之后,都要进行归一化处理。归一化处理的方式也很多,比如softmax处理。图三就是采用了欧式距离度量函数,并且采用softmax归一化处理,从而得到最终的注意力权重。
现实中,我们的
q
q
q肯定大多是多维数据,但是计算的过程是一样的。比如说我们的
q
q
q不再仅包含一个腰围数据,我们还包括了胸围数据,那么这个注意力机制的计算过程就会变成如图1.1.4所示的形式。
自注意力机制是注意力机制的变体,他能够基于输入的数据来进行注意力机制的学习,减少了对外部的依赖,让模型更多地关注数据本身或特征的内部相关性。例如,在1.1的那个例子里头,把
Q
,
K
,
V
Q,K,V
Q,K,V都改成输入的
X
X
X。
但是在实际应用中,我们往往会对
X
X
X映射到
Q
,
K
,
V
Q,K,V
Q,K,V的过程中做一个线性变换,比如大名鼎鼎的Transformer模型。
f ( X ) = s o f t m a x ( X W Q ( X W K / d ) T ) X W V f(X) = softmax(XW_Q(XW_K/\sqrt{d})^T)XW_V f(X)=softmax(XWQ?(XWK?/d?)T)XWV?
向量
A
A
A和
B
B
B的点积可以展开成下式:
A
?
B
=
∣
A
∣
×
∣
B
∣
×
c
o
s
(
θ
)
A·B=|A|\times|B|\times cos(\theta)
A?B=∣A∣×∣B∣×cos(θ)
由上式可以看到,
A
A
A和
B
B
B的相似度取决于模长和向量间的夹角。在DL中,用以计算点积之前,往往会对
A
A
A和
B
B
B进行L2等归一化操作,让
∣
A
∣
|A|
∣A∣和
∣
B
∣
|B|
∣B∣等于1或者处于一个较小的范围。这时候
A
A
A和
B
B
B的相似度就取决于向量夹角了。那可能会有疑问为什么不直接计算cos余弦相似度呢?因为向量点积的计算速度是最快的,虽然可能存在误差,但是也算是用误差换时间了。
To be continued…