简介
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.youkuaiyun.com/weixin_43414694/article/details/119058654
该教程主要参考的是台大李宏毅的网课视频,附上视频链接:台大李宏毅self-attention教程
文中图片均引自台大李宏毅的PPT,需要PPT的童鞋请戳这里:教程配套PPT
本文针对视频中的一些重点进行总结,看不懂的童鞋还请去看原视频,毕竟李宏毅yyds!!
背景什么的就不再介绍了,网上一搜一大堆,不知道背景的童鞋可以先去度娘问一下。
正文开始
self-attention主要是针对seq2seq的,根据输入和输出的向量长度的不同可以分为三种情况:
- 输入和输出长度相同,也就是说输入n个向量,就要输出n个对应的标签:比如给一个句子里的每个单次标注词性(动词、名词、形容词等等)
- 输入和输出长度不同,也就是输入n个向量,输入m个向量(n!=m):比如判断是个句子是贬义的还是褒义还是中中性的。例如You are very good,很显然这句话是褒义的,输入是四个向量,输出是两个向量
- 输出向量的长度未知,需要由机器自己决定需要输出的标签数量
本文以第一种情况进行展开讲解,第一种情况的英文名也叫Sequence Labeling,也就是输入的每一个向量都需要给给它一个对应的标签。
Sequence Labeling
首先给出一个句子,需要对下面这个句子的每一个单词的词性进行标注。
I saw a saw(我看到了一把锯)
这里的第一个saw意思为动词“看到”,而第二个saw的意思为名词“锯”,这对于我们来说可以很轻松的分辨出这两个saw的词性是不同的,但是机器不同。如果使用传统的深度学习方法,机器将会对每个单词进行独立分析,不考虑上下文之间的联系(此图引自台大李宏毅的ppt),那么这两个saw对于机器来说是完全一样的。因此输入的结果肯定也是一样的(要么都是名词,要么都是动词),因此在某些场合,考虑上下文联系就显得非常重要。
有的人提出利用一个window将相邻单词框起来一起分析,但这种做法有几个缺点:
- 每个句子的长度可能不同
- 如果让window的长度等于最长的那个句子的长度,则会导致FC层的参数过多
因此,为了解决这些问题,self-attention就被提出来了。
Self-attention
乍一看这张图和上面那一张差别不大,也是输入四个向量,输出四个向量,但输出的这四个向量比较特殊,它们是考虑整个句子后才输出的,并不是一对一的关系。也就是说每个输出向量都是充分考虑到它和四个输入向量的关系,因此后面的FC层也不仅仅只考虑一个输入向量,而是需要考虑四个输入向量,这就把上下文联系了起来,这就是一次self-attention,而self-attention是可以叠加的,可以针对一个句子进行多次self-attention。如果读到这有点懵逼也很正常,继续往下看。
重点来了
我们设输入到self-attention的四个向量分别为 a 1 , a 2 , a 3 , a 4 a^1, a^2, a^3, a^4 a1,a2,a3,a4,经过self-attention之后的输出向量为 b 1 , b 2 , b 3 , b 4 b^1, b^2, b^3, b^4 b1,b2,b3,b4,每一个输出向量都是充分考虑所有的输入向量之后得到了的,也就是说 b 1 b^1 b1 是根据 a 1 , a 2 , a 3 , a 4 a^1, a^2, a^3, a^4 a1,a2,a3,a4得出的, b 2 b^2 b2也是根据 a 1 , a 2 , a 3 , a 4 a^1, a^2, a^3, a^4 a1,a2,a3,a4得出的。下面这张图可以很好的表示。下面以 b 1 b^1 b1为例进行说明。
根据 a 1 a^1 a1寻找和 a 1 a^1 a1有关的其他输入向量也就是说计算 a 2 , a 3 , a 4 a^2, a^3, a^4 a2,a3,a4这三个向量和 a 1 a^1 a1的相关度,这里用 α \alpha α来表示
求
α
\alpha
α的方法主要有两种:Dot-product 和 Additive,比较常用的是Dot-product,这里只介绍Dot-product,想了解第二种方法的童鞋可以观看原视频、
Dot-product
将输入的两个向量分别乘一个矩阵
W
q
W^q
Wq和
W
k
W^k
Wk之后得到的向量
q
q
q和向量
k
k
k,之后两个向量求点积可得到
α
\alpha
α.,即
α
=
q
⋅
k
\alpha = q \centerdot k
α=q⋅k
那怎么将
α
\alpha
α用到self-attention里呢?用
a
1
a^1
a1分别与
a
2
,
a
3
,
a
4
a^2, a^3, a^4
a2,a3,a4相乘计算
a
1
a^1
a1和
a
2
,
a
3
,
a
4
a^2, a^3, a^4
a2,a3,a4之间的相似度,这里我们设:
q
1
=
W
q
α
1
q^1=W^q \alpha^1
q1=Wqα1
k
2
=
W
k
a
2
k^2=W^k a^2
k2=Wka2
k
3
=
W
k
a
3
k^3=W^k a^3
k3=Wka3
k
4
=
W
k
a
4
k^4=W^k a^4
k4=Wka4
q
1
q^1
q1我们称之为query,
k
2
,
k
3
,
k
4
k^2, k^3, k^4
k2,k3,k4我们称之为key,那么
α
12
=
q
1
⋅
k
2
\alpha_{12} = q^1 \centerdot k^2
α12=q1⋅k2
α
12
\alpha_{12}
α12表示
a
1
和
a
2
a^1和a^2
a1和a2的相似度,称为attention score,同理可得
α
13
=
q
1
⋅
k
3
\alpha_{13} = q^1 \centerdot k^3
α13=q1⋅k3
α
13
=
q
1
⋅
k
4
\alpha_{13} = q^1 \centerdot k^4
α13=q1⋅k4
α
14
=
q
1
⋅
k
4
\alpha_{14} = q^1 \centerdot k^4
α14=q1⋅k4 除此之外,也要计算自相关性,也就是
α
11
=
q
1
⋅
k
1
\alpha_{11} = q^1 \centerdot k^1
α11=q1⋅k1 之后进行将
α
11
,
α
12
,
α
13
,
α
14
\alpha_{11}, \alpha_{12}, \alpha_{13}, \alpha_{14}
α11,α12,α13,α14输入到softmax层(softmax不是唯一选择,也可以使用其他激活函数)得到
α
11
′
,
α
12
′
,
α
13
′
,
α
14
′
\alpha'_{11}, \alpha'_{12}, \alpha'_{13}, \alpha'_{14}
α11′,α12′,α13′,α14′,整个过程如下图所示。
得到 α ′ \alpha' α′我们就知道了 a 1 a^1 a1和其他输入向量之间的关系强弱,下面就根据这个关系从中提取重要信息。
我们设一个矩阵
W
v
W^v
Wv和四个向量
v
1
,
v
2
,
v
3
,
v
4
v^1, v^2, v^3, v^4
v1,v2,v3,v4,其中
v
1
=
W
v
a
1
v^1 =W^v a^1
v1=Wva1
v
2
=
W
v
a
2
v^2 =W^v a^2
v2=Wva2
v
3
=
W
v
a
3
v^3 =W^v a^3
v3=Wva3
v
4
=
W
v
a
4
v^4 =W^v a^4
v4=Wva4 之后将每一个attention score和对应的
v
v
v相乘后求和即可得到
b
1
b^1
b1,即
b
1
=
∑
i
α
1
i
′
v
i
b^1=\sum_i \alpha'_{1i} v_i
b1=i∑α1i′vi
假如
a
1
a^1
a1和
a
2
a^2
a2的相关度越大,也就是
α
12
′
\alpha'_{12}
α12′越大,那么
b
1
b^1
b1的值就越接近
v
2
v^2
v2,同理,若
a
1
a^1
a1和
a
3
a^3
a3的相关度越大,也就是
α
13
′
\alpha'_{13}
α13′越大,那么
b
1
b^1
b1的值就越接近
v
3
v^3
v3,这一点一定要想明白。
同理
a
2
a^2
a2和其他输入向量的相关度
α
21
′
=
s
o
f
t
m
a
x
(
q
2
k
1
)
\alpha'_{21}=softmax(q^2 k^1)
α21′=softmax(q2k1)
α
22
′
=
s
o
f
t
m
a
x
(
q
2
k
2
)
\alpha'_{22}=softmax(q^2 k^2)
α22′=softmax(q2k2)
α
23
′
=
s
o
f
t
m
a
x
(
q
2
k
3
)
\alpha'_{23}=softmax(q^2 k^3)
α23′=softmax(q2k3)
α
24
′
=
s
o
f
t
m
a
x
(
q
2
k
4
)
\alpha'_{24}=softmax(q^2 k^4)
α24′=softmax(q2k4)因此
b
2
=
α
21
′
v
1
+
α
22
′
v
2
+
α
23
′
v
3
+
α
24
′
v
4
b^2=\alpha'_{21}v^1+\alpha'_{22}v^2+\alpha'_{23}v^3+\alpha'_{24}v^4
b2=α21′v1+α22′v2+α23′v3+α24′v4
下面从矩阵的角度分析self_attention
根据上面的分析可知,每一个输入向量
a
i
a^i
ai都要有
q
i
,
k
i
,
v
i
q^i, k^i, v^i
qi,ki,vi与之对应,且
q
i
=
W
q
a
i
q^i=W_q a^i
qi=Wqai,也就是说
q
1
q
2
q
3
q
4
=
W
q
[
a
1
a
2
a
3
a
4
]
q^1q^2q^3q^4=W^q[a^ 1a^2a^3a^4]
q1q2q3q4=Wq[a1a2a3a4]这里我们将
a
1
,
a
2
,
a
3
,
a
4
a^1, a^2, a^3, a^4
a1,a2,a3,a4用一个矩阵
I
I
I表示,将
q
1
,
q
2
,
a
3
,
q
4
q^1, q^2, a^3, q^4
q1,q2,a3,q4用矩阵
Q
Q
Q表示,因此上式可以写为
Q
=
W
q
I
Q=W^qI
Q=WqI同理,用矩阵
K
K
K表示
k
1
,
k
2
,
k
3
,
k
4
k^1, k^2, k^3, k^4
k1,k2,k3,k4,用矩阵
V
V
V表示
v
1
,
v
2
,
v
3
,
v
4
v^1, v^2, v^3, v^4
v1,v2,v3,v4,因此有
K
=
W
k
I
K=W^kI
K=WkI
V
=
W
v
I
V=W^vI
V=WvI
从矩阵的角度求解相关度 α 1 i \alpha_{1i} α1i
根据前面的分析,
a
1
和
a
i
的相关度
α
1
i
=
q
1
k
i
,携程矩阵的形式就是
α
1
i
=
(
k
i
)
T
q
1
a^1和a^i的相关度\alpha_{1i}=q^1 k^i,携程矩阵的形式就是\alpha_{1i}=(k^i)^T q^1
a1和ai的相关度α1i=q1ki,携程矩阵的形式就是α1i=(ki)Tq1,那么
α
11
,
α
12
,
α
13
,
α
14
\alpha_{11}, \alpha_{12}, \alpha_{13}, \alpha_{14}
α11,α12,α13,α14就可以写成
[
(
k
1
)
T
,
(
k
2
)
T
,
(
k
3
)
T
,
(
k
4
)
T
]
∗
q
1
[(k^1)^T, (k^2)^T, (k^3)^T, (k^4)^T] *q^1
[(k1)T,(k2)T,(k3)T,(k4)T]∗q1,
α
2
i
,
α
3
i
,
α
4
i
\alpha_{2i}, \alpha_{3i}, \alpha_{4i}
α2i,α3i,α4i同理。我们将它们写到一个大矩阵中
从矩阵的角度求 b b b
直接上图,如果有线性代数基础很好理解(图中的
a
^
应该为
a
′
\hat{a}应该为a'
a^应该为a′)
全部过程可以总结为下面的图,其中需要学习的参数为 W q , W k , W v W^q, W^k, W^v Wq,Wk,Wv
以上就是self-attention的基础内容了,各位童鞋如果有不明白的地方可以去看原视频,毕竟李宏毅讲的是真的细。如果有什么疑问,欢迎留言讨论。下一篇将对self-attention的升级版
Multi-head Self-attention进行讲解