Attention
相关概念
自主性提示/聚焦式注意力—查询(query)(例如一个人在看一张图片,图片中有很多物体,但是此人喜欢观察屎,因此对地上的屎最感兴趣)
非自主性提示/基于显著性的注意力—键(key)(例如图片中有某些东西特别显眼,吸引了观察者的注意)
最后眼睛盯着哪看—值(value)
注意力机制的框架如下所示:
(上图来自李沐 et al. 动手学深度学习)
一个简单的例子进行理解
对于给定的数据集
(
x
1
,
y
1
)
,
.
.
.
,
(
x
n
,
y
n
)
{(x_1,y_1),...,(x_n,y_n)}
(x1,y1),...,(xn,yn),如何学习预测函数
y
=
f
(
x
)
y=f(x)
y=f(x),使得对于一个输入
x
x
x可以获得预测值
y
^
\hat{y}
y^?
一个简单的方法就是对所有
y
i
y_i
yi值进行平均加权,用均值作为最后的预测值。
基于注意力的方法就是对于样本中的
y
i
y_i
yi赋予不同的权重。如果输入
x
x
x和样本中的某个
x
i
x_i
xi更接近,那么相应的
y
i
y_i
yi会被分配更高的权重,这样相应的预测也会较为准确。于是
f
(
x
)
f(x)
f(x)可设计如下:
f
(
x
)
=
∑
i
=
1
n
K
(
x
−
x
i
)
∑
j
=
1
n
K
(
x
−
x
j
)
y
i
f(x)=\sum_{i=1}^{n}\frac{K(x-x_i)}{\sum_{j=1}^{n}K(x-x_j)}y_i
f(x)=i=1∑n∑j=1nK(x−xj)K(x−xi)yi
其中
K
K
K是一种核函数。
如果
K
K
K是高斯核函数,那么:
f
(
x
)
=
∑
i
=
1
n
s
o
f
t
m
a
x
(
−
1
2
(
x
−
x
i
)
2
)
y
i
f(x)=\sum_{i=1}^{n}softmax(-\frac{1}{2}(x-x_i)^2)y_i
f(x)=i=1∑nsoftmax(−21(x−xi)2)yi
f
(
x
)
f(x)
f(x)还可以写成一种更通用的形式:
f
(
x
)
=
∑
i
=
1
n
α
(
x
,
x
i
)
y
i
f(x)=\sum_{i=1}^{n}\alpha(x,x_i)y_i
f(x)=∑i=1nα(x,xi)yi .
注意力机制的计算可以分为两步,一是计算对于一个输入的注意力分布,如对
α
(
x
,
x
i
)
\alpha(x,x_i)
α(x,xi)的计算,二是计算对与输入的加权平均,如对
f
(
x
)
f(x)
f(x)的计算。
带参数的注意力汇聚
将可学习的参数 w w w加入到 f ( x ) f(x) f(x)中,即: f ( x ) = ∑ i = 1 n s o f t m a x ( − 1 2 ( w ( x − x i ) ) 2 ) y i f(x)=\sum_{i=1}^{n}softmax(-\frac{1}{2}(w(x-x_i))^2)y_i f(x)=∑i=1nsoftmax(−21(w(x−xi))2)yi .
换个方式描述
将上述几个公式总结一下:
f
(
x
)
=
∑
i
=
1
n
α
(
x
,
x
i
)
y
i
=
∑
i
=
1
n
exp
(
−
1
2
(
(
x
−
x
i
)
w
)
2
)
∑
j
=
1
n
exp
(
−
1
2
(
(
x
−
x
j
)
w
)
2
)
y
i
=
∑
i
=
1
n
softmax
(
−
1
2
(
(
x
−
x
i
)
w
)
2
)
y
i
.
\begin{aligned} f(x) & =\sum_{i=1}^{n} \alpha\left(x, x_{i}\right) y_{i} \\ & =\sum_{i=1}^{n} \frac{\exp \left(-\frac{1}{2}\left(\left(x-x_{i}\right) w\right)^{2}\right)}{\sum_{j=1}^{n} \exp \left(-\frac{1}{2}\left(\left(x-x_{j}\right) w\right)^{2}\right)} y_{i} \\ & =\sum_{i=1}^{n} \operatorname{softmax}\left(-\frac{1}{2}\left(\left(x-x_{i}\right) w\right)^{2}\right) y_{i} . \end{aligned}
f(x)=i=1∑nα(x,xi)yi=i=1∑n∑j=1nexp(−21((x−xj)w)2)exp(−21((x−xi)w)2)yi=i=1∑nsoftmax(−21((x−xi)w)2)yi.
x
x
x称为查询,
(
x
1
,
y
1
)
,
.
.
.
,
(
x
n
,
y
n
)
{(x_1,y_1),...,(x_n,y_n)}
(x1,y1),...,(xn,yn)是一系列键值对。
对于第二行的公式,我们将
s
(
x
)
=
−
1
2
(
(
x
−
x
i
)
w
)
2
s(x)=-\frac{1}{2}((x-x_i)w)^2
s(x)=−21((x−xi)w)2称为评价函数。
将上述符号全部向量化,查询为
q
\boldsymbol{q}
q,键值对为
(
k
1
,
v
1
)
,
.
.
.
,
(
k
n
,
v
n
)
\boldsymbol{(k_1,v_1),...,(k_n,v_n)}
(k1,v1),...,(kn,vn),于是有:
f
(
q
,
(
k
1
,
v
1
)
,
…
,
(
k
m
,
v
m
)
)
=
∑
i
=
1
m
α
(
q
,
k
i
)
v
i
f\left(\mathbf{q},\left(\mathbf{k}_{1}, \mathbf{v}_{1}\right), \ldots,\left(\mathbf{k}_{m}, \mathbf{v}_{m}\right)\right)=\sum_{i=1}^{m} \alpha\left(\mathbf{q}, \mathbf{k}_{i}\right) \mathbf{v}_{i}
f(q,(k1,v1),…,(km,vm))=i=1∑mα(q,ki)vi
α
(
q
,
k
i
)
=
s
o
f
t
m
a
x
(
a
(
q
,
k
i
)
)
=
exp
(
a
(
q
,
k
i
)
)
∑
j
=
1
m
exp
(
a
(
q
,
k
j
)
)
\alpha\left(\mathbf{q}, \mathbf{k}_{i}\right)=softmax\left(a\left(\mathbf{q}, \mathbf{k}_{i}\right)\right)=\frac{\exp \left(a\left(\mathbf{q}, \mathbf{k}_{i}\right)\right)}{\sum_{j=1}^{m} \exp \left(a\left(\mathbf{q}, \mathbf{k}_{j}\right)\right)}
α(q,ki)=softmax(a(q,ki))=∑j=1mexp(a(q,kj))exp(a(q,ki))
评价函数
不同的注意力评分函数会导致不同的注意力汇聚操作。常用的评分函数有以下几种:
- 加性函数: s ( k , q ) = w 1 tanh ( w 2 k + w 3 q ) s(\boldsymbol{k}, \boldsymbol{q})=\boldsymbol{w_1} \tanh (\boldsymbol{w_2} \boldsymbol{k}+\boldsymbol{w_3} \boldsymbol{q}) s(k,q)=w1tanh(w2k+w3q),其中 w 1 , w 2 , w 3 \boldsymbol{w_1},\boldsymbol{w_2},\boldsymbol{w_3} w1,w2,w3都是可学习的参数。
- 点积函数: s ( k , q ) = q ⊤ k s(\boldsymbol{k}, \boldsymbol{q})=\boldsymbol{q}^\top \boldsymbol{k} s(k,q)=q⊤k
- 缩放点积函数: s ( k , q ) = q ⊤ k D s(\boldsymbol{k}, \boldsymbol{q})=\frac{\boldsymbol{q}^\top \boldsymbol{k}}{\sqrt{D}} s(k,q)=Dq⊤k, D D D是输入向量的维度。缩放点积函数是较为常用的。
- 双线性点积函数:
s
(
k
,
q
)
=
k
⊤
W
q
s(\boldsymbol{k}, \boldsymbol{q})=\boldsymbol{k}^\top \boldsymbol{W}\boldsymbol{q}
s(k,q)=k⊤Wq
一般来说,点积评分函数相较于加性评分函数计算效率更高,但当查询向量的维度较高时,点积评分函数会有较大的方差,导致softmax函数梯度较小。因此一般用缩放点积函数,保证点积的方差始终为1。
多头注意力机制
用 ( K , V ) = ( k 1 , v 1 ) , ⋯ , ( k n , v n ) (\boldsymbol{K}, \boldsymbol{V})=\left(\boldsymbol{k}_{1}, \boldsymbol{v}_{1}\right), \cdots,\left(\boldsymbol{k}_{n}, \boldsymbol{v}_{n}\right) (K,V)=(k1,v1),⋯,(kn,vn)表示 n n n组键值对,多头注意力利用多个查询 Q = ( q 1 , . . . , q m ) \boldsymbol{Q}=(\boldsymbol{q_1},...,\boldsymbol{q_m}) Q=(q1,...,qm)来并行地从输入信息中选取多组信息。每个注意力机制关注输入信息的不同部分。其关键特征在于并行。
自注意力机制
自注意力机制,顾名思义,关注自身的注意力分布。
K
,
Q
,
V
\boldsymbol{K},\boldsymbol{Q},\boldsymbol{V}
K,Q,V都是对同一个数据
X
\boldsymbol{X}
X进行线性变换(注意这里的
X
\boldsymbol{X}
X不是查询)。最后得到的结果,根据上述注意力机制,相当于假如从
Q
\boldsymbol{Q}
Q中提取出一个
q
i
\boldsymbol{q_i}
qi,那么应该关注其它哪些
q
\boldsymbol{q}
q。比如对于一句话:”小花家的狗会做饭“,如果查询向量是”会“,那么进行自注意力运算后的结果应该是"做饭",即在看到”会“的时候,就应该给”做饭“更多的注意力。
如果用缩放点积来作为注意力评价函数,对于一个查询向量
q
n
\boldsymbol{q_n}
qn,可得单个输出序列:
h
n
=
a
t
t
(
(
K
,
V
)
,
q
n
)
\boldsymbol{h_n}=att((\boldsymbol{K},\boldsymbol{V}),\boldsymbol{q_n})
hn=att((K,V),qn)
如果是多个查询向量组成的矩阵,那么最后的输出向量序列为:
H = V softmax ( K ⊤ Q D k ) \boldsymbol{H}=\boldsymbol{V} \operatorname{softmax}\left(\frac{\boldsymbol{K}^{\top} \boldsymbol{Q}}{\sqrt{\boldsymbol{D_{k}}}}\right) H=Vsoftmax(DkK⊤Q)
Transformer
一篇非常优秀的博客:小白Transformer
参考
动手深度学习,李沐等.
神经网络与深度学习,邱锡鹏.