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

news/2024/11/29 15:22:17/文章来源:https://www.cnblogs.com/theseventhson/p/18572541

  多年前做传统的机器学习,主要用的是LR、SVM、bayes、浅层nerual network、decision tree、random forest、GBDT等,这些分类或回归模型要想AUC、ROC等指标高,最核心的就是构造特征了!为此还专门诞生了一个细分领域:feather enginering,专门研究怎么构造好的feather!就实战情况而言,换模型不换数据/特征,准确率、覆盖率等指标最多提升几个百分点,但是如果构造了好特征,准确率能提升20~30个百分点,所以要想模型效果好,feather才是最重要的,model反而不如feather重要!DNN的效果为什么好?用tylor公式把激活函数展开,就能看到特征x1、x2....xn之间的N阶组合,大量构造、产生新特征,让特征多样性

  

   2017年的一篇开山之作:attention is all you need,拉开了本轮AI热潮的序幕!从论文的名字就能看出来,attention是最核心的模块!attention的作用还是生成特征:Q和K相乘,得到权重weight;如果两个token A和B的weight大,说明语义接近,那么A token就会使用weight从B token的value尽可能多取值来改善A token自己的value embeddings,value embedding就是token最好的feather representation!  顺着这个思路,还有没有其他变体来构造更符合某些业务场景的value embedding了?

  1、仔细想想,attention机制的核心就是Q和K相乘得到权重weight,那么还有其他方法得到权重weight吗?这里以CV为例,暂时把每个pixel当成token处理,H*W就是pixel的position,channel就是pixel的embedding一旦得到了优质的pixel embedding,后续的sematic segmentation、object detection等CV常见的application都会很容易!所以现在的思路变成了:怎么让每个pixel都得到高质量的 sematic channel值了? 继续推进思路:每个pixel都有原始的channel,一般都是RGB,只有3维,维度之间的权重是一样的,完全没区分,所以很明显这些原始的channel值是不足以体现sematic语义的,现在只能考虑nerual network了:普通的NN,输入是原始的特征向量,经过多层layer转换后,得到高质量的feather,具体这些feather的每个维度代表什么,就看下游的应用怎么使用了!这个思路完全可以用来处理每个pixel的原始channel:经过多层的神经网络,最终得到一个vector,vector的每个维度都是weight权重,然后用weight vector和原始的channel相乘,就得到了pixel的sematic channel!这就是SEnet的思路,整个流程如下:  

   

  •  H*W*C的图片,先用max pooling或avg polling,把H*W压缩,得到 1*1*C的vector
  •  1*1*C 经过NN后得到weight vector,size还是 1*1*C,但此时的vector每个维度都是weight值了
  •  1*1*C和原始的H * W* C相乘,相当于把每个 pixel的channel的每个维度都乘以合适的weight,得到sematic channel

  怎么样?让每个维度乘以不同weight来改变值的思路是不是和attention的思路完全一样啊!只不过weight求解的方式不一样罢了!SEnet为了得到最终的1*1*C的weight向量,用了FC->ReLU->FC->Sigmoid4层,这4者的组合就是最优的嘛?还有改进空间嘛?这里提供一个变种的思路:

  • squeeze部分:SE是在spatial用的pooling方式,还有其他方式
    • squeeze:既然能用pooling做squeeze,为啥不试试conv、聚类、linear projection了?
    • spatial:既然能压缩H*W,为啥不试试只压缩H、W、C了?
  •  Excitation部分:
    • 局部:channel方向做conv,提取局部特征
    • 全局:channel做attention,找到全局依赖特征
    • 多尺度:多个不同size的conv kernel组合,提取多个不同颗粒度的channel特征

   2、顺着上述的思路,诞生了Selective Kernel Networks:这里使用多个size的kernel提取image特征,不同特征相加,再做squeeze,然后生成两个weight vector,再分别和以前的卷积结果相乘,最后相加,流程图示如下:

     

   和SE对比如下:最明显的区别就是split了,这里使用了两个kernel,提取不同颗粒度的特征;后期还有softmax,为合适的channel赋予更高的weight值

    

   3、继续顺上述思路:SENet和SKNets都是在channel上生成weight,但是H*W还没动静了,是不是也能想办法提取一些特征了?毕竟image种position也很重要啊,比如image的上方一般都是sky、background等,下方一般都是地面,不同的position有不同的object,所以上述网络并未充分使用position信息哦!既然如此,完全可以依葫芦画瓢,提取H * W的feather啊!CBAM:Convolutional Block Attention Module就是这么干的!

  先按照1和2的思路,提取channel的特征信息,网络结构如下:这里选择Max和Avg两种类型的pool,避免单一pool导致有用的信息丢失

  

   接着就是提取position related feather了,这次是压缩channel通道,同样使用Max或Avg pool,保留H * W信息,也就是每个pixel的channel取max或Avg

  

   上述方法同时在channel方向、H*W方向做squeeze后生成weight,然后根据weight更改原始image对应维度的特征值,那这两种特征值该怎么融合了?这里用的就是串联方式了:

  

   4、Coordinate Attention for Effcient Mobile Network Design   第3种网络结构分别在position和channel两个维度做squeeze,这还没完了,还有H * C和 W* C方向做squeeze了!做完squeeze后提取初步的feather后,再模仿2、3的方式用NN、conv等方式融合特征,整个流程如下图所示:

   

   这么来看更易懂:分别沿着H和W方向squeeze,这是融合了channel和spatial的信息,或者说将position信息嵌入了channel通道,H或W方向的长程依赖位置信息因此被保存在所生成的注意力图中

  

   5、接着4的基础上继续扩展,这次 H*W*C增加H*W的交互,这就是Rotate to Attend: Convolutional Triplet Attention Module,网络结构如下:

  

  此处有三个分支,每个分支上分别考虑了不同维度之间的交互。此外,与CBAM和SENet通过两层全连接层(先降维,后升维)来学习通道之间依赖性的做法相比,Rotate to Attend使用的是一种几乎无参数的注意万机制来建模通道和空间注意力,在不涉及降维(降维后升维会导致通道间关系的损失)的情况下建立低成本、有效的通道注意

   6、以上所有的网络架构都没有综合考虑image每个position的联系及相关性,无法自适应地整合局部特征及其全局依赖关系,于是乎又诞生了Dual Attention Network for Scene Segmentation:分别在spatial和channel两个方向分别计算sematic的依赖性,然后加权和选择性地聚合每个 position feather!废话少说,直接上图:

  spatial attention网络结构:这图看着是不是很眼熟了?怎么这么像transformer的Q*K矩阵了?conv提取局部特征,MauMul得到HW*HW,这不就是position之间的依赖么?matrix中的值如果大,说明这两个position之间的关联/依赖强;HW*HW是由HW*C  * C*HW得到了,本质还是pixel之间使用各自的channel计算相似度:比如两个pixel都是天空,那这两个pixel的channel肯定接近;但如果一个pixel是草地,另一个是天空,两个channel的距离肯定远一些

  

   上述网络架构成功地找到了image中position之间的关联关系,用学术一点的词语表述就是位置注意力模块。同样的思路换个维度,是不是还可以计算channel 注意力了?如下:

  

   这次轮到使用HW作为"桥梁中介"了,计算channel之间的距离/依赖关系;新的问题来了,两种不同方式得到的C*H*W怎么融合了?原论文作者选择了并行,两种方式分别设置了alpha和beta系数,来调整两种方式的权重,图示如下:

  

   7、第6种网络结构已经有NLP中QKV的”那味“了,这么做计算量可不小,比如256*256的image,HW*HW = 65536*65536的矩阵大小是多少?直接在整个完整的image上做attention的计算量是很大的,怎么适当减少计算量了?

