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

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

中心思想

  • 提出了一种同时对深度,宽度,尺度(这里指的是输入的分辨率)的网络扩展(scale)方式
    • 以往的工作仅限于在width /height/resolution(input resolution)三者之一进行扩展
    • 而同时调节这几个变量又费时费力
    • 本文发现3个变量只需要同时乘一个系数就能得到比较好的效果,称为compound scale method,复合网络扩展
  • 使用了网络结构搜索的方式,得到EfficientNet作为baseline
  • 具体的用法举例:假如算力增大 2 N 2^{N} 2N倍,depth/width/resolution可增大 α N \alpha^N αN β N \beta^N βN γ N \gamma^N γN倍, α β γ \alpha \beta \gamma αβγ是通过grid search产生的
  • 这种复合扩展背后的原理是:输入更大 → \rightarrow 需要更多layer来提升感受野 → \rightarrow 需要更多的channel捕捉精细特征

网络复合扩展问题描述

  • 一般来说,像ResNet MobileNets网络回根据stage来进行划分,每个stage有相同的卷积类型(可能还会包含降采样模块)
  • 模型扩展(Model Scaling):指的是固定网络结构(Basic Block的结构,以及Stage的数目),使得网络更容易扩展,只改变每个Layer中的 L , C , H , W L,C,H,W L,C,H,W,意味着若想将网络变大,可以只调整 L , C , H , W L,C,H,W L,C,H,W
  • 为了进一步压缩搜索空间: L , C , H , W L,C,H,W L,C,H,W使用相同的扩展系数来调整
  • 因此可以将 L , C , H , W L,C,H,W L,C,H,W的搜索问题转换为:找到一个统一的缩放系数,在有限的资源(Memory, FLOPs)下,对原有的网络的depth/width/resolution进行扩展
  • depth/width/resolution进行扩展对应的收益:
    • 将网络做深,有利于学到更多复杂的信息,使得网络的任务迁移更容易。但容易出现梯度弥散的问题
    • 而对于小网络而言,惯用的方式是使用宽度的扩展,将网络做的更宽,一方面更容易学习,另一方面能够学到更多细节特征(因为特征表达空间变大了),但无法学习高层次的语义信息
    • 输入分辨率越大,图像包含越多的细节,最终的表现必然会更好
    • 但对于这三个维度而言,随着扩展程度的增大(网络变得越来越大),得到的增益将会越来越小
  • 增益越来越小的背后原因是,这三个维度往往是联动的:
    • 分辨率变大,一方面需要增大感受野,因此需要加深
    • 另一方面需要提升特征的粒度(特征表达空间),因此需要加宽
  • 基于上述的结论,这里提出了一种复合缩放的方法,使用一个复合扩展系数 ϕ \phi ϕ
    • depth: d = α ϕ d = \alpha^\phi d=αϕ
    • width: w = β ϕ w = \beta^\phi w=βϕ
    • resolution: r = γ ϕ r = \gamma^\phi r=γϕ
    • 约束: α β 2 γ 2 ≈ 2 \alpha \beta^2 \gamma^2 \approx 2 αβ2γ22,2的含义是:复合系数为 ϕ \phi ϕ,资源增加 2 ϕ 2^\phi 2ϕ倍,平方是因为宽度和分辨率这两个系数一旦翻倍,算力要求就翻4倍,是一个平方关系

EfficientNet网络结构:

  • 有了扩展方法后,关键是baseline网络的定义
  • 本文利用了优化目标 A C C ( m ) ( F L O P s ( m ) / T ) 0.07 \frac{ACC(m)}{(FLOPs(m)/T)^{0.07}} (FLOPs(m)/T)0.07ACC(m),T是目标FLOPs。这里因为没有指定硬件,所以只能用Flops衡量,而不能用Latency
  • 利用MobileNet V2中的BLock作为基本模块(并添加了SE Block,以及用),搜索出类似MNas的网络,称为Efficient-B0,具体结构如下:
    论文笔记:EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks_第1张图片
  • 有了Efficient-B0之后,若扩展系数 ϕ = 2 \phi=2 ϕ=2,通过以下的方式,对网络进行扩展
    • 对于上表中每个stage的深度(#Layers),乘以一个系数 α = 1.2 \alpha=1.2 α=1.2然后向上取整
    • 对于上表中每个stage的宽度(#channels),乘以一个系数 β = 1.1 \beta=1.1 β=1.1然后以Padding=8为基准做“四舍五入”:与8的余数大于4,就向上padding为8的倍数,否则向下padding
  • Efficient-B1对应 ϕ = 1 \phi = 1 ϕ=1,以此类推, ϕ = 1 , 2 , 3... , 7 \phi = 1,2,3...,7 ϕ=1,2,3...,7分别得到EfficientNetB1-7

EfficientNet实现:

  • EfficientNet的具体实现会和网络定义略微有不同,具体实现可以看:https://ai.googleblog.com/2019/05/efficientnet-improving-accuracy-and.html
  • 具体来说,代码实现与论文相比,在2个stage中进行了提前的降采样。下图中上部分为论文描述,下部分为代码实现
    论文笔记:EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks_第2张图片

你可能感兴趣的:(论文笔记)