自注意力层的运作,整体过程简化,如下图:
-
通过输入序列 X X X, 该序列包含两个输入行向量,与参数矩阵 W Q , K , V W^{Q,K,V} WQ,K,V相乘,求出 Q , K , V Q,K,V Q,K,V,
-
通过 Q , K Q, K Q,K 求出注意力分数,
a t t e n t i o n s c o r e = s o f t m a x ( Q K T d k ) attention_{score} = softmax ( \frac{QK^T}{\sqrt{d_k}} ) attentionscore=softmax(dkQKT) -
通过注意力分数与矩阵 V V V, 得到最终的注意力层的输出;
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{QK^T}{\sqrt{d_k}} ) V
Attention(Q,K,V)=softmax(dkQKT)V
1. self-attention中的矩阵乘法
下文,举例时, 输入序列, 是由多个 输入的 列向量构成;
1.1 Q, K, V矩阵
输入的列向量
a
i
a^i
ai 拼接成矩阵;
现在将各个输入列向量
a
i
a^i
ai, 比方说
a
1
a^1
a1
a
2
a^2
a2
a
3
a^3
a3
a
4
a^4
a4 这四个向量拼接成一个矩阵, 记做矩阵
I
I
I;
每一个输入向量
a
i
a^i
ai 与矩阵
w
q
w^q
wq 相乘, 便会得到:
q
i
q^i
qi 向量;
q
i
=
W
q
a
i
q^i = W^q a^i
qi=Wqai
那么之前得到的各个输出向量 q i q^i qi, 比方说 q 1 q^1 q1 q 2 q^2 q2 q 3 q^3 q3 q 4 q^4 q4, 这四个向量拼接成一个矩阵, 记做矩阵 Q Q Q;
从而得到 Q Q Q, K K K, V V V 这三个矩阵, 这三个矩阵中的每一列向量便是输出对应的 q i q^i qi, k i k^i ki, v i v^i vi;
( 这里想象成人脑接受了一个信息, 该人脑本身存在了 多少个 概念维度去理解和 处理这个信息, 有些概念维度与 输入信息 是存在相关性的, 而有些概念维度与 没有相关性的)
1.2 单个向量 a 1 a^1 a1 的各个 α 1 , j \alpha_{1,j} α1,j 注意力分数;
- 各个列向量 k i k^i ki转置成行向量 k i k^i ki ,
- 将各个输入向量 a i a^i ai 对应的 k i k^i ki 向量与 q 1 q^1 q1 向量相乘,
- 得到输入向量
a
1
a^1
a1 与其他各个输入向量
a
i
a^i
ai 之间的注意力分数
α
1
,
j
\alpha_{1,j}
α1,j
以此类推,
将步骤2 中的 “
a
1
a^1
a1 向量对应的
q
1
q^1
q1向量 ”,
换成 “
a
2
a^2
a2 向量对应的
q
2
q^2
q2 向量 “,
便得到输入向量
a
2
a^2
a2与其他各个输入向量
a
i
a^i
ai 之间的注意力分数
α
2
,
j
\alpha_{2,j}
α2,j,
1.3 输入向量 a i a^i ai的注意力分数 α i , j \alpha_{i,j} αi,j 矩阵;
-
将上述中的各个行向量 k i k^i ki 按照行拼接成矩阵, 便得到 K K K 矩阵的转置矩阵 K T K^T KT;
-
将 各个输入向量对应的咨询向量 q i q^i qi 按照列,拼接成 咨询矩阵 Q Q Q;
-
那么
所有输入向量 a i a^i ai的注意力分数矩阵 A A A
= 输入向量对应的 K K K矩阵转置 × 输入向量对应的咨询矩阵 Q Q Q
1.4 输入向量 a i a^i ai 对应的输出向量 b i b^i bi
将上述的 V 1 V^1 V1 , V 2 V^2 V2, V 3 V^3 V3, V 4 V^4 V4 向量与输入向量 a 1 a^1 a1各个注意力分数相乘, 便得到 a 1 a^1 a1 经过 self-attention 的输出向量 b 1 b^1 b1;
同理, 将 v 1 v^1 v1 , v 2 v^2 v2, v 3 v^3 v3, v 4 v^4 v4 组成的矩阵 V V V 与归一化后的注意力分数矩阵 A ′ A' A′相乘, 便得到输出向量的矩阵 O O O;
1.4 小结: 输出矩阵 O O O 求解步骤;
- 所有输入向量 a i a^i ai对应的 Q Q Q, K K K, V V V 矩阵生成:
根据输入向量 a 1 a^1 a1 构成输入矩阵 I I I, 通过待学习的参数矩阵 W q W^q Wq, W k W^k Wk, W v W^v Wv 与输入向量矩阵 I I I相乘, 得到 Q Q Q, K K K, V V V,
- 所有输入向量 a i a^i ai 的注意力分数矩阵 A A A的生成:
所有输入向量
a
i
a^i
ai的注意力分数矩阵
A
A
A
=
K
K
K的矩阵转置 × 咨询矩阵
Q
Q
Q
从而 原始的注意力分数矩阵
A
A
A:
A
=
Q
K
T
A = QK^T
A=QKT
- 注意力分数矩阵 A A A的归一化:
可以通过不同的方式实现, 可以是 softmax 或者 relu;
然后对 注意力分数矩阵
A
A
A 进行归一化 :
A
,
=
s
o
f
t
m
a
x
(
Q
K
T
)
A^, = softmax (QK^T )
A,=softmax(QKT)
而在实践中, 为了防止 Q K T QK^T QKT 的内积过大, 从而过大的值输入到softmax 后,会落入到 饱和区间, 然而饱和区间的梯度几乎为0, 梯度的消失, 导致无法训练,所以引入了缩放因子 1 d k \frac{1}{\sqrt{d_k}} dk1;
所以最终的注意力分数矩阵: :
A
,
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
A^, = softmax ( \frac{QK^T}{\sqrt{d_k}} )
A,=softmax(dkQKT)
-
输出矩阵 O O O注意力分数矩阵 A A A的生成:
输出矩阵 O O O = 矩阵 V V V × 归一化后的 注意力分数矩阵 A ′ A' A′
所以 最终注意力层 输出结果:
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{QK^T}{\sqrt{d_k}} ) V
Attention(Q,K,V)=softmax(dkQKT)V
2. 多头注意力 (Muti-head self attention;)
为什么需要多头:
模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,然而仔细想想,这真的可能吗?或者说,Multi-Head的作用真的是去关注“不同方面”的特征吗?
可以类比CNN中同时使用多个滤波器的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。
多头注意力的由来, 是指在衡量两个事物的相关性的时候,
这种相关性有多种衡量方式;
2.1 多头的定义
上文中的 self - attention : 只会产生一组 Q , K , V Q,K, V Q,K,V 矩阵,
而多头注意力 是指 我们可以多组
Q
,
K
,
V
Q,K, V
Q,K,V 矩阵,
每组
Q
,
K
,
V
Q,K, V
Q,K,V 矩阵会构成一个注意力层;
然后 将每个注意力层输出结果, 进行拼接成一个结果;
拼接后的向量 在乘以一个 参数矩阵
W
O
W^O
WO, 得到多头注意力的输出;
将多头的看待角度, 从矩阵层面 切换到 矩阵中的列向量, 来思考;
2.2 多头的向量实现细节
在网络中体现便是一个输入向量对应的 q i q^i qi, 会有多个 q i , j q^{i,j} qi,j 的个数 = 头的个数;
这里以双头为例子, 即存在两个
q
i
,
j
q^{i,j}
qi,j , 分别是
q
i
,
1
q^{i,1}
qi,1 ,
q
i
,
2
q^{i,2}
qi,2 ;
同样的
k
i
,
j
k^{i,j}
ki,j,
v
i
,
j
v^{i,j}
vi,j 也存在两个;
2.2.1 求注意力分数时的差异
相比于单头, 多头注意力在求取注意力分数时,
只会取
q
i
,
1
q^{i,1}
qi,1, 和
k
i
,
1
k^{i,1}
ki,1 对应位置上的向量,求出注意力分数,
然后求取
b
i
,
1
b^{i,1}
bi,1;
2.2.2 求 b i , j b^{i,j} bi,j时的差异
b i , j b^{i,j} bi,j 的求取过程中, 只会将 v i , j v^{i,j} vi,j 中, 第二个上标 j j j 对应的 v i , j v^{i,j} vi,j 取出, 更注意力分数做乘积然后, 求和输出 b i , j b^{i,j} bi,j;
2.2.3 根据 b i , j b^{i,j} bi,j 求出 b i b^{i} bi
b i , j b^{i,j} bi,j 在与一个 w O w^{O} wO 矩阵相乘, 才得到 一个输出向量 b i b^i bi;
3. 输入向量的位置编码向量
采用正弦函数 生成的向量 作为输入向量的位置编码;
当然,可以研究 不同的方式 生成位置编码向量,
这里需要根据具体的任务 来分析, 如何生成合适的 位置编码向量;
3. 自注意力机制的应用
- 音频中,采用截断方式的注意力;
对于整个输入序列中, 只考虑当前输入向量的相邻几个向量, 而不用考虑 整个序列的向量, 从而减少参数量;
-
图像中的目标分类, 将RGB, 在通道维度上构成一个输入向量, 从而整张图片构成一个向量的序列对;
-
GAN, 图像领域的目标检测中, Graph
4. 自注意力机制与CNN , RNN 的关系
4.1 从感受野的角度来讲
self-attention 的感受野大小, 是网络自身学习出来的;
4.2 CNN 是 self-attention 的一种子集
4.3 从数据量与模型效果来看;
- self-attention 在输入更多的数据后, 效果才比 CNN 好;
4.1 优于RNN
self-attention 支持向量的并行输出;