自注意力机制
该篇博客是笔者学习李宏毅老师课程后所写的学习笔记,如文中有错误,感谢大家指正
文章目录
一、解决的问题
在前面的学习中,我们是将一个向量作为输入,当我们把输入推广到Sequence,且长度是会改变的,例如文字处理(把每一个词汇表示成一个向量)、一段声音信号(一排声音向量,10ms是一个向量)、Graph(一个节点是要给向量)
输出的三种可能:
(1)每一个向量都有一个对应的label、(词性标注,每一个输入的词汇都有对应的词性)
(2)一整个Sequence只输出一个lable (情感分析,给机器一段话,机器给出情感标签)
(3)一整个Sequence输入,输出label个数机器自己决定
下面我们重点讨论输入输出数目一样多的情况,又叫做Sequence Labeling问题
如上图所示,我们为一句话词性标注。如果只把一个向量输入到对应的一个FC里面,上例中两个saw拼写相同,所以无法得出不同的词性,为了解决这个问题,要把每个目标单词前后的单词一起送入FC中,即将整个window一起送入一个FC中
但是如果一个问题需要整个sequence的输入才能满足要求,显然一味的将window放大不能满足要求,那么我们就需要用到Self-attention来解决这个问题
二、自注意力机制Self-attention
在使用Self-attention模型做对应输入输入的计算时,先让Self-attention“吃”进一整个序列,然后再做向量的输出。注意,有几个向量的输入,就有几个向量输出,且该输出向量是考虑了整个sequence资讯的向量
self-attention也可以多次叠加使用,所以self-attention的输入可以是初始的input,也可以是将上一次self-attention的输入作为本次的输入
在Self-attention模型中,每个输出 b 1 b^1 b1都和所有的输入相关,其相关性用 α \alpha α来表示
三、Self-attention中输出的计算方法
1.每个输出的计算过程
b1的产生: 因为输出 b 1 b^1 b1不仅与 a 1 a^1 a1有关,还有整个序列有关,在本例中我们要先计 算 a 1 a^1 a1和 a 2 a^2 a2、 a 3 a^3 a3、 a 4 a^4 a4的关联系数 α 1 , i \alpha_{1,i} α1,i
(1) 先将 a 1 a^1 a1和矩阵 W q W^q Wq相乘,得到向量 q 1 q^1 q1
(2)将 a 1 a^1 a1、 a 2 a^2 a2、 a 3 a^3 a3、 a 4 a^4 a4分别和矩阵 W k W^k Wk相乘,得到向量 k 1 k^1 k1、 k 2 k^2 k2、 k 3 k^3 k3、 k 4 k^4 k4
(3)将 q 1 q^1