摘抄:为什么有的神经网络加入注意力机制后效果反而变差了?

Posted UQI-LIUWJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了摘抄:为什么有的神经网络加入注意力机制后效果反而变差了?相关的知识,希望对你有一定的参考价值。

添加注意力不起作用无外乎两个原因,一是代码错误,二是注意力不适合。代码错误就不说了,需要注意激活函数,残差连接等。

而注意力不适合,需要明白:

(1)注意力本身就是一种特征,通过附加到源特征上,实现一种类似特征增强的效果,因此从原理上讲,添加注意力,即使结果不变好,也不见得变差,但实际却经常遇到结果变差的情况(原理上学不到全部置0就跟没添加一样了,但现实网络学习不会将其全部置0,因此会出现学不好就变差的情况);

(2)换一种说法,注意力是一组权重,权重附加到特征上,有增强的也有不增强的,当大量权重附加都达到增强效果,而只有少量特征造成负面影响,注意力就整体上增强了。这也是我们常说的注意力强化有用特征而弱化无用特征的作用,但其实鬼知道它强化的是什么特征,它也不可能强化的都是有用特征

(3)注意力的提升是不明显的,注意力的增强效果是多层堆叠的整体效果。注意力与网络层的数量是正相关的。

理解了注意力是什么,注意力通过什么方式增强网络,注意力怎么变得更强,也自然明白为什么添加注意力没有效果?或效果变差了?

该学的没学习到:

(1)自己设计时,理论很完美,但神经网络归根结低是个黑盒,它不一定能按照个人的意愿来走;

(2)注意力层数过少,增强效果不明显,网络有很多参数需要学习,冗余参数更不下少数,效果不明显导致结果变化很正常,即使换个随机种子结果也会变化呢;

(3)过拟合太严重,过拟合时给网络添加任何组件时都有可能时导致结果变差

针对这些特定领域、特定任务下有突出效果的注意力机制,在应用与自己模型时,特别要注意任务适不适合,原始设计目的是否符合自身的需求?比如说,你想用self-attention,就要知道self-attention的目的是建立大的全局感受野,那么对于只有局部信息或者引入全局信息会引起歧义的情况下,就不应使用它。

再如nonlocal attention默认是建立时间前后维度的联系,将其应用与图像时就需要单独的注意设计。

 

位置不合理:包括注意力提取的位置和注意力施加的位置

还是拿resnet来说,SE、CBAM这些注意力为什么不添加到网络的开头和结尾?

从结构上看,CBAM包括一个空间和一个通道注意力,两者主要都是利用全局平均池化将特征抽象到一系列点注意力权重,然后建立这些权重的联系并附加到原空间或通道特征上。然后,从提取位置看,在网络的开头(如图像级)提取,从RGB图像提取CBAM注意力,得到的是rgb3个权重的通道注意力和整幅图像大小的空间注意力,常识能很坚定推断这是没有意义的。那么稍往后一些层也是一样的,空间特征图太大,通道数太少。提取的通道权重概括性太大没有落到一些具体特征上,提取的空间注意力由于通道数较少,概括性不足,且空间注意力敏感且难学,更容易造成负面影响。

 

那么网络靠后的层呢?为什么也不添加注意力?

将通道和空间反过来原因其实跟上面是一样的,太靠后的层,通道数过多,容易引起过拟合;特征图太小,使用卷积,操作不当反而会引入大比例非像素信息,特别地,如果特征图小到1*1,那注意力就变成了一层奇怪的全连接层。更重要的是,靠近分类层,注意力的效果对分类结果更敏感,容易影响分类层决策。

因此,像CBAM这种注意力机制一般适用于通道与空间都比较适中的网络中间层。在这里,很多空间特征图可以代表原图的一个特征(纹理,结构,颜色等),因此可以概括为一个权重,若某些特征比较重要,那么简单地加大对应的注意力权重即可达到目的。正常情况下,注意力还会随着通道的增多而增强,这是效果的叠加的结果。

