在处理输入为一组长短不一的向量时,会用到自注意力机制。
Sequence Labeling 问题🔗
每个输入的向量通过全连接层得到输出即可完成,但是在输入相同内容时会出现问题(例如翻译同一个单词时,意思可能不同)。此时,将输入的向量的前后几个向量(window)也输入,能有更好的效果,但是在解决有些需要联系整个Sequence的问题时效果仍然不佳,此时引入自注意力机制(Self-attention)。
将每个输入的向量先通过自注意力机制生成一个带有Sequence信息的向量,然后再通过全连接层得到输出,能更好地解决这些问题。
自注意力层🔗
对于每一个向量,计算出全部向量和其关联程度(attention score)$$\alpha$$,在将其关联程度与向量做出变换的输出的积相加,得出的向量就会靠近关联程度高的那个,这个向量就是自注意力层的输出,也就是上面所说带有Sequence信息的向量。
具体的说,每个向量$$a_i$$乘上一个矩阵$$W_q$$得到$$q_i$$,乘上一个矩阵$$W_k$$得到$$k_i$$,乘上一个矩阵$$W_v$$得到$$v_i$$,其中$$q_i$$和$$k_j$$相乘得到相关系数$$\alpha_{ij}$$,soft-max后得到$$\alpha_{ij}^{\prime}$$,$$v^j$$与$$\alpha_{ij}^{\prime}$$相乘得到$$a_i$$的输出。
有些时候,有多种相关性,此时就需要多头自注意力机制(Multi-head Self-attention),及上面的$$q_i,k_i,v_i$$再乘上多个矩阵得到$$q_i^n,k_i^n,v_i^n$$,再由$$q_i^n,k_i^n,v_i^n$$来计算输出。
💡 位置信息
有时需要考虑到向量所在的位置信息,采用位置编码(Positional Encoding)。一种简单的方法是给每个位置一个表征位置的向量$$e_i$$,把$$e_i$$加到$$a_i$$就能考虑到位置信息,当然也有很多不同的方法将位置信息考虑进去。
Self-attention for Speech🔗
受运算速度限制,在处理语音问题时,我们往往不用考虑整个Sequence,而是考虑输入附近的向量做自注意力层。
Self-attention for Image🔗
将一张图片的每一个像素看作三维向量,一张图片也可以看作是一个Sequence来处理。
与CNN相比,Self-attention考虑了整张图片的信息,比CNN更广,弹性更大,所以Self-attention需要更多的数据,不然容易出现过拟合问题。
与RNN相比,RNN与离得远的向量的联系会比较低,而Self-attention可以定义相应的联系。另外RNN不能够并行处理,而Self-attention可以并行处理,所以Self-attention速度会更快。
Self-attention for Graph🔗
对一个图,每一个节点看作一个向量,节点与节点之间有边,边可以看作是向量之间的联系,所以也可以用Self-attention来处理图。处理时一般只用计算有相连的节点,不相连的节点关联性设为0,这就是一种GNN模型。