1.为什么需要self-attention?
答:
让网络能够像人一样有侧重点的关注送进网络的东西。比如像设计好的网络送入一句话,但是这句话的前后每个单词都是有关联的,并且关联程度不一样,self-attention就能够很好的解决这个关联问题,让网络自己能够学习到不同词语之间的关联程度,同样在如果送入的是图像也可以,之不过需要把图像转换成向量之后才能处理。
2.什么是self-attention?
答:
self-attention就是自注意力机制,attention的一种。
3.怎么定义self-attention?
如上图,总共有四个向量,
a
1
a_{1}
a1,
a
2
a_{2}
a2,
a
3
a_{3}
a3,
a
4
a_{4}
a4。对每个向量分别乘上三个矩阵
W
q
W_{q}
Wq,
W
k
W_{k}
Wk,
W
v
W_{v}
Wv得到
q
i
q_{i}
qi,
k
i
k_{i}
ki,
v
i
v_{i}
vi。然后每个
q
i
q_{i}
qi向量和
k
i
k_{i}
ki相乘得到
α
i
j
\alpha_{ij}
αij矩阵,然后再将
α
i
j
\alpha_{ij}
αij通过非线性激活函数得到
α
i
j
′
\alpha_{ij}^{\prime}
αij′,最后再将得到的
α
i
j
′
\alpha_{ij}^{\prime}
αij′分别乘上
v
i
v_{i}
vi向量得到
b
i
b_{i}
bi。
4.多头注意力机制
上面试针对单头注意力机制的,有时候我们输入的向量的相关性可能比较复杂,比如我们输入一句话,这句话可能在不同时间,不同地点,不同语气,不同的人表达出来可能不是一个意思。
5.那么什么是多头注意力机制呢?
其实很简单,做法基本上同上面的单头注意力机制,只是多了一步而已。具体做法是:在上面已经计算出大头注意力
q
i
q_{i}
qi,
k
i
k_{i}
ki,
v
i
v_{i}
vi之后,这时候先不着急计算
b
i
b_{i}
bi,先让刚才得到的
q
i
q_{i}
qi,
k
i
k_{i}
ki,
v
i
v_{i}
vi在分别乘上
W
q
,
i
W_{q,i}
Wq,i,
W
k
,
i
W_{k,i}
Wk,i,
W
v
,
i
W_{v,i}
Wv,i得到
q
i
,
j
q_{i,j}
qi,j,具体需要用到几个多头看自己的需要。
注意:无论是单头还是多头注意力机制,他们的计算都是并行计算的。
通过上面的方法,我们知道了什么是单头注意力机制,什么是hi多头注意力机制,但是还有一个存在的问题就是我们输入的向量的位置怎么确定,上面使我们假定输入的四个向量是由先顺序的。这个时候就需要位置编码这个东西了,其实也没啥,就是加了个位置向量,在每个输入的向量前面加个位置向量
e
i
e_{i}
ei,看到的
e
i
e_{i}
ei就知道加入了位置信息,那么网络就会自己去学你输入向量之间的一个位置信息。具体用什么位置编码有很多种方法,这里不具体阐述。
至此,注意力机制基本上已经讲完了。那么通过上面的学习我们能否比较下self-attention和纯CNN以及RNN之间的关系呢?
先来比较下self-attention和CNN的关系:
先来给个结论,self-attention可以完全取代CNN,CNN就是self-attention的特例。
从感受野的角度去分析self-attention与CNN的区别,我们知道每个卷积都有特定的感受野大小,不同的输出特征层具有不同的感受野大小,然而对于CNN而言,这些感受野的大是由人为规定的CNN的大小所决定的,并且每个卷积核所关注的区域时固定的,相互之间没有什么关联特性。然而,如果使用self-attention的话,那么这个感受野就不是一个固定的区域了,他可以根据我们所输入的图像会自动计算图像不同区域的一个关联程度,这个时候的感受野就不是一个人工设计的了,而是网络自己学习到的。CNN适合训练资料比较少的情况,self-attention适合数据量比较大的情况,否则容易过拟合。
再来比较下self-attention和RNN的关系:
- RNN是串行,self-attention是并行。
- RNN只考虑已经输入的向量,而self-attention考虑了输入的所有向量。
self-attention就介绍到这里,如果想进一步了解,可以看下我的另一篇博文关于Transformer的总结。