SEAFORMER: SQUEEZE-ENHANCED AXIAL TRANSFORMER FOR MOBILE SEMANTIC问世了;网络结构如下:

  

  • 原始image的H*W不变,把channel看成是每个pixel的embedding,这里分别乘以Q K V三个矩阵,得到H*W*Cq、H*W*Ck和H*W*Cv
  • 上路 detail enhancement kernel:
    • 先做concat拼接,还原成image原始的形状;
    • 然后经过 3*3 conv,提取局部细节纹理特征;上路叫detail enhaucement,可能就是因为用了3*3这个小kernel
    • 最后再经过Relu、1*1 conv 最终得到H*W每个pixel中channel每个维度的weight
  • 下路 squeeze axial attention
    • 分别沿着H和W方向做squeeze,把压缩得到的二维矩阵分别做multi-head attention,这里极大减小了计算量,同时也能根据垂直方向的QK结果更新Cv的值

 

 

 

参考:

1、https://cloud.tencent.com/developer/article/2398307    11种开源即插即用模块汇总

   https://blog.csdn.net/weixin_42645636/article/details/134250476   13种即插即用的模块

2、https://github.com/northBeggar/Plug-and-Play  attention-set

3、https://www.bilibili.com/video/BV1wz421S7Ec?spm_id_from=333.788.player.switch&vd_source=241a5bcb1c13e6828e519dd1f78f35b2  

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

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

