细说EfficientNet

EfficientNet发布于2019年5月28日,发布之初就以其在图片分类上各种SOTA结果而惊艳整个CV届。有多惊艳,且看下图,简直是在各个角度吊打现有的算法模型,完全做到了又快又准。

那是不是作者做出了一些令人叹为观止的创新呢?非也,作者的思路十分朴素,四两拨千斤。

1. 利用NAS(神经网络搜索)搜索出一个更好的Backbone,也即上图中的EfficientNet-B0。
2. 对B0模型的宽度、深度和图片分辨率同时缩放,便得到了令人惊艳的B1-B7。

为什么简单缩放就能得到极其优异的模型呢?

这就是作者的核心创新,作者核心探讨了如何对模型的宽度、深度和图片分辨率等三个维度做缩放,可以得到最佳的性能提升。

模型缩放

当我们得到一个基础模型后,为了提高模型的复杂度,进而提高模型的性能,我们一般会对模型做适当的缩放。常用的缩放方法是
1)增大模型的宽度
也就是增加每一个卷积层的通道数
2)增大模型的深度
将每一个stage重复的单元增加多一些,如resnet50到resnet101的扩展
3) 增大输入图片的分辨率

如下图。

如果单一缩放这三个维度,模型精度都有提升,但很快都饱和了,如下图。这里有个重要问题,大家要思考,为什么饱和了?模型参数不是变多了,为啥新增加的参数不起效果?我以前阅读resnet论文时,非常疑惑为啥ResNet1000和ResNet101的性能几乎一样。作者这里就给出了部分答案,模型的宽度、深度和图片分辨率三者是互相关联的,当深度增加时,模型的宽度、输入图片的分辨率都要跟着增加才会得到最好的效果。

直观上也很好理解,当深度增加时,需要更高的输入图片分辨率,来保证感受野的有效性,也需要更宽的网络,保证能捕捉更多的特征。是不是有点拗口,反过来说可能更好理解,大分辨率的图片,需要更深的网络,来增加感受野,从而捕捉有效语义,也需要更宽的网络捕捉更精细的特征。

组合缩放系数

当计算资源增加时,如果彻底的去搜索宽度、深度、图片分辨率这三个变量的各种组合,那么搜索空间将无限大,搜索效率会非常低。

因此作者提出了组合缩放的方法:

用单一的组合缩放系数$\phi$,同时缩放宽度、深度和图片分辨率,缩放公式如上图。而深度、宽度和分辨率的缩放基数$\alpha、\beta、\gamma$,由在基准模型上取$\phi = 1$做参数搜索得到,作者在Efficient-B0上搜索的最终结果是$\alpha =1.2、\beta =1.1、\gamma =1.15$。

需要解释一下,为啥要做如下约束:

当对模型的深度、宽度和分辨率分别做$\alpha^{\phi}、\beta^{\phi}、\gamma^{\phi}$缩放时,对应的计算量,大约增加为:

这是因为当模型深度增加时,计算量成线性增加,当模型宽度和分辨率增加时,计算量以二次方增加。
因此,如果约束$\alpha \cdot \beta^{2} \cdot \gamma^{2} = 2$,则当模型深度、宽度和分辨率统一缩放$\phi$时,最终的计算量大约增加为$2^{\phi}$,这就很好计算。有了这个关系,就可以根据计算资源的变化来反推组合缩放系数$\phi$的大小。

简单举个例子,假如当前算力增加到原来的10倍,那么组合缩放系数$\phi$计算公式如下:

得到$\phi = 3.32$,然后按$\alpha^{\phi}、\beta^{\phi}、\gamma^{\phi}$缩放模型的深度、宽度和分辨率即可。

我们直观感受下B0-B7缩放的尺度。

# Coefficients:   width,depth,res,dropout
'efficientnet-b0': (1.0, 1.0, 224, 0.2),
'efficientnet-b1': (1.0, 1.1, 240, 0.2),
'efficientnet-b2': (1.1, 1.2, 260, 0.3),
'efficientnet-b3': (1.2, 1.4, 300, 0.3),
'efficientnet-b4': (1.4, 1.8, 380, 0.4),
'efficientnet-b5': (1.6, 2.2, 456, 0.4),
'efficientnet-b6': (1.8, 2.6, 528, 0.5),
'efficientnet-b7': (2.0, 3.1, 600, 0.5),

如何评价EfficientNet

EfficientNet之所以被众人所知,唯一原因就是其又快又准的SOTA结果。

而能够有如此结果,其实是组合缩放+更好的Backbone(EfficientNet-B0)双重作用的结果。而Efficient-B0是用NAS搜索出来的,这也意味着即使你和作者有相同的创意idea,如果没有足够的计算资源,你也做不出EfficientNet,作为普通的科研人员,是不是有点忧伤。

而更让EfficientNet大放异彩的是,基于EfficientNet的目标检测算法EfficientDet也屠榜,有时间我们再一起研究研究。

问题思考

这里我给出几个问题供大家思考,如果能解决,说不定能发论文。

  1. 即使是组合缩放,为什么最终的性能仍然会饱和?
  2. 对于不同的backbone,是不是组合缩放的最佳缩放基数$\alpha、\beta、\gamma$是否相同?

文献

  1. EfficientNet论文

从一个demo学习AdaBoost

前言

提升算法(boost算法)是组合多个仅比随机猜测好一些的弱学习器,形成一个性能很好的强学习器。听起来很不可思议,但已经有学者证明,一个问题可由单个强学习器学习的充分必要条件是,这个问题可由多个弱学习器组合的学习器学习。这也是提升算法可行的根本依据。

提升算法直观上也很好理解,如果多个弱学习器各自擅长解决问题的某一些互相不同的场景,那么多个弱学习器有可能比单个擅长任何场景的学习性能好,三个臭皮匠胜过一个诸葛亮。

具体怎么学习和组合这一系列的弱学习器,各个boost算法着重点不同,常用的是三大boost算法,AdaBoost、GBDT和XGBoost。

提升算法的性能取决于各个弱分类器的多样性,AdaBoost通过改变训练数据的权重,来增强各个基本分类器的多样性。

本文以一个demo为例,庖丁解牛式的学习AdaBoost。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×