07 EfficientNet: Rethinking Model Scaling for CNNs
SiLU activation
CNNs:通常是在给定的资源预算下进行改进,然后当拥有更多资源之后,再进行扩大规模。
本文:要提高性能,三种维度的扩大都很重要——>怎么扩大呢(propose a principled method)
Introduction
提升准确度的方法:扩大CNN的规模。比如扩大深度、宽度以及图片分辨率
之前的很多工作,一般都是挑一个方面来进行扩大。虽然也可以同时扩大其中的两到三个维度,但这种扩大一般需要很复杂的人工操作(不太容易找到准确的值,因为这样做需要搜索的域挺大)
本文关注的问题:有没有一种标准性的/原则性的方法,来扩大网络的规模,而不是依靠人工繁琐的调整?
文章发现:要很好地提高网络性能,网络的深度、宽度还有输入图像的分辨率都很重要,不能只单纯地考虑其中一两种,应该要同时扩大这三个维度的规模。而且这三个维度的大小,是可以按照确定的比例来提升的,不需要通过繁琐的人工调整来实现,也就是提出了一种很简单但是很有效的扩大CNN的方法
通过这种思想扩大网络规模,可以使得在达到同样性能时,参数量和计算量显著少于别的网络结构。
Related Work
ConvNet Accuracy
随着网络大小的提升,准确率也在显著提升,但现在的情况是,太大了,有点触碰到硬件资源的上限了,所以接下来考虑性能提升的时候,也要考虑efficiency的问题了,要用更有效率更节省的方式扩大网络的能力。
研究显示:为了ImageNet而设计的很好的模型,往往在别的数据集上、别的任务上的效果也不错
ConvNet Efficiency
很深的CNN似乎被过度参数化了,也就是说,参数不必要的多了,可以有更好的方式采取更少的参数。
有研究就是在可以接受的范围里,用准确度换效率(MobileNet,ShuffleNet)
neural architecture search:效果比手工设计的要好,但主要应用在小型的模型上,在很大的模型上的应用还不清楚(这也是这篇文章要探索的一个点)
Model Scaling
Resnet: 通过调整长度
MobileNet: 通过调整宽度
Neural Architecture Search
强化学习的一个应用方向,AutoML
目标:找到一个合适的网络结构,达到更好的泛化性能
MNasNet:应用于移动端的神经网络架构搜索方法。提出分解的层次搜索空间,这样可以使得层在存在结构差异的同时很好地平衡灵活性和搜索空间大小,即在保持层多样性时,搜索空间也能够保持很简洁。使用多目标优化方法,在搜索时融入模型在设备上的耗时,这样可以兼顾准确率和耗时。
Compound Model Scaling
Problem Formulation
之前怎么优化网络:从layer上下手,想着要去找最好的layer结构,比如说加上skip connection之类的
现在:增加layer的层数、宽度、图像的分辨率,但是不改变之前的layer的baseline。也就是说,之前是用的resnet的连接方法,现在的layer里面就还是resnet的方法,只是单纯多重复几个layer或者在layer里面多加一些通道。这样子可以用来搜索优化的空间就会简单很多,局限在上面提到的几个维度。但是这几个维度还是比较难确定到底怎么个优化法的,比如说不同的layer的深度可以被不同程度的增加。文章就提出,要让这些层被以一定的比例同样地增加,比如说所有层的深度都扩大两倍,宽度都扩大两倍。
也就是说,优化目标是:
这里的最优的d,w,r是互相影响的
Scaling Dimensions
depth: 模型越深所可以捕捉到的特征就越多越复杂。但会遇到梯度消失的问题(skip connections,bn)
width: 主要是在小模型上用,模型更宽可以捕捉掉更细粒度的特征而且更好训练。但太宽而浅的模型会不太好捕获到高层次的特征
resolution: 图片分辨率越高越能捕捉到细粒度的特征
问题是:上面几个方法都有一个问题,确实是可以提升性能,但是会遇到gain diminish,也就是说一开始提升效果很好,但是会到达“天花板”,再怎么扩大也不会有更好的效果了
Compound Scaling
上面几个方法不是孤立的。比如说图片分辨率高了,那增加深度就很自然,因为这样我可以在更大的感受野捕捉特征,其中图片更大pixel的数目越多。增加网络的宽度也很自然,因为图片更大我可以捕捉到更细粒度的特征。
所以说与其如只增加一个维度,还不如结合起来都增加一些,效果更好更有效率
优化目标变成:
其中αβγ是通过grid search学到的,Φ是我自己定的。FLOPS的增加量大约为2^Φ倍
EfficientNet Architecture
baseline model有两种:应用到现有的网络上,应用到通过强化学习学出来的EfficientNet上
其实直接搜索αβγ的最优值是可以的,但是在大模型上这样操作代价就太大了
Experiment
性能差不多的情况下,参数显著更少,计算量也更少。也就是说明,扩大规模的时候增加的参数是很有用、比较少被浪费掉的,不是那种明明性能提升接近天花板了还徒劳增加的参数
注意:不仅仅要通过实验说明使用这个方法扩大网络规模是有效的,还要说明是这种方法才是最有效的,性能的大幅提升不仅仅是因为扩大了网络规模(因为之前的很多工作也是在扩大),更重要的是文章里提出的方法是更优越的。
为什么这种复合扩大方法更优越?具有符合缩放的模型往往更侧重于具有更多对象细节的相关区域,而别的模型要么缺少对象的细节,要么无法捕捉到所有的对象(activation map)
,更重要的是文章里提出的方法是更优越的。
为什么这种复合扩大方法更优越?具有符合缩放的模型往往更侧重于具有更多对象细节的相关区域,而别的模型要么缺少对象的细节,要么无法捕捉到所有的对象(activation map)