重读经典-EfficientNet

EfficientNet也是以前看过的一篇文章的,当时主要看了网络结构,对于文章的思考并没有很深入,这次重新看一下,加深一下对于文章的思考。


作者:Google

论文链接:https://arxiv.org/abs/1905.11946

开源代码:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet


Model Scaling

本篇文章的重点是Model Scaling,至于Efficientnet只是作者在思考model scaling顺带的产物。

那么什么是Model Scaling,简单来说就是模型扩容,比如;resnet18,resnet50,resnet101,resnet201适用于不同场景的任务,使用resnet18去分类imagenet,那么肯定效果不会很好,使用resnet201放到手机上,那也很可能会卡死。

模型scaling的方法目前来看,三个方向比较主流,深度,宽度,和图像分辨率。深度的代表就是resnet, 宽度的代表就是mobilenet,图像分辨率我们知道增大分辨率一般都是有效的。在以前的方法中,往往是从这三个中的一个角度出发,来改变模型的scaling,但是这样做其实是存在一定的瓶颈的,作者在实验中也证实了这点。如下图所示,在达到80%之后,提升就变得缓慢了。

在这里插入图片描述

下图便是model scaling在三个角度的说明。

在这里插入图片描述

但是我们是否可以有个简单方法,可以同时改变三个角度,进而达到更好的精度与速度吗?

这个问题,作者也解释说,完全的平衡深度宽度和分辨率是很难的,但令人兴奋的是,我们可以采用一种简单的方式,使用固定的比例来得到简单的平衡,也就是本文的创新点了,作者管它叫做compound scaling method

那么作者是怎么做的呢?

首先,作者对这个任务进行了定义,如下:

其实这个问题就是个最优化问题,在有限的memory以及flops的条件下,最大化accuracy,公式如下:

在这里插入图片描述

但是因为每层都可以进行三个维度不同的放大缩小,如果我们不加以控制scale的比例,那么这个搜索空间就非常大了,不可能搜索出来的。

那么作者的compound scaling method是怎么做的呢?作者假设了深度、宽度、分辨率都是按照固定比例进行scale的,比如我们想提高 2 n 2^n 2n比例,那么深度宽度分辨率可以按照 α N \alpha_N αN, β N \beta_N βN, γ N \gamma_N γN进行扩大, α \alpha α, β \beta β, γ \gamma γ是一个常量。定义到这,这个问题是不是变得简单了很多,我们只要通过一些方法找到最合适的 α \alpha α, β \beta β, γ \gamma γ,就可以了。

为什么可以做这个假设呢?其实作者也是通过经验主义得到的,在我们的经验中,输入一张大的图像,一遍来说都需要更深的网络来提升感受野以及更多的channel来提取更细节的特征

作者对这个问题进行了数学抽象:

在这里插入图片描述

解释一下这个公式,首先宽度和分辨率使用了平方,因为宽度和分辨率变为了2倍,flops会变为4倍,你可能会疑惑宽度为什么是4倍,因为输入输出都变宽了,所以就变为了4倍。而 α ∗ β 2 ∗ γ 2 = 2 \alpha*\beta^{2}*\gamma^{2} = 2 αβ2γ2=2怎么讲,这里主要是作者想模型按照2倍的尺度进行增长。所以我们只要计算出 α , β , γ \alpha ,\beta,\gamma α,β,γ这三个变量,那么这个问题就解决了。

最后通过grid search(其实就是穷举)得到这三个常量的。

到这里model scale部分就介绍完了。

EfficientNet

为了更好的展示效果,作者需要一个比较好的baseline网络,这里作者采用NAS方法,对网络的accuracy以及FLOPS进行优化,作者以FLOPS进行搜索,而不是时延,主要因为作者想忽略硬件的影响,得到一个纯净的网络。得到了efficient。结构如下:

在这里插入图片描述

有了基础网络EfficientNet-B0,以及模型scale的方法,就可以duangduangduang生成一系列模型了EfficientNet-B0,B2…B7…B100

实验

1、该方法作用在resnet以及mobilenet的效果

可以发现,组合比例确实还是有效果的。

在这里插入图片描述

2、efficientnet的效果

在这里插入图片描述

如下是efficient在flops以及params的结果。

可以看到Efficient-B3与resnet50的FLOPS几乎相同的,但是精度却高了一大截。

在这里插入图片描述

在这里插入图片描述

总结

本文的创新点主要有两个,一个是设计了EfficientNet,另外更为重要的是探索了model scaling的方法,如何在模型的深度、宽度以及分辨率上找到最好的scaling变量,虽然作者在探索这三个变量关系的时候,限制了很多因素,但是基于此也得到了很好的效果,说明这里的探索空间其实还是很大的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章