Self attention 解决什么问题#

用一句话概括就是:Self attention用来解决当输入为向量的序列时的问题(像音频、文本都是经典的输入为向量序列的数据)

Self attention的输出一般有如下三种类型

  • N个vector产生N个label

    ​ 例如输入一个句子,输出每个词的词性

  • N个vector产生1个label

    ​ 例如输入一个句子,判断这句话蕴含的情绪为positive or negative

  • N个vector产生N’(N≠N’)个label

    ​ 例如机器翻译,输入的句子和输出的句子词数很可能不一样

1

FC(Fully Connected)有什么不足#

FC也可以用来解决输出为向量序列的问题,如天气预测等等,但是它相比self attention有一些不足之处。

FC如果要充分考虑“上下文”——一个向量和它相邻的很多个向量,甚至可能整个序列一起考虑,就需要把考虑的向量串联起来,通过fully connect产生新的向量,那么参数的矩阵可能会非常大(这个在后面会解释),这可能导致很大的运算量overfitting

2

Self attention 的架构#

首先我们来看一个self attention层要做什么。

概况一下就是,一个self attention层要先算出每个向量和其他向量的关联性,这个关联性用attention score α\alpha 表示。然后再根据加权算出输出向量序列,值得一提的是,计算输出向量序列中的每个向量是并行的。

6 5

然后我们再看整个网络架构,经过self attention层后,产生了输出向量序列,这时候可以先对每一个向量进行fully connect,产生输入到下一个self attention层中的输入向量,然后就是重复,直至产生最终输出。

4

Self attention 的基本计算过程#

求attention score#

对于输入向量序列a1,a2,\mathbf{a^1},\mathbf{a^2},\dots,我们以求a1\mathbf{a^1}与自身及其他向量的attention score α1,i\alpha'_{1,i}为例,来说明求解流程

  1. a1\mathbf{a^1}q1\mathbf{q^1}q1=Wqa1\mathbf{q^1}=\mathbf{W}^q\cdot\mathbf{a^1},其中Wq\mathbf{W}^q为参数矩阵,是要学习的参数
  2. a1,a2\mathbf{a^1},\mathbf{a^2}\dotsk1,k2,\mathbf{k^1},\mathbf{k^2},\dotski=Wkai\mathbf{k^i}=\mathbf{W}^k\cdot\mathbf{a^i},其中Wk\mathbf{W}^k为参数矩阵,是要学习的参数
  3. q1\mathbf{q^1}k1,k2,\mathbf{k^1},\mathbf{k^2},\dots的关联性,常见方法是向量点乘,如α1,2=(q1)Tk2\alpha_{1,2}=(\mathbf{q^1})^\mathrm{T}\cdot\mathbf{k^2}
  4. 对上一步求得的α1,1,α1,2,\alpha_{1,1},\alpha_{1,2},\dots通过激活函数,常用softmax,最后得到attention score α1,1,α1,2,\alpha'_{1,1},\alpha'_{1,2},\dots

可以参照下图直观地理解上述步骤

8

求解Self attention层输出的向量#

对于输入向量序列a1,a2,\mathbf{a^1},\mathbf{a^2},\dots,我们以求输出向量序列中的b1\mathbf{b^1}为例,来说明求解流程

  1. a1,a2\mathbf{a^1},\mathbf{a^2}\dotsv1,v2,\mathbf{v^1},\mathbf{v^2},\dotsvi=Wvai\mathbf{v^i}=\mathbf{W}^v\cdot\mathbf{a^i},其中Wv\mathbf{W}^v为参数矩阵,是要学习的参数
  2. 利用求得的attention score对vi\mathbf{v^i}进行加权:b1=α1,iv1\mathbf{b^1}=\sum \alpha'_{1,i}\mathbf{v^1},从而得到b1\mathbf{b^1}

可以参照下图直观地理解上述步骤

9

矩阵视角下的计算过程#

下面三张图非常直观地展示了

  1. 产生qi,ki,vi\mathbf{q^i},\mathbf{k^i},\mathbf{v^i}
  2. 计算attention score
  3. 计算输出向量bi\mathbf{b^i}
10 11 12

上面提到的矩阵视角下的计算过程可以归结为下图,我们也可以发现,对于一层self attention层而言,需要学习的参数只有Wq,Wk,Wv\mathbf{W}^q,\mathbf{W}^k,\mathbf{W}^v

前面说到FC可能在考虑整个向量序列的情况下有大量的参数,比如说输入的向量序列为10000个100x1的向量,如果在考虑整个向量序列的情况下要产生10000个10x1的向量,用FC需要的参数数量级为(10000x100)x(10000x10),而如果用self attention,那么Wq\mathbf{W^q}的元素个数数量级为100x100。

13

Self attention的优化#

Multi-head Self attention#

考虑到在不同的视角下,一个向量和其他向量会有不同的关联性,所以我们可以用不同系数矩阵,最终产生多组向量序列输出。

14

我们也可以对多组向量序列输出进行拼接、变换,得到一组输出向量序列

15

Positional Encoding#

在之前的产生输出向量序列的操作中,我们可能忽略了输入向量序列在坐标或者时间尺度上的相关性,而这有时是很重要的,比如在音频识别中,识别一个音符考虑的就是在一小段时间内的信号,那么这一小段时间内向量的相关性就极强。

所以我们可以通过在输入向量序列上加一个用来代表位置的向量,来为输入向量增加坐标/时间信息。这个代表位置的向量可以是直接计算得到的,也可以是通过神经网络学习得到的。

16

Self attention 和其他网络对比#

CNN#

其实图像也可以看作是向量的序列——比如一张100x100x3的图片,可以看作是100x100个向量(一个像素的RGB三通道值作为向量)。

通过设置如果attention score合适,是不是也可以表现出CNN的效果?而且self attention可以打破CNN中由于卷积核带来的像素只与周边像素作用的限制,让一个像素可以和离它较远的像素作用。

所以,self attention是更灵活的CNN,而CNN是简化的self attention

18

在二者训练效果对比中也可以发现,对于小的数据集,自由度比较小的CNN表现得更好,对于大数据集而言,self attention表现的效果更好。

19

RNN#

相比RNN而言,self attention由于并行运算可以获得更快的运算速度,同时相比RNN不易考虑到距离一个向量在坐标尺度下比较远的向量,self attention可以通过attention score充分考虑到一个向量在坐标尺度下距离比较远的向量。

20

GNN#

self attention可以看作是一种特殊的GNN,如果两个点直接由连线,那么attention可以设为1,否则直接设为0。

21

本文采用CC-BY-SA-3.0协议,转载请注明出处
作者: 核子