最后,每种注意力机制都需要考虑各种设计细节,包括注意力权重的产生方式、注意力的作用方式、注意力的提升原理,才能更好发挥注意力的作用。

有一种情况是和数据集有关系。注意力模块毕竟是增加了模型容量,如果增加注意力机制之前模型容量是合适的实验数据集的,那么增加后效果不做其他约束,指标降低是可能的

 

加入了注意力机制,一方面,网络结构变复杂了,更难优化。

另一方面,参数规模变大了,容易过拟合。

可能是这两个原因。

注意力机制到底work不work,可以从两个角度来解释。

 

第一个角度是模型的欠拟合与过拟合

大部分注意力模块是有参数的,添加注意力模块会导致模型的复杂度增加。

  • 如果添加attention前模型处于欠拟合状态,那么增加参数是有利于模型学习的,性能会提高。
  • 如果添加attention前模型处于过拟合状态,那么增加参数可能加剧过拟合问题,性能可能保持不变或者下降。

第二个角度是从模型感受野来分析

我们知道CNN是一个局部性很强的模型,通常使用的是3x3卷积进行扫描整张图片,一层层抽取信息。而感受野叠加也是通过多层叠加的方式构建,比如两个3x3卷积的理论感受野就是5x5, 但是其实际感受野并没有那么大,可以看以下文章的分析。


各种注意力模块的作用是什么呢?他们能够弥补cnn局部性过强,全局性不足的问题,从而获取全局的上下文信息,为什么上下文信息重要呢?可以看一张图来自CoConv。

 

单纯看图a可能完全不知道该目标是什么,但是有了图b的时候,指导这是厨房以后,就可以指导该目标是厨房用手套。

因此注意力模块具有让模型看的更广的能力,近期vision transformer的出现和注意力也有一定关联,比如Non Local Block模块就与ViT中的self-attention非常类似。 vision transformer在小数据集上性能不好的也可以从这个角度解释,因为太关注于全局性(并且参数量比较大),非常容易过拟合,其记忆数据集的能力也非常强,所以只有大规模数据集预训练下才能取得更好的成绩。


跑原来,再回到这个问题,注意力模块对感受野的影响,直观上来讲是会增加模型的感受野大小。理论上最好的情况应该是模型的实际感受野和目标的尺寸大小相符。

 

  • 如果添加注意力模块之前,模型的感受野已经足够拟合数据集中目标,那么如果再添加注意力模块有些画蛇添足。但是由于实际感受野是会变化的,所以可能即便加了注意力模块也可以自调节实际感受野在目标大小附近,这样模型可能保持性能不变。
  • 如果添加注意力模块之前,模型的感受野是不足的,甚至理论感受野都达不到目标的大小(实际感受野大小<理论感受野大小),那么这个时候添加注意力模块就可以起到非常好的作用,性能可能会有一定幅度提升。

对于一个简单的二分类任务,如果一个线性模型就能将他分开,那么使用更复杂的模型不仅可能会使得模型难以训练,也可能会使得最终精度下降。

适用于数据和任务的模型才是当下最好的模型。若没有出现欠拟合有没有过拟合,只是精度下降的话,说明之前的模型更适合当下的数据和任务,这个任务并不需要什么注意力结构在里面。当普通模型就能学习到区分每个类别的典型特征时,让模型再去学习注意力可能会影响模型对典型特征学习的能力,从而使得模型的性能下降。

参考内容

为什么有的神经网络加入注意力机制后效果反而变差了? - 知乎 (zhihu.com)

神经网络加上注意力机制,精度反而下降,为什么会这样呢? - 知乎 (zhihu.com)

以上是关于摘抄:为什么有的神经网络加入注意力机制后效果反而变差了?的主要内容,如果未能解决你的问题,请参考以下文章

注意力机制

注意力机制

为什么网站使用CDN加速后,网站访问速度反而变慢了?

神经网络加上注意力机制,精度不升反降?

为什么ubuntu窗口语言选择中文后,中文字体反而变丑了?

哈佛大学提出变分注意力:用VAE重建注意力机制