论文:EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

论文原作者给出的代码链接:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet

第三方实现的PyTorch代码:https://github.com/lukemelas/EfficientNet-PyTorch

1. 论文动机

        搭建神经网络时主观性其实是很强的,很多时候你是根本不知道应该搭建多少层,输入的图像高(H)和宽(W)应该是多少。所以一种通用的做法是使用文献中发表的网络结构。不过这篇文章不是讲你该怎么搭建网络结构,而是对于已有的网络,你该怎么优化它,使得它的参数和计算量最小化但是性能最优化。

       通常要想使网络性能更优,一般是从如下三个角度去调节网络结构的:分辨率(或者说是输入图像尺寸)、每一个卷积层的channel数(也就是本文所说的width, 注意不要和图像的宽度搞混淆了)以及卷积层的数目(也就是网络的深度 depth)。作者展示了单一调节这三个量的效果,如下图1所示:

图1. 左图是单独调节网络宽度width(即channels), 中间图是单独调节网络深度depth, 右图是单独调节网络的分辨率。

可以看到,单独调节这些量,最终在精度达到80%时,模型的精度提升很缓慢了,几乎是进入饱和了。或者按照原文所说的,调节这些量则对于大的网络,精度的增益减少了。

那如果不是单独调节这些量,而是做多维度的scaling,也即同时调节这些量会是什么效果呢?作者就给出了如下图2所示的手动调节这些量的效果:

图2.手动调节网络的宽度(w),深度(d)和分辨率(r)后的结果。
不同颜色的线条代表不同的模型,同一线条上不同的点代表不同的网络宽度(w).

       可以看到,同时调节网络的宽度,深度和输入图像分辨率可以使模型性能更优,可以突破单一参数变化时的模型精度,说明多维度的scaling是很有效的。那么该怎样去用一种自动的方法来找到这三个参数的最佳组合,使得网络最优化呢?这就是本文所要解决的一个问题。

2.论文解决方案 (compound scaling method)

       对于卷积神经网络的某一层 iY_{i}= \mathfrak{F}_{i}(X_{i}), 其中 X_{i} 是输入到第 i 层的张量,其大小为<H_{i}, W_{i}, C_{i} >,这里为简便起见,忽略batch size;\mathfrak{F_{i}} 表示一个卷积操作,Y_{i} 表示第 i 层的输出张量。对于一个完整的卷积网络\textit{N}(共k层),其可以用数学公式表达为:

事实上,很多卷积层可以被分配到不同的stage中,在每个stage中,这些卷积层有着相同的结构。因此一个卷积网络又可以被写成为如下形式:

\mathfrak{F_{i}^{\mathrm{L_{i}}}} 表示在stage  i (注意不是第 i 层卷积), 基础网络层\mathfrak{F_{i}} 层被重复了 \mathrm{L_{i}} 次。那么本文所要做的就是通过多维度scaling, 也即同时调节网络的宽度(w), 深度(d)和分辨率(r) 来最优化网络精度,即:

因此,这篇文章所要做的就是找到合适的d, w 和 r, 使得网络的精度最优。那么该怎么找到d, w和 r 呢?本文给出了如下方法:

定义复合系数 \phi,以及三个参数(常数值)\alpha\beta 和 \gamma,使得满足如下关系:

        这里的 \phi 根据需求由人工来选择的,可以选为1,2,3..., 本文一直选到8。而其它三个参数\alpha\beta 和 \gamma是通过格点搜索法(grid search)获得的。也就是选定一组\alpha\beta 和 \gamma参数值,训练一个网络,然后比较所有的这些网络的精度,挑选出精度最高的网络所对应的的这三个\alpha\beta 和 \gamma的值。 不过这个需要有强大的硬件支持,Google有条件做,但普通公司很难去做这种事。

          在用格点搜索法时,作者将 \phi 设为1,这样求得的 \alpha =1.2\beta =1.1\gamma =1.15。这样得到的网络称为 EfficientNet-B0, 在求EfficientNet-B1 ~ EfficientNet-B7时,\phi 取为2 ~8,而\alpha\beta 和 \gamma一直设为\phi 取1时的值。在本文中,作者使用的主干网络(backbone )为MobileNets 和 ResNets.

