attention机制的效果非凡,但本身也是有缺陷的:Q*K矩阵的复杂度高达O(n^2);如果用在CV领域,还涉及到如下问题:
- 局部性、全局性
- 稀疏性
- 多尺度问题
为了更好地把attention机制应用于CV,上述的几个问题是需要解决的!
1、DilateFormer: Multi-Scale DilatedTransformer for Visual Recognition
image有个和NLP完全不一样的特点:sematic相关的patch一般都在附近,远距离的patch之间大概率是不相干的!所以只需要提取patch附近的特征即可,比如下面的:红色是query,相关性高的patch都在图上标注了
这类image有三个特点:
- 局部性:sematic相关的patch分布在query周围不远处
- 稀疏性:sematic相关的patch仅仅是少数,大部分是不相干的
- 多尺度:task/image不同,提取特征的方法和尺度也不同
这篇论文的标题有multi-scale,这个multi-scale到底体现在哪?图示如下:
这里有个膨胀率的概念:膨胀率越高,query的patch越远,比如这里有r=1、2、3这3种膨胀率;这么做的最大好处是:
- 满足局部性的特点:patch只和周边的相关
- 稀疏性:patch可能并不是规整排列,而是”跳跃、陆续“
- 多尺度:膨胀率越高,感受野越大
2、Fast Vision Transformers with HiLo Attention:上面的网络架构解决了image特征提取局部性问题,但是全局特征还没着落了,咋办?
上路high frequency attn:核心是patches之间做attn,提取的是局部path的特征
- 把原始图片切分成数个patches
- patches经过multi-head QKV矩阵后做attn
- 最后concat后再做projection
全局特征咋办了?怎么提取呀?看下路low frequency attn:
- 每个patch做avg pooling,把每个patch的特征”浓缩“一下
- 原始image做Q,”浓缩“后的patch做KV,继续做attn,这一步核心是找到image全局特征和局部特征的相关性
最后把上下两路特征做concat,同时得到image的全局和局部特征啦!
3、P2T: Pyramid Pooling Transformer for Scene Understanding; Q*K矩阵的复杂度高达O(n^2),核心原因之一是token数量过多,怎么适当减少token数量了?上面第二种方法对每个patch使用了avg pool来提取特征,这个思路是不是能复用借鉴一下了?单层的pooling得到的特征不够强大,那使用多层、多尺度的pooling提取原始image图像的特征行不行了?
使用多尺度的pooling,对原始image提取不同颗粒度的特征,concat后得到KV向量,然后和原始image的Q向量做multi-head self attn,不就达到减少token、降低attn计算量的目的了么?pyramid pooling的有点:
- pooling windows灵活设置,计算量可调整和控制
4、上述对image做pyramid pooling,这里拓展一下思路,能不能做pyramid conv了?Focal Modulation Networks (https://github.com/microsoft/FocalNet ) 作者就是这么想的!前面说了,image中patch语义相关的一般都在其附近,距离不会太远,所以做attention的时候只需要和近距离的patch做计算即可;DilateFormer通过膨胀率选择就近的patch,Focal Modulation Networks是怎么做的了?如下图所示:
普通的self-attention是和所有的patch做计算,计算量很大;而Focal modulation就不这么干了,只是和patch周围的区域做计算!这个思路其实并不创新,因为DilateFormer已经用过了。但DilateFormer通过膨胀思路,跳跃式地选择patch周围的区域做attention,可能会漏掉一些重要信息,Focal Modulation Networks在这里以牺牲计算量为代价,改进了一些,使用整个周边区域的数据做attention;详细的网络架构如下:
- a就是传统的attention,显然Q和K interact,得到weight;再通过weight对V的相加做加权
- b就是focal modulation:
- q的获取方式不变,核心就是右边的context aggregate了!
- context aggregate见C图:
- 原始的image input经过light-weight linear得到了gate,这个gate本质就是权重,决定了每一层context能有多少信息被保留和丢失
- 原始的image input经过linear后初步提取特征,然后通过3层的conv提取特征,越往上层级越大,感受野也就越大,信息越”浓缩“!每层的特征颗粒度不同,这些特征信息被采用的weight也不同;
总的来说,这种思路也是只在局部空间做attention,每层的attention权重也是动态学习得到的;原论文给了最后一层结果的可视化,展示如下:我个人觉得效果挺好的,真正学习到了核心的object
5、上述所有方式做attention时的时间复杂度无一例外都是O(N^2);即使通过减少token/patch数量、稀疏化、局部化等方式,优化的都是计算量,但时间复杂度并未改变,attention这种矩阵乘法的时间复杂度能不能降低到linear了?
- 最左边的就是经典、传统的attention,时间复杂度是O(N^2);
- 中间是改动的attention:去掉了softmax(减少了指数计算),增加了relu,只保留大于0的数
- 最后边利用了矩阵乘法的结合律,让KV先乘,再乘以Q,计算复杂度突然降低到了O(N),是不是感觉有点倒反天罡了?
现在具体分析一下时间复杂度降为linear的原因:
- n*d和d*n形状的矩阵相乘,计算次数为:(d*n)*n,也就是(n^2)*d;所以左边和中间attention计算复杂度是O(n^2)
- n*d和d*d形状的矩阵相乘,计算次数为:(d*d)*n,也就是n*d^2;所以右边和中间attention计算复杂度是O(n)
这里最核心的就是参数d了:d是vector的维度,是可以人为设置可控的。而n是token数,是由训练语料决定的,一般都不小;这里如果把d设置小一点,或者说d<<n,是不是最右边的复杂度远低于左边和中间的了?这个思路和lora微调是不是完全一样了?
整个完整的网络架构如下:
为了降低复杂度,把d减小,导致embedding承载的信息量减小;同时也去掉了softmax,进一步减少了非线性的表达,所以为了弥补信息丢失,作者又增加了3*3和5*5的conv提取不同颗粒度的特征!
6、采用同样的思路,又出现了Agent Attention: On the Integration of Softmax and Linear Attention论文:核心是在原来QKV的基础上加上agent矩阵降维,减小O(N^2)的复杂度,降低至linear!图示如下:
怎么样?是不是和第5个换汤不换药啊?
尽管agent注意力受益于低计算复杂度和高模型表达性但作为广义的线性注意力,它也受到特征多样性不足的影响。作为补救措施,作者采用深度卷积(DWC)模块来保持特征多样性。图示如下:
参考:
1、https://www.bilibili.com/video/BV18E421V7SN?spm_id_from=333.788.videopod.sections&vd_source=241a5bcb1c13e6828e519dd1f78f35b2