一、自注意力与CNN
自注意力还可以被用在图像上。到目前为止,在提到自注意力的时候,自注意力适用的范围是输入为一组向量的时候。一张图像可以看作是一个向量序列,如图所示,一张分辨率为 5 × 10 的图像
可以表示为一个大小为 5 × 10 × 3 的张量,3 代表 RGB 这 3 个通道(channel),每一个位置的像素可看作是一个三维的向量,整张图像是5 × 10 个向量。
所以可以换一个角度来看图像,图像其实也是一个向量序列,它既然也是一个向量序列,完全可以用自注意力来处理一张图像。
自注意力跟卷积神经网络之间有什么样的差异或者关联?
1.
如图所示,如果用自注意力来处理一张图像,假设红色框内的“1”是要考虑的像素,它会产生查询,其他像素产生键(觉得概念模糊的可以复习一下前几篇文章)。
在做内积的时候,考虑的不是一个小的范围,而是整张图像的信息。
在做卷积神经网络的时候,卷积神经网络会“画”出一个感受野,每一个滤波器,每一个神经元,只考虑感受野范围里面的信息。
所以如果我们比较卷积神经网络跟自注意力会发现,卷积神经网络可以看作是一种简化版的自注意力,因为在做卷积神经网络的时候,只考虑感受野里面的信息。在做自注意力的时候,会考虑整张图像的信息。
在卷积神经网络里面,我们要划定感受野。每一个神经元只考虑感受野里面的信息,而感受野的大小是人决定的。而用自注意力去找出相关的像素,就好像是感受野是自动被学出来的,网络自己决定感受野的形状。网络决定以这个像素为中心,哪些像素是真正需要考虑的,哪些像素是相关的,所以感受野的范围不再是人工划定,而是让机器自己学出来。
所以我们认为CNN是自注意力的特例,自注意力只要设定合适的参数,就可以做到跟卷积神经网络一模一样的事情。
卷积神经网络的函数集(function set)与自注意力的函数集的关系如图所示。
所以自注意力是更灵活的卷积神经网络,而卷积神经网络是受限制的自注意力。
既然卷积神经网络是自注意力的一个子集,说明自注意力更灵活。更灵活的模型需要更多的数据。如果数据不够,就有可能过拟合。而比较有限制的模型,它适合在数据少的时候使用,它可能比较不会过拟合。如果限制设的好,也会有不错的结果。
我们来看谷歌论文里面的两个模型在一个实验中数据量相同情况的训练结果图:
横轴是训练的图像的量,在这个实验里面,自注意力是浅蓝色的这一条线,卷积神经网络是深灰色的这条线。
随着数据量越来越多,自注意力的结果越来越好。最终在数据量最多的时候,自注意力可以超过卷积神经网络,但在数据量少的时候,卷积神经网络是可以比自注意力得到更好的结果的。自注意力的弹性比较大,所以需要比较多的训练数据,训练数据少的时候就会过拟合。而卷积神经网络的弹性比较小,在训练数据少的时候结果比较好。但训练数据多的时候,它没有办法从更大量的训练数据得到好处。这就是自注意力跟卷积神经网络的比较。
二、自注意力与RNN
目前,循环神经网络的角色很大一部分都可以用自注意力来取代了。
循环神经网络跟自注意力一样,都是要处理输入是一个序列的状况。
循环神经网络里面有一个输入序列、一个隐状态的向量、一个循环神经网络的块(block)。循环神经网络的块“吃”记忆的向量,输出一个东西。这个东西会输入全连接网络来进行预测。
接下来当第二个向量作为输入的时候,前一个时间点“吐”出来的东西也会作为输入丢进循环神经网络里面产生新的向量,再拿去给全连接网络。输入第三个向量时,第三个向量跟前一个时间点的输出,一起丢进循环神经网络再产生新的输出。输入第四个向量输入时,把第四个向量跟前一个时间点产生出来的输出再一起做处理,得到新的输出再通过全连接网络的层,这就是循环神经网络。
如上图所示,循环神经网络的输入都是一个向量序列。自注意力输出是一个向量序列,该序列中的每一个向量都考虑了整个输入序列,再输入到全连接网络去做处理。循环神经网络也会输出一组向量,这排向量也会给全连接网络做进一步的处理。
1.
自注意力跟循环神经网络有一个显而易见的不同:自注意力的每一个向量都考虑了整个输入的序列,而循环神经网络的每一个向量只考虑了左边已经输入的向量,它没有考虑右边的向量。但如果用双向循环神经网络(Bidirectional Recurrent Neural Network,Bi-RNN),那么每一个隐状态的输出也可以看作是考虑了整个输入的序列。
假设把循环神经网络的输出跟自注意力的输出拿来做对比,就算使用双向循环神经。网络还是有一些差别的。
还是来看这张图,对于循环神经网络,如果最右边黄色的向量要考虑最左边的输入,它就必须把最左边的输入存在记忆里面,才能不“忘掉”,一路带到最右边,才能够在最后一个时间点被考虑。
自注意力输出一个查询,输出一个键,只要它们匹配(match)得起来,无论隔多远都能直接被考虑。即自注意力可以轻易地从整个序列上非常远的向量抽取信息。
2.
自注意力跟循环神经网络还有另外一个更主要的不同是:循环神经网络在处理输入、输出均为一组序列的时候,是没有办法并行化的。比如计算第二个输出的向量,不仅需要第二个输入的向量,还需要前一个时间点的输出向量。当输入是一组向量,输出是另一组向量的时候,循环神经网络无法并行处理所有的输出,但自注意力可以。
自注意力输入一组向量,输出的时候,每一个向量是同时并行产生的,因此在运算速度上,自注意力会比循环神经网络更有效率。