注意力机制基础
理论
首先回忆一下卷积
一、卷积基于的两个原则
1、平移不变性
一个分类器,比如说我想识别小丁,那这个分类器进行分类的时候,应该是对于位置信息不敏感的,也就是说无论小丁出现在图片上的哪个位置,我用训练好的分类器,参数不变都是可以识别出哪个是小丁的
2、局部性
就是我不需要看到全局的信息,只需要看到周围一部分信息就行了
二、从全连接层应用上面连个原则变成卷积层
先说结论:
从全连接层 h i , j = ∑ a , b v i , j , a , b x i + a , j + b h_{i,j}=\displaystyle\sum_{a,b}v_{i,j,a,b}x_{i+a,j+b} hi,j=a,b∑vi,j,a,bxi+a,j+b
变成卷积层 h i , j = ∑ a = − Δ Δ ∑ b = − Δ Δ v a , b x i + a , j + b h_{i,j}=\displaystyle\sum_{a=-\varDelta}^{\varDelta}\displaystyle\sum_{b=-\varDelta}^{\varDelta}v_{a,b}x_{i+a,j+b} hi,j=a=−Δ∑Δb=−Δ∑Δva,bxi+a,j+b
变换过程:
类比在简单的全连接层,输入的x是有k个特征的向量,,w是二维矩阵大小(k * i),输出h是有i个特征的向量
现在我们的输入是x一张图片,二维矩阵,那么参数w变成了四维,输出h也是一个二维矩阵,
k,l相当于像素本身的信息,i,j相当于像素的位置信息
h i , j = ∑ k , l w i , j , k , l x k , l = ∑ a , b v i , j , a , b x i + a , j + b h_{i,j} = \displaystyle\sum_{k,l}w_{i,j,k,l}x_{k,l}=\displaystyle\sum_{a,b}v_{i,j,a,b}x_{i+a,j+b} hi,j=k,l∑wi,j,k,lxk,l=a,b∑vi,j,a,bxi+a,j+b
这里v是w的重新表示 v i , j , a , b = w i , j , i + a , j + b v_{i,j,a,b} = w_{i,j,i+a,j+b} vi,j,a,b=wi,j,i+a,j+b
然后根据平移不变性,参数v应该不依赖于i,j的信息,所以 v i , j , a , b = v a , b v_{i,j,a,b} = v_{a,b} vi,j,a,b=va,b
即 h i , j = ∑ a , b v a , b x i + a , j + b h_{i,j} = \displaystyle\sum_{a,b}v_{a,b}x_{i+a,j+b} hi,j=a,b∑va,bxi+a,j+b
再根据局部性,并不需要我们看那么远的信息,即限制了a,b的大小(上下或者左右动),当动的范围超过 Δ \varDelta Δ就不要了
即 h i , j = ∑ a = − Δ Δ ∑ b = − Δ Δ v a , b x i + a , j + b h_{i,j}=\displaystyle\sum_{a=-\varDelta}^{\varDelta}\displaystyle\sum_{b=-\varDelta}^{\varDelta}v_{a,b}x_{i+a,j+b} hi,j=a=−Δ∑Δb=−Δ∑Δva,bxi+a,j+b
总结:平移不变性解释了为什么我可以用同一个卷积核扫过整张图片
局部性解释了,为什么我要用那么大的一个卷积核
注意力机制
简单来说卷积关注的是一个像素点周围,也就是卷积核大小的信息,但这些信息未必是最应该被关心的,注意力机制则是显示的考虑随意线索(意思是有意关心的线索)
- 随意线索被称之为查询
- 每一个线索是一个值(value)和不随意线索(key)的对
- 通过注意力池化层有偏向性的选择某些输入
具体注意力机制是怎么发展成现在的样子呢?
一、非参的注意力池化层
-
给定数据 ( x i , y i ) , i = 1 , . . . , n (x_i,y_i),i=1,...,n (xi,yi),i=1,...,n
-
平均池化层是最简单的方案: f ( x ) = 1 n ∑ i = 1 n y i f(x)=\frac{1}{n}\displaystyle\sum_{i=1}^ny_i f(x)=n1i=1∑nyi
这里 f ( x ) 的 x f(x)的x f(x)的x是query,即一个新数据进来的时候,关注的是所有信息的平均
-
更好的方案是60年代提出的Nadaraya-Waston
核
回归 f ( x ) = ∑ i = 1 n K ( x − x i ) ∑ j = 1 n K ( x − x j ) y i f(x)=\displaystyle\sum_{i=1}^n\frac{K(x-x_i)}{\sum_{j=1}^nK(x-x_j)}y_i f(x)=i=1∑n∑j=1nK(x−xj)K(x−xi)yi
x x x:query
x j x_j xj:key
y i y_i yi:value
K是核函数,类似SVM,用来计算新数据x(query)和旧数据 x i x_i xi(key)之间的距离,相当于对所有给定数据算百分比权重 (像softmax),乘对应的value,思想上像KNN
如果K使用高斯核 K ( u ) = 1 2 π e x p ( − u 2 2 ) K(u)=\frac{1}{\sqrt{2\pi}}exp(-\frac{u^2}{2}) K(u)=2π1exp(−2u2)
那么 f ( x ) = ∑ i = 1 n e x p ( − 1 2 ( x − x i ) 2 ) ∑ j = 1 n e x p ( − 1 2 ( x − x j ) 2 ) y i f(x) =\displaystyle\sum_{i=1}^n\frac{exp(-\frac{1}{2}(x-x_i)^2)}{\sum_{j=1}^nexp(-\frac{1}{2}(x-x_j)^2)}y_i f(x)=i=1∑n∑j=1nexp(−21(x−xj)2)exp(−21(x−xi)2)yi
= ∑ i = 1 n s o f t m a x ( − 1 2 ( x − x i ) 2 ) y i =\displaystyle\sum_{i=1}^nsoftmax(-\frac{1}{2}(x-x_i)^2)y_i =i=1∑nsoftmax(−21(x−xi)2)yi
二、参数化注意力机制
在之前的基础上引入可学习的w
f ( x ) = = ∑ i = 1 n s o f t m a x ( − 1 2 ( ( x − x i ) w ) 2 ) y i f(x)==\displaystyle\sum_{i=1}^nsoftmax(-\frac{1}{2}((x-x_i)w)^2)y_i f(x)==i=1∑nsoftmax(−21((x−xi)w)2)yi
学习一个w来决定注意力,这里的w还是一个标量,以上我们讨论的都是q,k,v都是标量的情况
总结
:
f
(
x
)
=
∑
i
=
1
n
α
(
x
,
x
i
)
y
i
=
∑
i
=
1
n
s
o
f
t
m
a
x
(
−
1
2
(
x
−
x
i
)
2
)
y
i
f(x)=\displaystyle\sum_{i=1}^n\alpha(x,x_i)y_i=\displaystyle\sum_{i=1}^nsoftmax(-\frac{1}{2}(x-x_i)^2)y_i
f(x)=i=1∑nα(x,xi)yi=i=1∑nsoftmax(−21(x−xi)2)yi
α \alpha α:注意力分数 s o f t m a x softmax softmax之后:注意力权重
拓展到高维
以上我们讨论的都是q,k,v都是标量的情况
,现在拓展到高维
q ∈ R q , m 对 k e y − v a l u e ( k 1 , v 1 ) , k i ∈ R k , v i ∈ R v q\in\mathbb{R}^q,m对key-value(k_1,v_1),k_i\in\mathbb{R}^k,v_i\in\mathbb{R}^v q∈Rq,m对key−value(k1,v1),ki∈Rk,vi∈Rv
注意力: f ( q , ( k 1 , v 1 ) , . . . , ( k m , v m ) ) = ∑ i = 1 m α ( q , k i ) v i ∈ R v f(q,(k_1,v_1),...,(k_m,v_m))=\displaystyle\sum_{i=1}^m\alpha(q,k_i)v_i\in\mathbb{R}^v f(q,(k1,v1),...,(km,vm))=i=1∑mα(q,ki)vi∈Rv
α ( q , k i ) = s o f t m a x ( a ( q , k i ) ) = e x p ( a ( q , k i ) ) ∑ j = 1 n e x p ( a ( q , k j ) ) ∈ R \alpha(q,k_i)=softmax(a(q,k_i))=\frac{exp(a(q,k_i))}{\sum_{j=1}^nexp(a(q,k_j))}\in\mathbb{R} α(q,ki)=softmax(a(q,ki))=∑j=1nexp(a(q,kj))exp(a(q,ki))∈R
现在问题在于如何计算 a ( q , k i ) a(q,k_i) a(q,ki),有两种方式
-
Additive Attention
-
可学习参数: W k ∈ R h × k , W q ∈ R h × q , v ∈ R h W_k\in\mathbb{R}^{h\times k},W_q\in\mathbb{R}^{h\times q},v\in\mathbb{R}^{h} Wk∈Rh×k,Wq∈Rh×q,v∈Rh
a ( k , q ) = v T t a n h ( W k k + W q q ) a(k,q)=v^Ttanh(W_kk+W_qq) a(k,q)=vTtanh(Wkk+Wqq)
最后计算出 a a a是一个数,相当于把key和query合并起来放到一个隐藏层大小为h,输出为1的单隐藏层MLP中
适用于q,k,v大小不同的情况
-
-
Scaled Dot-Product Attention(transformer用的)
-
如果query和key是同样的长度 q , k i ∈ R d q,k_i\in\mathbb{R}^d q,ki∈Rd,那么可以 a ( q , k i ) = < q , k i > / d a(q,k_i)=<q,k_i>/\sqrt{d} a(q,ki)=<q,ki>/d
-
向量化版本:n个query,m个key-value
-
Q ∈ R n × d , K ∈ R m × d , V ∈ R m × v Q\in\mathbb{R}^{n\times d},K\in\mathbb{R}^{m\times d},V\in\mathbb{R}^{m\times v} Q∈Rn×d,K∈Rm×d,V∈Rm×v
-
注意力分数: a ( Q , K ) = Q K T / d ∈ R n × m a(Q,K)=QK^T/\sqrt{d}\in\mathbb{R}^{n\times m} a(Q,K)=QKT/d∈Rn×m
-
注意力池化: f = s o f t m a x ( a ( Q , K ) ) V ∈ R n × v f=softmax(a(Q,K))V\in\mathbb{R}^{n\times v} f=softmax(a(Q,K))V∈Rn×v
这时候你可能问Dot-Product Attention,没有可学习参数啊,在transformer里,Q,K,V是一个词向量通过三个矩阵 W q , W k , W v W_q,W_k,W_v Wq,Wk,Wv映射过来的
-
-