机器翻译任务输入序列的长度与输出序列的长度可能相同也可能不相同;
产品评价预测任务无论输入序列的长度为多少,输出的序列长度都为固定大小;
如果序列中每个词的标签为该次对应词性的任务重输出的序列长度与输入的序列长度相同。
(1)使用 Fully Connected网络来处理,
(2)可以使用一个window来获取指定范围内向量的上下文信息。
要结合整个sequence 的信息需要,使用了Self-Attention的方法。
使Self-Attention,实现每一个输出的向量都整合了所有输入向量的信息。
self attention可以使用多次,在Fully Connected输出层还能再接self attention,因此Self Attention 的输入可以使原始输入 或者 隐藏层。
self attention的实现通过计算每一个输入向量与其他所有输入向量的相关性α作为attention score,与当前向量点乘操作,得到输出向量。
计算两个向量相关性的方法为dot-product(点乘)
Self Attention 的公式如下
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{Q·K^T}{\sqrt{d_k}} ) ·V
Attention(Q,K,V)=softmax(dk??Q?KT?)?V
其中 q表示Query,k表示Key。
需要计算每一个节点与其他节点的相关性(这些计算是可以同时进行的)。
以长度为4的序列( a1 ,a2 ,a3 ,a4)为例,
Q
=
W
q
I
Q=W^qI
Q=WqI
K = W k I K=W^kI K=WkI
V = W v I V=W^vI V=WvI
对每一个输入向量,分别乘以矩阵Wq、Wk、Wv,得到对应向量q、k、v。
对于第i个向量,计算与其他向量的相关性,则用qi 分别与其他向量的kj 做点乘。
(
k
1
k
2
k
2
k
4
)
?
q
1
=
(
α
1
,
1
α
1
,
2
α
1
,
3
α
1
,
4
)
\begin{pmatrix} k_1 \\ k_2 \\k_2\\k_4 \end{pmatrix}·q^1=\begin{pmatrix} α_{1,1} \\ α_{1,2}\\α_{1,3}\\α_{1,4} \end{pmatrix}
?k1?k2?k2?k4??
??q1=
?α1,1?α1,2?α1,3?α1,4??
?
(
k
1
k
2
k
2
k
4
)
?
q
2
=
(
α
2
,
1
α
2
,
2
α
2
,
3
α
2
,
4
)
\begin{pmatrix} k_1 \\ k_2 \\k_2\\k_4 \end{pmatrix}·q^2=\begin{pmatrix} α_{2,1} \\ α_{2,2}\\α_{2,3}\\α_{2,4} \end{pmatrix}
?k1?k2?k2?k4??
??q2=
?α2,1?α2,2?α2,3?α2,4??
?
(
k
1
k
2
k
2
k
4
)
?
q
3
=
(
α
3
,
1
α
3
,
2
α
3
,
3
α
3
,
4
)
\begin{pmatrix} k_1 \\ k_2 \\k_2\\k_4 \end{pmatrix}·q^3=\begin{pmatrix} α_{3,1} \\ α_{3,2}\\α_{3,3}\\α_{3,4} \end{pmatrix}
?k1?k2?k2?k4??
??q3=
?α3,1?α3,2?α3,3?α3,4??
?
(
k
1
k
2
k
2
k
4
)
?
q
4
=
(
α
4
,
1
α
4
,
2
α
4
,
3
α
4
,
4
)
\begin{pmatrix} k_1 \\ k_2 \\k_2\\k_4 \end{pmatrix}·q^4=\begin{pmatrix} α_{4,1} \\ α_{4,2}\\α_{4,3}\\α_{4,4} \end{pmatrix}
?k1?k2?k2?k4??
??q4=
?α4,1?α4,2?α4,3?α4,4??
?
(
k
1
k
2
k
2
k
4
)
?
(
q
1
,
q
2
,
q
3
,
q
4
)
=
(
α
1
,
1
,
α
2
,
1
,
α
3
,
1
,
α
4
,
1
α
1
,
2
,
α
2
,
2
,
α
3
,
2
,
α
4
,
2
α
1
,
3
,
α
2
,
3
,
α
3
,
3
,
α
4
,
3
α
1
,
4
,
α
2
,
4
,
α
3
,
4
,
α
4
,
4
)
\begin{pmatrix} k_1 \\ k_2 \\k_2\\k_4 \end{pmatrix}·\begin{pmatrix}q^1,q^2,q^3, q^4\end{pmatrix}=\begin{pmatrix} α_{1,1},α_{2,1},α_{3,1},α_{4,1} \\ α_{1,2},α_{2,2},α_{3,2},α_{4,2}\\α_{1,3},α_{2,3},α_{3,3},α_{4,3}\\α_{1,4},α_{2,4},α_{3,4},α_{4,4} \end{pmatrix}
?k1?k2?k2?k4??
??(q1,q2,q3,q4?)=
?α1,1?,α2,1?,α3,1?,α4,1?α1,2?,α2,2?,α3,2?,α4,2?α1,3?,α2,3?,α3,3?,α4,3?α1,4?,α2,4?,α3,4?,α4,4??
?
K
T
?
Q
=
A
K^T ·Q=A
KT?Q=A
将α值经过SoftMax,转化为0-1之间的值,且α值之和等于1。
以第一个向量为例,计算与每一个向量的相关系数α’
α
1
,
i
′
=
e
x
p
(
α
1
,
i
)
/
∑
j
e
x
p
(
α
1
,
j
)
α'_{1,i}=exp(α_{1,i})/\sum_{j}exp(α_{1,j})
α1,i′?=exp(α1,i?)/j∑?exp(α1,j?)
以上计算的向量结果侧重提取向量与其他向量的attention score,再与向量V点乘,V向量只包含输入向量的信息。
b
i
=
∑
j
α
1
,
i
′
?
v
i
b_i=\sum_{j}α'_{1,i}·v^i
bi?=j∑?α1,i′??vi
最终得到输出向量b。
根据自己理解画了一张self attention 的结构图
用向量机算来表示self attention的过程如图所示:
其中Wq 、Wk 、Wv 是可以训练的参数。
对于第一步由输入向量αi 分别与矩阵Wq 、Wk 、Wv做点乘,可以将输入向量的矩阵合并计算:
第二步将当前向量的query向量Q与其他所有向量的K点乘计算
可以将转置后的K向量合并后与合并后的Q做点乘运算
第三步得到α向量后经过softmax后的**α’**与合并后的向量V做点乘
Multi-head Self Attention 多头注意力机制在原Self Attention上增加了不同的q(Query)。
将第一步得到的qi分别与不同的向量点乘操作,生成qi,1,qi,2
q i , 1 = W q , 1 ? q i q^{i,1}=W^{q,1}·q^i qi,1=Wq,1?qi
q i , 2 = W q , 2 ? q i q^{i,2}=W^{q,2}·q^i qi,2=Wq,2?qi
不同的q负责不同的相关性(问题中有几种不同的相关性,就使用几个head)。
那么生成了多个q,对应也要生成多个k和v;
计算时,分别取每个q值与对应的第二个下标值相同的k向量做点乘;
经过softmax后与对应下标值相同的v向量做点乘,得到输出向量结果。
在self attention中还需体现向量的位置信息。
在网络中输入向量加入了一个位置向量ei
向量ei 的值通过手动添加或者在网络中训练得到。
语音处理
对于输入的一段长度为L语音序列,做self attention计算α得到的attention metrix的维度是L×L。当序列过长时,考虑运算速度,使用Truncated Self-attention,只在一个设定的范围内使用Self-attention。
Self attention应用在图像处理
将一张图片看做是一系列向量,对于一个三通道的图片,将每一个像素点看做是一个三维的向量
对于K、Q、V向量的理解
是由原始输入向量分别与三个向量点乘后获得,这三个向量又是可以学习的参数。
参数Q和K共同作用,来决定两个向量的相关系数。
https://www.bilibili.com/video/BV1v3411r78R/?p=1&vd_source=91cfed371d5491e2973d221d250b54ae