VOLO: Vision Outlooker for Visua

2022-06-12  本文已影响0人  李耕_嘿嘿嘿黑龙江哈哈哈哈尔滨
VOLO模型参数效果图

北深袁粒老师的工作,仍然是ImageNet上设计的transformer型模型,主要贡献在于提出一种称为outlooker的注意力层,这种结构结合了卷积局部信息整合和注意力层的优势,在transformer backbone和patch embedding的帮助下实现了性能提升 ImageNet上不借助预训练首次突破87.1%的top1正确率。


核心attention层: outlooker

具体操作

该attention主要操作基于以上伪代码(pytorch类似)。其核心操作主要有unfold和fold以及中间被替换的score矩阵计算方式,借助一次线性映射而不是两次线性映射加一次矩阵乘法,outlooker相对普通multi-head attention减少了MACs降低了复杂度。

unfold

unfold操作实际上类似于conv层滑动取窗口的机制,我们设定好kernel_size, stride, dilation等参数后,即可对B*C*H*W这样的张量在H*W这样的空间维上进行滑动取窗口,最后得到的新矩阵为B*(C*k*k)*n。k为kernel_size, n为总共取到的窗口数。

fold

fold则是unfold的逆过程,给定kernel_size,stride, dilation和output_size等参数后,它可以将B*(C*k*k)*n这样的矩阵还原回B*C*H*W。这里稍微注意为什么要相对unfold多给定一个output_size呢?因为其实我们发现不管输入矩阵还是给定参数除了output_size我们并不知道H*W, 给定kernel_size后我们可以求得C, 但是n是由H和W两个维度共同构成的,所以如果不显示指明H*W那么是可能包含多种满足条件的H*W(例如H与W互换)。

同时在pytorch中,fold实际上做的操作是把那些由unfold拓展出来的位置上的元素全部加和再放回原始矩阵,那么这个加和操作就会使得原位置元素值翻倍而非不变,所以其实fold和unfold大部分时候并不是真正互逆的,要想实现互逆应当对元素取平均。

outlooker

那么除去了类似conv这样考虑滑动窗口的unfold和fold过程,outlooker和普通scaled dot-product有什么区别呢? 

大体计算过程

由公式(4)可以看出其核心思路和attention层并无区别, 唯一就是score矩阵由原来的QK’, 变成了此处的A_{i,j},而这里的A实际上是直接由输入X通过线性映射直接得到的一个矩阵,也就是说相对于分别线性映射得到Q和K再做矩阵乘法得到score矩阵,这里直接采用了一个线性映射得到score矩阵,从而降低了计算复杂度。而之前的scaled乘以系数以及softmax归一都在代码中得到了保留。


misc

VOLO模型是基于LV-ViT进行改进的,其中利用的patch embedding并没有进行额外说明,但是对模型性能等有重要的影响。同时将conv和transformer做结合似乎是一个现阶段的一个趋势,其他工作(同一作者的T2T ViT)也保持了这样的一些变化或比较趋势。

上一篇下一篇

猜你喜欢

热点阅读