点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

Attention 机制最早在NLP 领域中被提出,基于attention 的transformer结构近年在NLP的各项任务上大放异彩。在视觉任务中,attention也收到了很多的关注,比较有名的方法包括Non-Local Network,能够在时空volume中对全局的关系进行建模,获得了很好的效果。但视觉任务中的self-attention模块通常需要进行大矩阵的矩阵乘法,显存占用大且比较耗时。所以近年有许多优化self-attention模块速度的方法,这篇笔记主要讨论几篇相关方法,有错误之处欢迎指正。

Self—Attention简介

Attention 机制通常可以表达为如下的形式

其中,  为query,  为key,  为value。从检索任务的角度来看,query是要检索的内容,key是索引,value则是待检索的值。attention的过程就是计算query 和key之间的相关性,获得attention map,再基于attention map去获得value中的特征值。而在如下图所示的self-attention中,Q K V均为同一个feature map。

上图是一个self-attention模块的基本结构,输入为  , 分别通过1x1卷积获得  和  (记  )。则可以获得attention map为  。最后与  做矩阵乘法获得与输入shape想同的self-attention feature map。

在self-attention中,计算量和显存占用比较大的主要是生成attention map时的  和 最后的  两个步骤。对于64大小的feature map,  的大小为  。因此,self-attention 模块通常放在分辨率较低的网络后半段特征。

如何了优化attention的显存和计算量效率内,今天介绍的方法主要有两个方向的思路:

  • 改变attention的形式,避免直接全图attention

    • Long + Short range attention:Interlaced Sparse Self-Attention

    • 水平+垂直attention:Ccnet: Criss-cross attention for semantic segmentation

    • A2-Nets: Double Attention Networks

  • 降低attention计算过程中的某个维度

    • 降低N维度:Linformer: Self-Attention with Linear Complexity

    • 降低C维度:常用方法了,通常就是C/2 或者C/4

  • 其他

    • 优化GNL:Compact generalized non-local network

Attention形式优化

ISSA: Interlaced Sparse Self-Attention

  • 论文基本思路:这篇论文的基本思路是“交错”。如下图所示,首先通过permute将feature以一定规律打乱,然后将feature map分为几个块分别做self-attention,这样获得的是long-range 的attention信息;此后,再进行一次permute还原回原来的特征位置,再次进行分块attention,获得了short-range 的attention。通过拆解long/short range的attention,能够大大降低计算量。

  • 具体的性能表现如下图所示,可以看出,下降最明显的是显存的占用,主要是因为避免了attention过程中的大矩阵。而由于permute,divide等操作虽然不占flop,但是在inference的时候需要一定的时间,所以实际速度没有flops提升的那么多。不过总体而言,在效果没有明显下降的前提下,这个速度/显存的优化已经很优秀了。

  • 这篇文章在看的时候感觉既视感好强,后来想到这不就是hw上的shufflenet嘛。

CCNet: Criss-cross attention for semantic segmentation

  • 论文主要思路:区别与Non-Local 中的全局attention,这篇文章提出只在特征点所对应的十字上进行attention。从而将复杂度从  降低到 

  • CCNet 的具体做法是,对于  上的一个点  ,我们都可以得到对应的特征向量  ,对于这个点对应的十字形区域,我们可以从  中提取对应的特征,构成  ,针对 和 进行矩阵乘法,则可以得到attention map 为  。最后对  以同样的方式提取十字形特征并进行矩阵乘法,则可以得到最后的结果。

  • 那么如何从十字attention过渡到全局attention呢,方法其实很简单,只需要做两次十字attention,每个点就可以获得全局的信息了。

  • CCNet 的理论计算量(Flops and memory)比起Non-Local 是很有优势的。但是提取十字形特征这一步的效率可能并不是很高,论文中也并没有放出具体的代码实现。

A2-Nets: Double Attention Networks

  • 这篇论文的attention 方式看下图即可

  • 第一个 feautre gathering,可以理解为对每个channel,softmax找到最重要的位置,再去gathering所有channel上这个最重要位置上的特征;得到 CxC

  • 第二个 feautre distribution,可以理解为对每个channel,softmax找到最重要的位置,然后给每个channel的这个位置都分配一遍特征。

  • 这篇文章的attention 方式很有趣,值得仔细琢磨一下的。不过速度方面比起NL应该没有提升特别多。

Attention 维度优化

Linformer: Self-Attention with Linear Complexity

  • Attention的过程如上所说,可以看作是  ,这篇文章对N做降维,将attention 转化为  ,在K是定值的情况下,既将复杂度从  降低到了 

  • 这篇文章大部分的篇幅,是在证明这样降低维度和原来的结果是近似的,没看太懂证明部分

  • 实验部分,K取得越大效果越好,但是并不明显。即降维会非常略微地影响效果,同时非常有效地提升速度。

其他

CGNL: Compact generalized non-local network

这篇文章主要是来优化一种计算量更大的Self-attention方法:Generalized Non-local (GNL)。这种方法不仅做H W两个spatial尺度上的non-local attention,还额外考虑了C维度。因此复杂度是  。