相关文章

[Vue] Vue optimization

Table of contentUse key Feeze object Use composition function (Vue2) Use computed lazy v-model v-model 保持对象引用稳定 Use v-show instead of v-if defer keep-alive 长列表优化 打包体积优化Use key Normally use key when you have v-for, and this keyshould be u…

启动第三方程序并嵌入到指定容器中

通过调用API 方法实现嵌入第三方程序窗口到指定容器 Code using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Win…

centos7定时备份mysql发送邮件

前几天搞服务器备份发邮件的功能,搞了好长时间都没调通,想必有很多人和我遇到过一样的问题,今天分享出来帮大家解决燃眉之急。我不允许还有不会的童鞋出现。安装mailx(邮件服务) yum install mailx -y编辑配置文件 vim /etc/mail.rcset from=xxx@qq.com #发信人地址 set s…

RSA2048生成及使用

RSA2048 小编最近裸辞了,以前工作中涉及到的RSA加密使用方法一直没有总结。 所以把RSA2048的密钥生成和使用方法写一写免得以后忘记(而且网上好多碎片化信息没有总结成一套)。 我选择的开源代码是包含了除N,P,Q,E,D之外还需要E1,E2,C的处理方式。其实大差不差,因为按照我的…

WPF从如何动态从本地文件加载界面

在前面的文章中,我介绍过一种报告模板的实现思路。就是用的XAML本地加载。 https://www.cnblogs.com/zhaotianff/p/18254574在另外一篇文章中,介绍了XAML是如何被转换成对象的。 https://www.cnblogs.com/zhaotianff/p/18363828在这篇文章中,简单介绍了InitializeComponent函…

Python 爬虫必备杀器,xpath 解析 HTML

最近工作上写了个爬虫,要爬取国家标准网上的一些信息,这自然离不了 Python,而在解析 HTML 方面,xpath 则可当仁不让的成为兵器谱第一。 你可能之前听说或用过其它的解析方式,像 Beautiful Soup,用的人好像也不少,但 xpath 与之相比,语法更简单,解析速度更快,就像正则…

视频调色 LUT 教程 All In One

视频调色 LUT 教程 All In One Lookup tables (LUTs) 在图像处理中,查找表通常称为 LUT(或 3DLUT),并为一系列索引值中的每一个提供输出值。一种常见的 LUT,称为颜色图或调色板,用于确定特定图像将显示的颜色和强度值。在计算机断层扫描中,“窗口化”是指用于确定如何显…

探索中国风水学与AI人工智能的融合之旅

在古老的东方智慧中,风水学一直是中国传统文化的重要组成部分。它不仅是一种哲学思想,更是一种生活方式,指导人们如何与自然和谐共存,寻求生活的平衡与和谐。随着科技的发展,人工智能(AI)技术的兴起为风水学带来了新的解读和应用方式。本文将带您走进中国风水学与AI结合…

『玩转Streamlit』--可编辑表格

之前介绍过两个数据展示的组件,st.dataframe和st.table。 今天介绍的st.data_editor组件,除了展示数据的功能更加强大之外,还可以编辑数据。 1. 概要 st.data_editor组件在数据展示和编辑中都发挥着独特且重要的作用。 首先,在数据展示方面,它的优势在于:直观性:以表格形…

【验证码逆向专栏】某多多验证码逆向分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术…

使用静态html绘制流程图

方案一使用svg<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Flowchart Example</title&g…

Vulnhub-Earth靶机笔记

Earth 靶机笔记 概述 这是一台 Vulnhub 的靶机,主要是 Earth 靶机地址:https://vulnhub.com/entry/the-planets-earth,755/#download 一、nmap 扫描 1、端口扫描 -sT 以 TCP 全连接扫描,--min-rate 10000 以最低 10000 速率进行扫描,-p-进行全端口扫描,-o ports 结果输出到…