self-attenation
蓝色区域是self-attention输出。每个
a
a
a是一个向量,
a
i
(
i
=
1
,
.
.
.
.
,
n
)
a^{i}(i=1,....,n)
ai(i=1,....,n) 是一串向量。
a
i
a^{i}
ai可能是一个系统输入,也可能是上一个self-attention层的输出。
下面写出
b
1
b^{1}
b1的计算方式:
先计算出
a
1
a^{1}
a1和其他
a
i
(
i
=
1
,
.
.
.
.
,
n
)
a^{i}(i =1,....,n)
ai(i=1,....,n) 的关联性,用
α
\alpha
α 来表示两个向量之间的关系度。求
α
\alpha
α 有几种做法,这里用点乘举例。
这里有两个矩阵一query矩阵
w
q
w^{q}
wq,一个ask矩阵
w
k
w^{k}
wk。
α
1
,
1
=
q
1
⋅
k
1
,
α
1
,
2
=
q
1
⋅
k
2
\alpha_{1,1}=q^{1}\cdot k^{1},\alpha_{1,2}=q^{1}\cdot k^{2}
α1,1=q1⋅k1,α1,2=q1⋅k2。
然后经过softmax层。
α
1
,
i
′
=
exp
(
α
1
,
i
)
/
∑
j
exp
(
α
1
,
j
)
\alpha_{1, i}^{\prime}=\exp \left(\alpha_{1, i}\right) / \sum_{j} \exp \left(\alpha_{1, j}\right)
α1,i′=exp(α1,i)/∑jexp(α1,j)
这里出现了一个新矩阵
W
v
W^{v}
Wv,
v
1
=
W
v
a
1
v^{1}=W^{v}a^{1}
v1=Wva1.
b
1
=
∑
i
α
1
,
i
′
v
i
\boldsymbol{b}^{\mathbf{1}}=\sum_{i} \alpha_{1, i}^{\prime} \boldsymbol{v}^{i}
b1=∑iα1,i′vi
w
q
,
w
k
,
w
v
w^{q},w^{k},w^{v}
wq,wk,wv是要训练的参数。
这是multi-head的self-attention。
q
i
,
1
q^{i,1}
qi,1只和
k
j
,
1
k^{j,1}
kj,1和
k
i
,
1
k^{i,1}
ki,1计算。
同理可得
b
i
,
2
b^{i,2}
bi,2。
这是输出的
b
i
b^{i}
bi。
multi-head self-attention中每个
q
i
q^{i}
qi都对应一个关联关系。多几个
q
i
q^{i}
qi就可以找出多几个关联关系。
通过position encoding 把位置信息变成一个向量
e
i
e^{i}
ei加入到
α
i
\alpha^{i}
αi中。
可以吧rnn和cnn看成特殊的self-attention。