Transformer解读之:Transformer 中的 Attention 机制
encoder 的 attention
- 场景:现在要训练的内容是 I love my dog -> 我喜欢我的狗
- 那么在 encoder 端的输入是: I love my dog;
- 假设经过 embedding 和位置编码后,I love my dog 这句话肯定已经变成了一个向量,但是在这里方便起见,我们依然用 I love my dog 来表示经过了处理之后的向量表示,后面有机会我会将向量的维度拆解开再给大家讲一遍
- 接下来要进入 encoder 端的 attention 层了
attention 的动机
- 动机很简单:生成一个张量,张量表示了输入的每一个词向量和其他词向量之间的关系。
- 这个关系的表示,需要在一个给定维度的空间中完成(在另外一个空间中求相似度,后面会解释)。而在多少维度的空间中进行,就取决于我们在 attention 中指定的线性层的维度
如何衡量关系——相似度
- 我们初中就学过,衡量两个向量的相似度的方法就是向量点乘,数值越大越相似
- 而编码过的单词天生就是向量
如何构造两个相乘的向量
- 难道要用
I
I
L
o
v
e
,
m
y
,
d
o
g
Love, my, dog
- 这个思考方向是对的,但是存在一个问题,就是这样乘出的相似度没有意义,因为在当前的表示空间中,所有的词的向量表示都是固定的;
- 而我们想让那些彼此相乘的向量具有以下特点:
- 这些向量能够代表文本向量的信息,因为我们还是想要得到
I
I
L
o
v
e
Love
M
y
My
- 这些向量能够带有可学习的参数,通过神经网络的迭代自己学出来;这样可以保证在不同的场景下,权重可以自行改变,有时候
I
I
l
o
v
e
love
- 这些向量能够代表文本向量的信息,因为我们还是想要得到
- 所以这很自然有一个想法:
- 我直接以原文本的向量为基础,通过线性层对他的特征进行一次处理,这样得到的向量不就具有上述特点了么;
- 线性层的输入是原文本的向量,这样可以保证线性层的输出是原文本的一种表示,这相当于将原本的所有词向量映射到另外一个高维空间中的向量,而这个过程引入了可学习的参数,相当于那些被映射过去的向量之间的关系并未确定,而是需要根据 loss 和反向传播不断更新才能最终收敛,直到那时,词向量之间的关系才被最终确定。
-
这就是 Transformer 中总是提到的
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 向量;后面很自然地会过渡到
Q
,
K
,
V
Q, K, V
Q,K,V 矩阵。
-
我们以
I
I
I 这个文本为例,对他采用线性层生成一个
q
q
q 向量,这个
q
q
q 向量包含了
I
I
I 向量原本的信息,然后对其他的所有文本也都通过线性层生成他们各自的
k
k
k 向量;这些
k
k
k 向量其实和
q
q
q 是完全一样的东西,都只是线性层的输出而已,但是为了进行后面的操作,我们人为地对这些向量进行区分
-
当然,除了
I
I
I 之外的单词也会产生
q
q
q 向量,只是这里我们先看
I
I
I 这个单词,所以先将
I
I
I 当做主角,其他单词的
q
q
q 向量也是同样的作用,如法炮制
-
得到
I
I
I 的
q
q
q 向量之后,让这个
q
q
q 向量和其他所有单词产生的
k
k
k 向量
k
l
o
v
e
,
k
m
y
,
k
d
o
g
k_{love}, k_{my}, k_{dog}
klove,kmy,kdog 进行点乘,是不是就可以获得 I 对其他所有单词的值(有几个单词就产生几个值)但是这些值还不能叫做权重,因为相似度计算出的值范围根本不确定;因此我们对这些值共同算一个 softmax 就可以得到权重值了。
-
举个🌰,假设
I
I
I 的
q
q
q 向量和每个
k
k
k 计算得到的值分别为
[
a
,
b
,
c
,
d
]
[a, b, c, d]
[a,b,c,d];这些值要进行放缩之后再
s
o
f
t
m
a
x
softmax
softmax 才能得到最终的权重值。
-
再强调一遍,这个权重值会根据训练的不同阶段而不断更新,但是我们知道,通过这个步骤,
I
I
I 建立了它对所有单词的关系,这些关系其实就只是在另外一个高维空间中的相似度数值而已。
-
最终还要再用 v 向量再去和每一个生成的相似度权重
s
i
m
_
q
k
_
n
sim_{qk}_n
sim_qk_n (每一个都是标量)相乘之后相加,得到一个最终的向量。这个最终的向量编码了 I 和其他词向量的关系
-
同样的,对于
L
o
v
e
,
m
y
,
d
o
g
Love, my, dog
Love,my,dog 这些词向量,也通过相同的方式获得了他们各自的最终和其他词向量在高维空间中的关系表示
-
我们用向量的维度来具体的,更加深入理解一下这个过程:
- 假设
I
,
l
o
v
e
,
m
y
,
d
o
g
I,love,my,dog
e
m
b
e
d
d
i
n
g
embedding
(
1
,
6
)
(1,6)
- 线性层选的神经元个数都是 5,即,
(
1
,
5
)
(1, 5)
- 那么
q
,
k
,
v
q, k, v
(
1
,
5
)
(1, 5)
- 当
I
I
q
i
q_i
k
k
- 将这 4 个标量分别与
v
i
:
(
1
,
5
)
v_i: (1,5)
v
i
′
:
(
1
,
5
)
v_i^{'}: (1, 5)
v
i
′
v_i^{'}
q
i
q_i
- 这个过程中的
q
i
q_i
k
k
q
i
q_i
K
:
(
4
,
5
)
K: (4, 5)
K
K
q
K
T
q K^T
(
1
,
5
)
∗
(
5
,
4
)
=
(
1
,
4
)
(1, 5)* (5, 4)= (1, 4)
- 这只是一个对
q
i
q_i
a
t
t
e
n
t
i
o
n
attention
q
q
Q
Q
q
q
Q
:
(
4
,
5
)
Q: (4, 5)
K
T
:
(
5
,
4
)
K^T: (5,4)
Q
K
T
:
(
4
,
4
)
QK^{T}: (4, 4)
- 然后将所有单词的 v 向量也拼起来,组成
V
:
(
4
,
5
)
V: (4, 5)
(
4
,
4
)
(4, 4)
a
t
t
e
n
t
i
o
n
attention
Q
K
T
V
(
4
,
5
)
QK^{T} V (4,5)
a
t
t
e
n
t
i
o
n
attention
a
t
t
e
n
t
i
o
n
attention
- 假设