论文笔记【2】-- Cait : Going deeper with Image Transformers
动机
去优化Deeper Transformer,即,让deeper的 vision transformer 收敛更快,精度更高。
所提方法(改进模型结构)
方法1 : LayerScale
图中 FFN 代表feed-forward networks; SA代表self- attention; η 代表Layer Normalization; α代表一个可学习的参数(比如,0, 0.5,1 );λ可是一个可学习的参数,它们构成了一个对角矩阵。
通过实验得出:图(a)(b)结构都不会使训练收敛,将(a)(b)结合变成图(c)中的结构,发现其在网络较深时也能收敛。图(d)是本文所用结构,即LayerScale。
LayerScale目的:给不同通道乘上一个λ,见公式好理解:
这么做的原因 : 个人认为,(b)(c)中的 α 是一个实数,即,FFN或SA的输出特征都统一乘以α;而图(d)中,FFN或SA输出特征的不同channel乘上不同的数值,会使得特征更细化,更精准。类似于CNN中channel注意力的感觉。
方法2 : class-attention layers
在原ViT中,在模型一开始输入时候加入了一个叫做class token的东西,在ViT中这个class token要做两件事:
- 引导attention过程,帮助得到attention map。
- 这些token还要输入到classifier中,完成分类任务。
作者认为class token要同时做到这2件事其实有点矛盾,参数会朝着矛盾的方向优化。对于分类任务,class token的目的只是为了获得图片的所有信息,用于最后的分类。
既然class token只是为了获得图片的全部信息,那为什么要在一开始就同patch一起送入网络参与attention活动?大可不必吧。所以本文没有按照原ViT的操作,而是将class token 放在模型的最后两层处加入,如下图(中)所示:
CA层公式表示:
问题1:为什么class token 放到了网络的后面也可以呢?我们知道图片的信息都在patch embedding里面,所以我们只需要用class token来抽取patch embedding中的信息就相当于class token拥有了图片的信息。
问题2:为什么class token 放到了网络的后面效果更好呢?class token若是和patch embedding同时送入网络,在计算attention时候,class token和patch embedding二者之间就会有信息的相互传递,而然事实上,我们想要的是,用class token 抽取patch embedding中的信息,而不需要将class token 中的信息传递给patch embedding 。所以将class token 往后放,就使得class token专注于它的工作,即专注于抽取图片的信息。
总结:
为了让deeper transformer 更易训练,提高精度。本文在原ViT网络架构的基础上做了两处的改动:LayerScale 和 class-attention layers。