- Transformer中最主要的操作是自注意力操作,而自注意力操作是需要所有元素都要和所有元素去交互,两两相互的,计算得到的Attention,再将这个Attention去做加权平均,最后得到输出,因此自注意力的计算复杂度为 O ( n 2 ) O(n^2) O(n2),但是目前硬件能支持的这个序列长度n为几百或者上千,在BERT中n为512
- 但是在计算机视觉领域,如果我们想把2D的图片变成1D的序列,那么最简单最直观的方法就是把图片中的所有像素点当成序列的元素,直接拉直并输入进Transformer,一般来说在视觉领域,输入图片的尺寸为224224、800800等,将它直接拉直送入Transformer,得到的序列长度直接过万,计算复杂度太高,硬件跟不上
- Local Network:既然直接把像素点当作Transformer的输入太长,导致计算复杂度太高无法训练,那么我们把网络中间的特征图当作Transformer的输入,直接降低输入序列的长度,例如Res50的特征图只有14*14,这就是可以接受的范围之内了
- Stand-Alone Attention:孤立注意力,既然使用整张输入图片的复杂度太高,那么我们改为使用一个局部的小窗口,来缩小输入序列的长度。Axial Attention:轴注意力,将图片的宽高拆分为两个轴,因此225225的输入序列就变为了2225的输入序列,也降低了输入序列的长度。
- Sparse Attention:稀疏点注意力。Block Attention:将输入图片分块,进行注意力计算
- 局部性:由于卷积核是一步一步的在输入图片上进行移动卷积的,所以CNN假设图片上相邻的区域会有相似的特征
- 平移等变性:由于卷积核不考虑位置,所以在输入图片的不同的位置的相同物体,卷积核的输出是相同的,但是由于在Transformer中,加入了位置编码,所以不同位置的相同物体,Transformer Encoder的输出也不会相同
- 先将输入图片分块,假设输入图片为 3 * 224 * 224 的尺寸,分成尺寸为 16 * 16 的块,那么可以得到196个块,每个块拉直后的尺寸为 3 * 16 * 16 = 768,3为通道数
- 将拉直后的块X,输入进全连接层E,E的尺寸为 768 * 768,后一个768为D,代表模型的大小可以改变,前一个768是每个块拉直后的尺寸不能改变,那么:X · E 的尺寸为196 * 768
- 类似于BERT,需要加入一个特殊字符 [ CLS ] 作为最后的分类输出,并且[ CLS ] 的位置信息为0,因为所有的输入块都在跟所有的输入块做注意力计算,所以我们假设第一个块 [ CLS ] 可以学到其他块的有用信息,那么可以只根据 [ CLS ] 的输出来做最后的分类判断即可,[ CLS ] 的尺寸为 1 * 768,所以整体输入的尺寸为 197 * 768
- 整体的输入还需要加上位置编码(这里为1D的可学习位置编码,类似BERT),由于是直接加上位置编码,所以整体的输入尺寸仍然为 197 * 768,即Embedded Patches的尺寸为 197 * 768
- 整体的输入先进入Layer Norm层,再进入Multi-Head Attention层,由于采用了多头(这里是12),所以每个头的K、Q、V的尺寸为 197 * 64,最后将这些头的输出拼接起来,最后的尺寸又变成197 * 768,再经过Layer Norm层,和MLP层,注意MLP一般会将输入的尺寸先放大再缩小,如这里先放大四倍变为 197 * 3072 ,再缩小投射回 197 * 768,最后就输出了
- 同时由于这个Transformer Encoder Block的输入尺寸等于输出尺寸,都是 197 * 768。所以可以直接叠加Block
- 在VIT用作分类任务时,直接将经过很多Encoder Block层的 [ CLS ] 当作VIT模型的最后输出,即整个图片的特征,然后添加一个MLP的分类头来实现分类任务