3.论文结果

       本文的这个方法的最大的好处是,在保证模型精度非常高的条件下,模型的参数量和计算量要比同级别精度的模型低好几倍。比如,EfficientNet-B7在ImageNet数据集上的top-1和top-5的精度分别为84.4%和97.1%, 是论文发表时的最高分数,但是它比现有的模型小8.4倍,模型推断时的速度比现有的模型快6.1倍。下表以及图3和图4展示了本文在ImageNet上的结果,其他更多的结果请参考原文。

 

图3

 

图4

 


4.部分细节说明

(1)模型的深度d变为原来的2倍,则总的计算量也变为原来的2倍。模型的分辨率变r为原来的2倍,则总的计算量也变为原来的2倍。这是可以理解的。比如d为原来的2倍,说明stage也扩展为原来的两倍。r 为原来的2倍,说明输入图像的高和宽也都是为原来的2倍,这样计算量就是原来的4倍了。

         那么该如何理解网络宽度w为原来的2倍,计算量就是原来的4倍呢?这是因为输入输出通道都变成原来的2倍了,所以在计算量方面相当于4倍。具体可以这么理解:这里不以stage为例,只以单个卷积层为例。由于w为原来2倍,那么每一个卷积层的channel数都为原来的两倍,这样第i层的channel为原来的两倍,那么卷积核的“channel”也得是原来的两倍,由于第i+1层的channel为原来的2倍,那么第i层所需的卷积核数目也得是原来的2倍,才能使得生成的第i+1层卷积层的通道是原来的2倍。也就是4倍是来自于每个卷积核的通道增加为原来的2倍和每一个卷积层总的卷积核数目是原来的2倍,两者相乘就是4倍。

(2)模型的计算量的变化是由于d, w和 r的变化造成的,也即计算量正比于 d\cdot w^{2}\cdot r^{2} ,也即正比于\left ( \alpha \cdot \beta ^{2}\cdot \gamma ^{2} \right )^{\phi },文中作者把

\alpha \cdot \beta ^{2}\cdot \gamma ^{2} \right\approx 2是为了使得\phi取不同值时,模型的计算量的增加近似满足2^{\phi }倍。我想应该也可以设置为3,4,5等等,不过这样计算量增加的太大了点。

(3) 可能大家有这样的困惑,\alpha, \beta, \gamma 的值都是大于1的,那么相应的d, w, r都要比主干网络大,那么得到的EfficientNet应该要比主干网络大,那怎么能说更高效呢?我的理解是这样的:文中在得到EfficientNet-B0时,的确是比它的主干网络大,在论文的表1中,它用的主干网络是“mobile inverted bottleneck MBConv”, 但是我们和其他网络在对比性能的时候是按照模型的精度和FLOPS同时对比的,将模型精度差不多的几个网络和EfficientNet一起对比,而这几个网络很可能就不是这里的主干网络了。例如,从上表可以看出,EfficientNet-B0的精度比ResNet-50, DenseNet-169略微好一点,但是模型的参数和计算量却大大下降了,所以说是高效的。再比如EfficientNet-B3的精度比ResNeXt-101以及PolyNet略微好一点,但是模型参数和计算量也大大下降了。所以用哪一个EfficientNet和哪些其他模型对比主要是按照模型精度来划分的,就是为了说明,在精度差不多时,EfficientNet系列的模型参数量和计算量比其他模型大大下降了,体现了高效。

(4)在用格点搜索(grid search)法时, 作者并不是单单选精度最高的,而是要满足下面的公式来决定最终的这三个参数:

                                                    ACC(m) \times \left [ FLOPS(m)/T \right ]^{w}

    这里m 代表模型,T 代表target FLOPS, w = -0.07 是一个超参数,用来平衡精度和计算量(FLOPS)。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