LLM大模型: CV领域常见attention思路变种及其作用(二)

news/2024/12/4 11:50:10/文章来源:https://www.cnblogs.com/theseventhson/p/18584358

  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了?

EfficientViT: Multi-Scale Linear Attention for High-Resolution Dense Prediction 就干了这事:https://github.com/mit-han-lab/efficientvit 、 https://arxiv.org/abs/2205.14756 ;图示如下:

  

  • 最左边的就是经典、传统的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846609.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈哈,我好像知道 Cursor 为什么叫 Cursor 了,真相竟然是。。。

最近 Cursor 太火了,到处都是 Cursor 的文章和视频。它就像一个能实时查看你代码的编程高手,可以提供建议,捕捉错误,还可以帮你重构代码。 你不用写一行代码,只需要动动嘴,它就能一顿操作猛如虎给你写一个官网、一个 Chrome 插件、一个卡密系统、一个。。。按这速度发展下…

QEMU中虚拟Linux网络配置

QEMU中虚拟Linux网络配置 baidu: 只有在ping的时候才想起我,对吗 初 刚才使用qemu测试驱动的时候,忽然发现ssh不能顺利的接入到虚拟操作系统之中,原以为是物理机资源紧张导致qemu启动变慢,结果摸鱼半天之后依然无法通过ssh访问。使用vnc接入后发现虚拟机无法上网,没有被分…

精橙FPGA,一个承接FPGA代码设计的资深工程师团队。

一、我们是谁 精橙FPGA,一个承接FPGA代码设计的资深工程师团队。 二、服务内容 面向在校学生、职场工程师等人员,提供FPGA入门指导和FPGA代码设计外包服务。 三、业务范围 主要提供Xilinx/Altera以及国产FPGA的入门指导和FPGA代码设计外包服务,包括但不限于以下内容: 3.1 F…

Vue项目访问路径加统一前缀(若依)

如果多个项目要发布至同一个域名下,或Vue项目要加项目名访问时,则可以通过域名后加统一前缀来区分及路由至指定的服务,例如同一域名下:站点A:https://www.abc.com站点B:https://www.abc.com/bbb站点B-接口API:https://www.abc.com/bbb/api Vue项目访问路径加统一前缀步骤…

ERP术语 中日英对照表

<table><tr><td>客户</td><td>Customer</td><td>得意先</td></tr><tr><td>供应商</td><td>Supplier</td><td>仕入先</td></tr><tr><td>仓库</td>&l…

2024 PyCharm安装激活使用教程 (至2099年)

Pycharm 简介 Pycharm 是一款非常强大的Python集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 要求 在开始之前,请确保您的计算机满足以下系统要求:操作系统:Windows、macOS或Linux 处理器:至少1 GHz的处理器…

想提高工作效率?试试这些实用技巧!

在现代企业的日常运营中,工作效率低下似乎已成为许多团队和项目管理中的普遍现象。无论是在软件开发、市场营销、产品设计还是其他行业中,团队成员往往面临着进度滞后、任务拖延、沟通不畅等问题,导致整体工作效率低下,影响项目的顺利推进。这些问题不仅给团队带来了很大的…

elasticsearch 学习笔记之二 常见接口

一、索引操作类 1、创建索引(PUT /索引名称) PUT /my-index-000001 请求body{"settings": {"index": {"number_of_shards": 3, //创建3个主片"number_of_replicas": 2 //每个主片都会有两个副本}} } 未指定mapping的情况下,使…

为什么Unity里的变体数和UWA工具测出来的不一样

1)为什么Unity里的变体数和UWA工具测出来的不一样2)使用TextureArray为什么会导致L1 Cache Miss率变高3)Gfx.PresentFrame耗时异常高4)AO方案中哪个更适合移动端这是第412篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家…

abb喷涂机器人维修齿轮泵电机不转了怎么办?

ABB喷涂机器人齿轮泵电机常见的故障表现有哪些?1、电机振动过大:这可能是由于电机安装不当、轴承磨损或者不平衡导致的。振动过大会影响电机的稳定性和工作效率。2、电机无法启动:这可能是由于电源故障、电机内部短路或者过载保护触发导致的。无法启动会导致生产线停工,影响…

Android 添加指定QQ或加群

原文地址: Android 添加指定QQ或加群-Stars-One的杂货小窝实际上,原理就是通过scheme来唤起手机QQ进行对应的操作 添加QQ import android.content.Context import android.content.Intent import android.net.Uri import com.blankj.utilcode.util.ToastUtilsobject QqUtils {f…

【AIX】AIX系统安装教程及相关命令

⼀、 安装教程 1、unix是从MULTICS操作系统演变⽽来,MULTICS的特征是啥?终端!咱们通过串⼝去连接IBM P740吧,⾸先得准备USB转串⼝线2、 就是这种了,按照下图连接3、连接正常后(这⾥⽤的是win10操作系统),可以在设备管理那⾥看到安装正确的串⼝(这⾥是COM3⼝)(没正确…