https://www.bilibili.com/video/BV1264y1i7R1?from=search&seid=16907604872624656989&spm_id_from=333.337.0.0https://www.bilibili.com/video/BV1264y1i7R1?from=search&seid=16907604872624656989&spm_id_from=333.337.0.0https://www.bilibili.com/video/BV1264y1i7R1?from=search&seid=16907604872624656989&spm_id_from=333.337.0.0李沐这个位置讲的非常清楚
在我的理解里面,这里的随意是指跟随主观意识,他后面又直接提到像一般的CNN网络都属于是根据不随意线索来选择注意点,即CNN网络是根据不随意线索来对网络进行的训练,我们对网络要看什么是不会做限定的,网络自己决定先看什么再看什么
那我又可以想,这里的主观意识究竟是谁的,是人的,还是网络自己的。网络本身也是由人类来搭建的,网络所拥有的所谓的主观意识是否也仅仅是创造它的人的主观意识的反映呢??
从ZFnet中做的可视化来看,CNN网络一般是看一些浅层的信息,线条、边缘、形状,之后会出现纹理、颜色,最后才是高度具象、与要识别的类别目标高度类似的信息
那我马上就可以产生一个猜想,attention mechanism是不是要对卷积网络做一些限定,以使他根据随意线索来进行训练
query:随意线索。形象地描述随意线索就是类似于,我想读书,我的注意力就集中在书上;我想喝咖啡,我的注意力就集中在和咖啡有关的东西上
key:不随意线索。
刚才的判断有部分是对的,的确是要对CNN网络做一些限定,似乎对输入有了要求,同时更改了池化层的结构,要求池化层能够对输入进行筛选
进一步来讲,query,也就是随意线索是人为给定的,CNN在进行卷积之前需要按照给定的query对输入进行搜索。从图上来判断的话,key-value pairs这一套可能是只针对pooling.
对于这个公式,最大的疑问还是来自于,不清楚这是什么。后面给定的平均池化的公式,连加使用的是yi,那就把y当做是feature map的像素值嘛,最后输出的是f(x),一个和x有关的函数,x是什么??key??
在下面的公式里,x是key, y是value. x也是不随意线索
with-parameters pooling:
#----------------------------------------------------------------------------------------------------------------------#
#----------------------------------------------------------------------------------------------------------------------#
#----------------------------------------------------------------------------------------------------------------------#
注意力的核心目标
那么用于图像处理的transformer我估计它的encoder部分也是采用的CNN
他这里举了一个机器翻译的例子,给定的一个句子的信息是固定的。但是目标可能是不同的,达成不同的目标所需的有效信息有可能是不同的。这种新思路较之于以往那种,无论要求得到何种输出,都是使用所有信息来计算的思路要节省资源的多。比如说目标单词是杰瑞,在当前给定的条件下,有效信息或者是最重要的信息应该是jerry
贡献的注意力??一个名词??
引入注意力机制attention mechanism:
像c1,c2,c3这种语义编码器是从一开始就要设定好,这是硬编码的部分,hard code
看起来似乎对输入没有影响,每种语义编码器的输入始终还是x1- x4嘛,但是每个语义编码器的输出的结构发生了变化,进行了加权结构化
其实这样想的话,注意力机制其实是丰富了pooling操作的类型,不再只是做平均或者最大值池化
注意力机制的核心思想:
按照我现在的理解,key作为不随意线索,还不清楚它的值,而value就是送进pooling的feature map的每一个像素值
特征与目标在attention mechanism语境下表示什么呢??
处理步骤:
query表示随意线索,key表示不随意线索
这里他举了一个例子,query是人为设定的,在NLP语境下叫做目标单词,如果我们设定一个目标最终只想翻译tom这个单词,那么query就是tom。这里的key1-3就是输入的全部信息,在例子中设定的场景下,分别是tom, chase, jerry
如果映射到CNN中,query我猜是某些区域像素的坐标,而key就要映射到输入pooling的feature map的每一个像素
常用的方法包括:
计算key和query相似性的不同方法就导致了attention mechanism的不同流派
阶段1计算相似性之后会得到一个注意力得分,反映的就是key和query的相似程度。根据前面的公式,很容易可以推算得知,越相似,相应的Key的权重就需要更大
既然注意力得分的高低就直接反映了相似程度,那么根据神经网络的一贯做法,将相应的值映射到01空间上,并不会改变这些值得表征作用,反而还可以减少计算量
这一步在NLP语境下就是去构建语义编码器,实现输入输出的具体映射关系
从最后一步,最终只输出一个值来看,我觉得可以进一步做猜想:在传统的pooling操作,是不是一次也只是输出一个值,这里也只是输出一个值。因此,我有理由相信,attention mechanism是将pooling层的一次卷积操作做了改变。想想平均池化和最大值池化
在具体的计算上,他还提到,key就是value??这有点蒙,我之前猜的是query是坐标信息,那么key也应该是坐标信息,value是key表示的坐标的那个像素值
#---------------------------------------------------------------------------------------------------------------------#
#---------------------------------------------------------------------------------------------------------------------#
#关于attention mechanism在CV中的应用方法
#---------------------------------------------------------------------------------------------------------------------#
这里是使用Mobilenet作为backbone,但这些都不重要
1.将左边的feature map作为输入,首先进行一个全局平均池化。这个global average pooling是个老朋友了,这是为了进行多尺度训练而设置的一个部件。在计算时,以feature map的通道为单位,将一个channel的数据做一个平均,最终一个channel只输出一个值
这样一来,GAP之后输出的是一个1*1*channel的向量
2.步骤1的输出是一个向量,他实际上是可以直接送进FC层的。将1*1*channel的向量送进两层的全连接层,第一层使用relu激活,第二层使用hard-sigma激活。通过设计,FC层的最终输出也是一个1*1*channel的向量
3.将步骤2输出的向量作为权重,输出向量的channel数与输入的feature map的channel数是匹配的,因此将向量的权重分别去乘上对应channel位置的feature map
说实话,这个前面讲的什么随意线索、不随意线索有些大相径庭,key、query、value分别代表什么呢??
还有两个问题:(1)attention mechanism应该加在什么位置呢,我猜应该是在比较靠前的位置。(2)attention mechanism加入了FC,FC的性能衰减还是比较严重的,一般的网络中feature map的channel数一般在128-1024之间。这个FC感觉是可以通过1*1卷积来替代
#---------------------------------------------------------------------------------------------------------------------#
#---------------------------------------------------------------------------------------------------------------------#
#关于注意力机制的集中实现形式
#---------------------------------------------------------------------------------------------------------------------#
https://blog.csdn.net/weixin_44791964/article/details/110004991https://blog.csdn.net/weixin_44791964/article/details/110004991https://blog.csdn.net/weixin_44791964/article/details/110004991说一句bubbliiiing老哥牛皮不过分吧
当我们使用卷积神经网络去处理图片的时候,我们会更希望卷积神经网络去注意应该注意的地方,而不是什么都关注,我们不可能手动去调节需要注意的地方,这个时候,如何让卷积神经网络去自适应的注意重要的物体变得极为重要。
注意力机制就是实现网络自适应注意的一个方式。
人类主动设置就倾向于hard code的思维方式,在有了神经网络这种自适应工具之后,我们明显是可以利用起来的。在前文中,讲述了关于CV中attention mechanism的一种实现方式,我们可以看到为了实现attention mechanism,在网络中额外加了两层FC。这两层FC就是可以用来实现自适应的部件
一般而言,注意力机制可以分为通道注意力机制,空间注意力机制,以及二者的结合。
在深度学习中,常见的注意力机制的实现方式有SENet,CBAM,ECA等等。
SENet是通道注意力机制的典型实现。
2017年提出的SENet是最后一届ImageNet竞赛的冠军,其实现示意图如下所示,对于输入进来的特征层,我们关注其每一个通道的权重,对于SENet而言,其重点是获得输入进来的特征层,每一个通道的权值。利用SENet,我们可以让网络关注它最需要关注的通道。
我们在前文中描述的就是SENet,但是遗留了两个问题,attention模块应该设置在网络的什么位置,以及是否可以对FC进行改进以降低总体的运算量
CBAM将通道注意力机制和空间注意力机制进行一个结合,相比于SENet只关注通道的注意力机制可以取得更好的效果。其实现示意图如下所示,CBAM会对输入进来的特征层,分别进行
通道注意力机制的处理和空间注意力机制的处理。
图像为通道注意力机制,通道注意力机制的实现可以分为两个部分,我们会对输入进来的单个特征层,分别进行全局平均池化和全局最大池化。之后对平均池化和最大池化的结果,利用共享的全连接层进行处理,我们会对处理后的两个结果进行相加,然后取一个sigmoid,此时我们获得了输入特征层每一个通道的权值(0-1之间)。在获得这个权值后,我们将这个权值乘上原输入特征层即可。
注意这里使用的是全局平均池化和全局最大池化,这两个操作都是以通道为单位,不是卷积网络中用来降维的最大池化或者是平均池化
QUESTIONMARK: 学到这里,突然对这个降维产生了怀疑,降维应该是至少消灭一个维度的信息才能叫降维,pooling显然是做不到的。既然如此,池化层的作用还包括降维吗??
https://blog.csdn.net/weixin_38665509/article/details/104464078https://blog.csdn.net/weixin_38665509/article/details/104464078https://blog.csdn.net/weixin_38665509/article/details/104464078重新了解之后,池化的降维作用全程应该是特征降维。这里就体现了so called 大道至简,从最开始咱们分析为什么无法直接使用全连接神经网络处理图像任务,就是因为直接将图像的所有像素当做FC的特征的话,特征维度太高,计算量太大。而卷积网络的作用是提取通用的、深层的、高度融合的卷积特征,最后提取出的特征维度是远远低于原图的像素数量的
很明显,pooling操作降低了feature map的分辨率,一般不对通道数做改变。那么整体上就减少了特征的数量
图像为空间注意力机制,我们会对输入进来的特征层,在每一个特征点的通道上取最大值和平均值。之后将这两个结果进行一个堆叠,利用一次通道数为1的卷积调整通道数,然后取一个sigmoid,此时我们获得了输入特征层每一个特征点的权值(0-1之间)。在获得这个权值后,我们将这个权值乘上原输入特征层即可。
3、ECA的实现
ECANet是也是通道注意力机制的一种实现形式。ECANet可以看作是SENet的改进版。
ECANet的作者认为SENet对通道注意力机制的预测带来了副作用,捕获所有通道的依赖关系是低效并且是不必要的。
在ECANet的论文中,作者认为卷积具有良好的跨通道信息获取能力。
卷积卷积具有良好的跨通道信息获取能力??怎么理解。包括说卷积网络能够提取更深层、更抽象、更具有表征能力的特征??怎么理解
ECA模块的思想是非常简单的,它去除了原来SE模块中的全连接层,直接在全局平均池化之后的特征上通过一个1D卷积进行学习。
既然使用到了1D卷积,那么1D卷积的卷积核大小的选择就变得非常重要了,了解过卷积原理的同学很快就可以明白,1D卷积的卷积核大小会影响注意力机制每个权重的计算要考虑的通道数量。用更专业的名词就是跨通道交互的覆盖率。
如下图所示,左图是常规的SE模块,右图是ECA模块。ECA模块用1D卷积替换两次全连接。
将FC换成conv理解倒是很好理解,这也是一种趋势,现在很多模型,连用于最基础的分类任务的模型都已经换成了全卷积网络
只是说这种形状的卷积看起来有点别扭
这里有个新词,跨通道交互的覆盖率,如果这里滤波器的数量是1,通道数为5,则覆盖率为5,最大为输入的feature map的通道数。需要使用填充以保证attention模块输入输出的尺寸保持一致
行文至此,我有这样一个判断:
不从attention mechanism的原理来看,仅仅从其实现来看,我们希望为输出的feature map,无论那层,以通道为单位,加上某种权重。权重的数量必须和要处理的feature map相同
那么这些权重能够人为来选择吗??或者说他们可以通过网络来学习吗??
按照之前神经网络的说法,特征的权重高低是由他们自己决定的,也就是说他们自己内生的结构就决定了那些特征重要,那些不重要
因此,在这个地方基于神经网络来学习各通道feature map的权重
这是做的一些可视化
那么注意力模块怎么收敛呢??从数学上讲,添加这个模块之后,实际上改变了loss function的结构,能帮助loss进行更好地收敛,比之前更加逼近那个最优解
注意力机制是一个即插即用的模块,理论上可以放在任何一个特征层后面,可以放在主干网络,也可以放在加强特征提取网络
这就回答了我最初的疑问,根据attention mechanism的实现方法,我也认为它可以放在网络的任何位置,只要能保证他有这样一个输入就行,甚至说对于原图都可以
但是放置在主干会导致网络的预训练权重无法使用,这相当于改变了预训练权重适应的那个原始的网络模型
作者以YoloV4-tiny为例,将注意力机制应用加强特征提取网络上。
如下图所示,在主干网络提取出来的两个有效特征层上增加了注意力机制,同时对上采样后的结果增加了注意力机制
从图上可以看到,为了保证主干网络的纯净,attention machanism模块只能放在分支网络中,分支网络来负责输出最终的结果