这篇文章的主要思路是:利用泰勒展开,将  近似成了  。从而可以通过先计算后两项,将复杂度从  降低到了 

  • 这篇文章在视频理解、目标检测等任务上的实验效果都还不错,但是并没有给出速度方面的实验结果和分析。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

☆ END ☆

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

Self-Attention 加速方法一览:ISSA、CCNet、CGNL、Linformer相关推荐

  1. linux firefox严重卡顿,火狐浏览器卡顿怎么办 卡顿解决方法一览

    Firefox火狐浏览器也是小编感觉非常好用的浏览器,极少出现卡顿的情况,但遇上卡顿的情况也是比较难以解决的,因为造成卡顿的原因比较多,所以解决起来也比较棘手,但是根据Firefox火狐浏览器官网发布 ...

  2. ehvierwer登录与不登录_英雄联盟手游为什么登录不进去-lol手游进不去解决方法一览...

    很多小伙伴在玩英雄联盟手游时,发现有的时候登录不进去,那么什么原因导致的呢,怎么解决呢,别着急,今天小编给大家带来了详细的解决方法下面我们一起看看吧. lol手游进不去怎么回事 登陆问题: 卡在服务器 ...

  3. 战地1如何修改服务器地址,《战地1》服务器加入方法一览

    <战地1>发布已经有一段时间了,今天小编要为大家带来的是玩家"黑肉佐罗"分享的<战地1>服务器加入方法一览,感兴趣的玩家赶紧一起来看看吧! 战地风云系列正统 ...

  4. OpenCV resize函数源码解析——加速方法

    相信大家应该经常会用到OpenCV中的函数resize(),当我们想放大或者缩小图像的时候,会用到这个函数进行图像缩放,其中最核心的便是对图像的像素进行插值处理. 这里的插值interpolation ...

  5. Pytorch gpu加速方法

    Pytorch gpu加速方法 原文: https://www.zhihu.com/question/274635237 relu 用 inplace=True 用 eval() 和 with tor ...

  6. 海贼王热血航线正在连接服务器,航海王热血航线连接服务器失败?解决方法一览...

    航海王热血航线进不去怎么办,进不去解决方法一览,航海王与今天早上正式开服了,相信很多玩家都遇到了进不去的问题,下面小编教大家解决办法 航海王热血航线进不去游戏怎么办 原因1:网络问题 如果小伙伴们在登 ...

  7. (230)数据处理或加速方法(加速处理器)

    (230)数据处理或加速方法(加速处理器) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)数据处理或加速方法(加速处理器) 5)技术交流 6)参考资料 2 FPGA ...

  8. 逆水寒斩鸿蒙称号,逆水寒胆大包天称号怎么获得 逆水寒胆大包天称号获得方法一览...

    今天为大家带来了逆水寒胆大包天称号获得方法,感兴趣的玩家们一起来看看吧. 逆水寒胆大包天称号获得方法 逆水寒胆大包天称号是通过完成奇遇任务获得的一个奖励. 1.信马由缰 描述:恣意江湖,信马由缰.心之 ...

  9. aptitude安装出现依赖_开发函数计算的正确姿势——依赖安装方法一览

    1. 前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函 ...

最新文章

  1. python白名单验证-python脚本简单检测ip合法性并添加到白名单文件
  2. oracle数据库path,利用Path环境变量解决oracle数据库和owb工具不兼容问题!
  3. smarty中section的使用
  4. 【转】关于LoadRunner的迭代
  5. chrome/chromium浏览器的Enter passwod to unlock your login keyring
  6. 开发者都应该使用的10个C++11特性
  7. linux sed 正则转义,Linux运维云升笔记 (一)正则表达式以及文档编辑器sed
  8. python1011无标题_讲解:Python:COMP1011 Programming For The WebPython
  9. ASP XML 编程简介
  10. 解决CentOS 6 字体变成方框的方法
  11. mysql 字段内容大小写_mysql查询字段内容无法区分大小写问题
  12. matlab色差,计算CMC色差公式的matlab程序
  13. 独自封装windows 10系统详细教程(二)
  14. 惊爆Oblog4.6 的0day
  15. 拉结尔6月21日服务器维护,《拉结尔》3月5日更新公告-S6赛季降临
  16. allergro音乐术语什么意思_常见音乐术语(速度术语)
  17. java 向下转型有什么用_java向下转型,有啥作用。求解
  18. 百度Java面试题前200页和答案
  19. 搜索:搜索+优先队列
  20. 如何配置log4j2日志记录至数据库

热门文章

  1. DeepMind悄咪咪开源三大新框架,深度强化学习落地希望再现
  2. 告别低分辨率网络,微软提出高分辨率深度神经网络HRNet | CVPR 2019
  3. 110万开发者的福音,百度Easy DL商品检测专业版上线
  4. 曝贾扬清第二跳,加入阿里!达摩院或将承载中国下一个AI愿景?
  5. 2亿简历遭泄漏,到底谁的锅?
  6. TensorFlow 2.0发布在即,高级API变化抢先看
  7. 用AI帮你找工作,领英是如何做的?
  8. 10行代码实现目标检测,请收下这份教程
  9. 深入理解分布式缓存设计
  10. 深入理解 Cache 工作原理