想象你要盖一栋能“看懂图片”的智能大厦。这栋大厦有三处可以扩建的地方——楼层数(深度)、每层的房间数(宽度)、以及窗户的采光面积(输入分辨率)。楼层越高,大厦越能理解“这是一只手”这种抽象概念;房间越多,同一层能存放的细节特征越丰富;窗户越大,进屋的图像信息越清晰。2019 年以前,工程师们建 CNN 就像只会蛮干的包工头:想让大厦更聪明,就拼命加盖楼层,盖到 152 层发现精度纹丝不动;换个思路狂加房间,参数账单像房租一样暴涨;再把窗户全换成落地窗,结果屋里空荡荡,信息无处安放。Google 团队的 EfficientNet 则像一位懂结构力学的总建筑师:先请 AI 设计团队(神经架构搜索 NAS)画好最合理的户型(MBConv),再拿出一套“黄金比例”的复合缩放公式,让楼层、房间、窗户按比例一起长大——用更少的建材,盖出了当年最高的精度之楼。

岗位关联

对 AI 从业者而言,EfficientNet 是“如何在有限算力下榨干模型精度”的典范:复合缩放思想、MBConv 模块与 NAS 落地流程,至今仍是移动端与云端视觉任务选型时的核心方法论。

目录
  1. 可视化演示
  2. 传统缩放困境
  3. 复合缩放思想
  4. MBConv模块
  5. 网络结构搜索
  6. 模型家族
  7. 与ResNet对比
  8. 实际部署
  9. 设计哲学
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

复合缩放:深度+宽度+分辨率同步放大 总FLOPS预算翻倍时:深度*1.2, 宽度*1.1, 分辨率*1.15对比:单独缩放深度/宽度/分辨率效率远低于复合缩放约束条件:alpha * beta^2 * gamma^2 = 2总FLOPS预算翻倍时:深度*1.2, 宽度*1.1, 分辨率*1.15

传统缩放困境

小区物业想要一栋更聪明的大厦,包工头的第一反应永远是“加盖楼层”——就像家长觉得孩子成绩差就多报补习班。早在 2015 年,学界就发现把 CNN 从 18 层加到 152 层(ResNet 的壮举),确实让识别精度一路上涨。可楼盖到百层以上之后,问题来了:楼层太高,信号一层一层传上去会逐渐“失真”,顶层住户根本看不清一楼的样子——这就是梯度消失与网络退化现象。于是包工头转向“狂加房间”:每层塞上千个房间(卷积核),参数账单像房租一样暴涨,训练变得异常缓慢还容易过拟合。再后来有人提议“把窗户全换成落地窗”(把输入图像从 224×224 提到 600×600),可屋里的房间数量没跟上,信息一拥而入却无处安放,反而拖慢了推理速度。

这三种做法的本质,是只在一个维度上使劲儿。深度(层数)、宽度(通道数)、分辨率(输入尺寸),是决定 CNN 容量与计算量的三根支柱。单独加高任何一根,其他两根都会成为短板——这就是“木桶效应”。论文里对传统的单维缩放有非常朴素的数学描述:

拿深度为例,单纯把层数从 D 扩到 D×λ,短期有效,但当层数超过一定阈值,误差不降反升(ResNet 论文里著名的“退化问题”)。即使有残差连接兜底,单维加深的收益也会迅速饱和。宽度同理:通道数翻倍,参数量约翻四倍(因为卷积是输出通道×输入通道的二维组合),但精度提升却远跟不上参数膨胀。分辨率更特殊:它只改变输入的像素规模,不改变模型复杂度,但会放大所有卷积层的计算开销。三者各自为政,是 2019 年之前 CNN 缩放的主流思路,也是精度天花板的主要来源。

所以 EfficientNet 团队的出发点很朴素:与其在某一根支柱上死磕,不如研究一下这三根支柱之间到底该保持什么比例,让大厦整体协调地长高、长胖、变通透。这正是复合缩放的起点。

D′=D×λ,W′=W,R′=R\displaystyle D' = D \times \lambda,\quad W' = W,\quad R' = R
  1. 深度放大把网络层数 D 乘上倍率 λ,模型会变得更深,能学出更抽象的特征表达。
    D′=D×λ\displaystyle D' = D \times \lambda
  2. 宽度不变每层通道数 W 保持原样,意味着每层能容纳的特征种类不增加。
    W′=W\displaystyle W' = W
  3. 分辨率不变输入图像尺寸 R 也维持原样,送进大厦的细节信息量没有变化。
    R′=R\displaystyle R' = R

复合缩放思想

总建筑师发现,盖楼不是单一维度的事——楼层、房间、窗户必须配套。EfficientNet 论文最核心的洞察是:深度、宽度、分辨率这三个维度之间存在一种“协同关系”,同倍率放大三个维度,比只放大任何一个维度都更高效。就像健身不能只练胸不练腿,网络也不能只加层数不管每层的容量和输入的质量。

为了同时指挥三根支柱,作者引入一个全局缩放系数 φ(希腊字母 phi),并预设三个基准倍率 α、β、γ,表示“每让 φ 增加 1,楼高乘 α,面宽乘 β,窗户采光乘 γ”。为了让总建材(计算量 FLOPS)可控,还加了一条约束:α×β²×γ²≈2。为什么宽度和分辨率要平方?因为卷积层参数量与通道数的平方成正比,分辨率则直接作用在每一层的地板上——这两个维度对计算量的影响是二次的。

举个例子。φ=0 时是基线网络 B0;φ=1 时,深度×α、宽度×β、分辨率×γ,总计算量约为原来的 2 倍。论文通过网格搜索确定 α=1.2、β=1.1、γ=1.15 这组“黄金比例”。之后想盖多大的楼,只需要拧 φ 这一个旋钮,三种规模同时放大——这是“复合”二字的含义。

复合缩放的效果立竿见影:同样是翻倍计算量,传统单维缩放只能换几个点的精度提升,复合缩放却能稳定带来 2% 以上的 top-1 精度增益。就像同一块地皮,畸形的烟囱楼住不了几户人,而整体放大的均衡大厦,每平方米都物尽其用。

D=αϕW=βϕR=γϕα⋅β2⋅γ2≈2\displaystyle\begin{aligned}D &= \alpha^{\phi}\\W &= \beta^{\phi}\\R &= \gamma^{\phi}\\\alpha \cdot \beta^{2} \cdot \gamma^{2} &\approx 2\end{aligned}
  1. 深度缩放α 是深度基准系数,φ 是全局缩放系数,深度按 α 的 φ 次方放大。
    D=αϕ\displaystyle D = \alpha^{\phi}
  2. 宽度缩放每层通道数按 β 的 φ 次方放大,让每层能装下更多种类的特征。
    W=βϕ\displaystyle W = \beta^{\phi}
  3. 分辨率缩放输入图像分辨率按 γ 的 φ 次方放大,让更多细节能进入网络。
    R=γϕ\displaystyle R = \gamma^{\phi}
  4. 计算量约束三个系数满足约等于 2 的乘积限制,保证 φ 每加 1,总计算量约放大 2 倍而不是 8 倍。
    α⋅β2⋅γ2≈2\displaystyle \alpha \cdot \beta^{2} \cdot \gamma^{2} \approx 2

MBConv模块

有了整体施工方案,还要有好的户型。EfficientNet 的“户型”叫 MBConv(Mobile Inverted Bottleneck Convolution,移动端倒瓶颈卷积),每个 MBConv 就像大厦里的一个精装单元,麻雀虽小五脏俱全。

MBConv 里藏着三样法宝。第一,深度可分离卷积(Depthwise Separable Convolution):先对每个通道单独做空间卷积(每个房间独立打扫),再用 1×1 点卷积把通道信息融合(走廊统一收垃圾)。相比标准卷积,计算量大约降为原来的九分之一。第二,倒瓶颈结构:先把通道数 6 倍扩张(把房间先腾空变大),最后再压缩回去,这种“细-粗-细”的形状比普通瓶颈更适合移动设备。第三,挤压激励模块(SE,Squeeze-and-Excitation):相当于一个智能调光系统,它先把整层特征压缩成一个“全局亮度读数”,学出每个通道的重要性,再按重要性重新加权——让网络自己决定“这层该看脸还是该看手”。

MBConv 还内置了残差连接,也就是一条从单元入口直通出口的“逃生通道”。让梯度可以跳过中间的复杂变换直达底层,缓解深层网络的梯度消失。这就像大厦里每层都有应急楼梯,火警时(反向传播时)信号可以不绕路直接往下跑。

一个 MBConv 单元把“省参数、降计算、自适应调权、保梯度”四件事打包完成,EfficientNet 全楼都用这种精装户型。正是因为它足够高效,整栋楼才敢用复合缩放的节奏大胆长高——户型越好,越经得起放大。

y=F(x)+x\displaystyle y = F(x) + x
  1. 输入分支x 是本层模块的输入特征图,它会被原封不动地保留一份。
    x\displaystyle x
  2. 学习残差F(x) 是本层要学习的目标映射,即“在输入之上还需要补充什么变化”。
    F(x)\displaystyle F(x)
  3. 恒等跳连输出 y 等于 F(x) 与 x 逐元素相加,梯度反向传播时可以沿恒等路径直达底层。
    y=F(x)+x\displaystyle y = F(x) + x

网络结构搜索

户型图纸是谁画的?不是人类手工设计的,而是 AI 自己搜出来的——这就是神经架构搜索(NAS,Neural Architecture Search)。你可以把它想象成一个“自动设计团队”:给定一批可替换的建材零件(卷积核尺寸、扩张比、SE 开关、通道数……),自动枚举出海量的候选户型,再逐一“试住”测评精度,最后挑出精度又高、用料又省的方案。EfficientNet 的基线 B0 正是在这样一个搜索空间中,以“精度最高、同时计算量不超标”为双目标筛出来的。

这里的搜索空间比平地盖楼更聪明:Google 团队先以 MobileNet 的倒瓶颈结构为基础单元,允许 NAS 在 7×7、5×5、3×3 卷积核、不同扩张比、是否加 SE 之间自由组合。搜索的目标函数可以写成:

最终搜出的 B0 只有 530 万参数,却在 ImageNet 上达到 77.1% 的 top-1 精度,直接追平了当时动辄几千万参数的 ResNet 系模型。对工程团队来说,NAS 不是遥不可及的黑魔法:它本质上是“用算力换人力”——把设计师逐层抠结构的体力活,变成一台机器在约束空间里自动寻优。EfficientNet 把这一步做完后,后续的 B1-B7 不再需要重新搜索,而是用复合缩放公式直接放大,成本极低。

m∗=arg⁡max⁡m∈SAcc⁡(m)s.t.FLOPs⁡(m)≤B\displaystyle m^{*} = \arg\max_{m \in \mathcal{S}} \operatorname{Acc}(m) \quad \text{s.t.} \quad \operatorname{FLOPs}(m) \le B
  1. 候选结构m 表示搜索空间 S 中的一种网络结构,比如某个 MBConv 变体排成的组合。
    m∈S\displaystyle m \in \mathcal{S}
  2. 精度最大化在所有候选结构中,挑出验证精度 Acc(m) 最高的那个结构,记为 m*。
    arg⁡max⁡m∈SAcc⁡(m)\displaystyle \arg\max_{m \in \mathcal{S}} \operatorname{Acc}(m)
  3. 预算约束同时要求它的计算量 FLOPs(m) 不超过预算 B,保证搜索出来的不是“又大又强”而是“又小又强”。
    FLOPs⁡(m)≤B\displaystyle \operatorname{FLOPs}(m) \le B

模型家族

图纸定稿后,就是批量施工。B0 作为精心搜出来的地基,只动用了 530 万参数和 0.39B FLOPS。要得到更强的模型,EfficientNet 团队没有重新搜一遍,而是拿出复合缩放的 φ 旋钮,从 φ=0.5 一路拧到 φ=4,生成了 B1 到 B7 七个兄弟。

每一档的施工配方是:把 B0 的深度乘 α^φ、宽度乘 β^φ、分辨率乘 γ^φ。论文还观察到参数量大约满足下面的规律——φ 每加一,模型规模约翻一番,但精度并不是翻倍就封顶,而是持续稳定上涨。B5 就已经把 top-1 精度顶到 83.3%,B7 更进一步达到 84.3%,刷新了 ImageNet 的纪录,而它的参数(66M)居然和当年的 ResNet-152(60M)差不多——但精度高出近 6 个百分点。

家族中每个成员都有明确的“适用户型面积”:B0/B1 是紧凑小户型,适合手机;B2-B4 是中产改善房,适合普通 GPU;B5-B7 是豪华大平层,适合多卡训练和云端推理。选型时照着硬件预算挑 φ 就行,这是 EfficientNet 最让工程师省心的地方。

从 B0 到 B7,家族谱系清晰地展示了一个设计哲学:先花重金把户型设计好,再用一把标尺量产不同档位。相比之前每个模型都要从零手调,这种“一次搜索、无限放大”的思路把研发成本摊薄到了极致。

P(ϕ)≈2ϕ⋅P(0)\displaystyle P(\phi) \approx 2^{\phi} \cdot P(0)
  1. 基线参数量P(0) 是 φ=0 时 B0 的参数量,约 530 万。
    P(0)\displaystyle P(0)
  2. 指数放大参数量随 φ 近似按 2 的 φ 次方增长,φ 每加 1 模型规模约翻倍。
    2ϕ⋅P(0)\displaystyle 2^{\phi} \cdot P(0)
  3. 精度收益用翻倍的代价换来持续攀升的精度,这是复合缩放区别于单维缩放的关键收益曲线。
    P(ϕ)≈2ϕ⋅P(0)\displaystyle P(\phi) \approx 2^{\phi} \cdot P(0)

与ResNet对比

住惯了老式塔楼的工程师,难免要拿 EfficientNet 和经典 ResNet 比一比。两者最直观的差异是“同一个成绩,谁花的力气更少”。ResNet-152 以 6000 万参数实现约 78.4% 的 top-1 精度;EfficientNet-B0 只有 530 万参数,就达到 77.1%,几乎追平。而 EfficientNet-B7 用 6600 万参数拿到 84.3%,同等参数预算下精度高出 6 个百分点;反过来,要达到 84% 以上,ResNet 系模型需要把网络堆到上亿参数,并且伴随巨大的 FLOPS 开销。论文里的对比图显示,在相同精度下,EfficientNet 参数量比当时最好的 CNN 小 8.4 倍、推理计算量小 16 倍。

| 模型 | 参数规模 | Top-1 精度 |

| --- | --- | --- |

| ResNet-152 | 60M | 78.4% |

| EfficientNet-B0 | 5.3M | 77.1% |

| EfficientNet-B7 | 66M | 84.3% |

这种差距的根源不在“堆料”而在“结构”。ResNet 的核心模块是简单的 3×3 卷积加残差,设计年代早、没有专门做过效率优化;EfficientNet 的 MBConv 模板本身就是为了移动端省计算设计的,又经过 NAS 在约束下筛选,天然就是“性价比”导向。复合缩放的加入,则保证了每一份新增的参数都被三个维度均匀消化,不会出现某根支柱孤军深入导致失衡。

从工程选型角度看,这一对比传递了一个重要信号:参数多不等于精度高,结构合理加缩放策略得当,才能让算力预算花在刀刃上。这就好比两个厨师做同样的菜,一个靠猛加调料,一个靠精准火候——后者才是可持续的。

实际部署

大厦交付后,怎么入住、怎么装修,是工程师最关心的问题。EfficientNet 家族最大的好处是“丰俭由人”。不同档位的模型对应不同的硬件预算,选型时不需要重新设计网络,只需要拧 φ 这个旋钮。

移动端和边缘设备(手机、摄像头、车载芯片)算力有限、内存紧张,首选 B0 或 B1。它们体积小、速度快,配合量化(把 FP32 权重压成 INT8)和剪枝,可以轻松跑在手机 SoC 上,用于实时人脸识别、商品识别、卡证 OCR 等任务。云端和工业场景(服务器 GPU、自动驾驶训练集群)则选 B4-B7,用足够大的模型保证检测分割的精度底线。

更普遍的使用方式是“拿来主义”——把 EfficientNet 当骨干网络(backbone),接上分割头、检测头、关键点头,就变成了一个完整的视觉系统。在医学影像、工业质检这类标注数据稀缺的领域,直接加载 ImageNet 预训练的 B0-B4 做迁移学习,通常只需要几千张图就能微调出可用的模型,工作流非常成熟。

部署时还有两个实用技巧:一是按 FLOPS 预算选模型,而不是按参数量;二是先用 B0 快速跑通流程,再逐步升级到更大档位观察收益曲线,找到“性价比拐点”。这就像先样板间试住,再决定要不要买大房子,避免一上来就上 B7 把显卡和电费都烧穿。

设计哲学

EfficientNet 的故事,表面是一篇模型论文,实质上是一套“如何设计可扩展系统”的方法论。它告诉我们:当你想把一件事物做大做强时,单点突破很快会遇到天花板,系统性协同才是正道。

三个哲学关键词。第一,多维度协同:深度、宽度、分辨率不是孤立的旋钮,而是一个相互耦合的系统,任何单一维度的过度扩张都会让其他维度成为瓶颈。第二,数据驱动:B0 的户型不是人拍脑袋定的,而是 NAS 在算力约束下“以精度为唯一目标”自动搜索出来的——把设计交给数据和机器,人类专注于定义约束。第三,效率优先:从 MBConv 的省计算设计,到复合缩放的 FLOPS 封顶,整条技术链都把“每一 FLOPS 的精度产出”作为核心指标,这正是深度学习走向工程化的必然要求。

这套哲学的影响早已超出 CNN:后来的 Vision Transformer、Swin Transformer、ConvNeXt 等架构,都继承了“先搜索或设计强基线,再统一缩放”的思路;多任务学习、多模态模型中也常见“按比例分配计算预算”的复合缩放思想。可以说 EfficientNet 提供了一把通用的“算力-精度”标尺。

对学习者而言,最重要的启示是:下次遇到一个性能瓶颈时,别急着像包工头一样“再加一层”,先问一句——我的资源、数据、模型这三个维度是不是协同的?高效,不是省出来的,是设计出来的。

AI 应用场景

移动端实时识别

阶段:模型压缩与端侧部署

解决的问题:手机端人脸识别、拍照搜商品要求低延迟、小内存,传统大模型参数多跑不动。EfficientNet-B0/B1 精度密度高,量化后只有几 MB,手机 SoC 上能实时推理。

具体案例:某电商 App 用 EfficientNet-B0 作骨干接检测头,在千元机上实现 30FPS 的拍照搜商品;相比原 MobileNetV2 方案,精度提升 4 个点,包体反而小 20%。

工业质检迁移学习

阶段:迁移学习与微调

解决的问题:工厂表面缺陷样本少、标注贵,从头训练大模型不现实。EfficientNet 预训练权重迁移性好,小样本下也能快速收敛。

具体案例:用 ImageNet 预训练的 EfficientNet-B3 做骨干,对钢板缺陷数据集微调,2D 大图上达到 99.1% 召回率,仅需 8 张 V100 训练 2 小时。

AutoML架构搜索工程化

阶段:神经网络架构搜索

解决的问题:为每个新任务手工设计 CNN 成本极高,NAS 把架构搜索标准化,配合复合缩放一键生成多个算力档位的模型。

具体案例:某 AI 平台团队复现 NAS 流程,在受限搜索空间中搜出比 ResNet 精度更高、推理快 3 倍的轻量骨干,并用复合缩放公式批量产出 B0-B4 供不同客户选型。

Python 演示

python83 行
import torchimport torch.nn as nn  def compound_scale(phi, alpha=1.2, beta=1.1, gamma=1.15):    """复合缩放:返回深度/宽度/分辨率三档放大倍数"""    depth = alpha ** phi    width = beta ** phi    res = gamma ** phi    flops = (alpha * beta ** 2 * gamma ** 2) ** phi    return depth, width, res, flops  class MBConv(nn.Module):    """EfficientNet 的 MBConv 模块(简化版)"""     def __init__(self, in_ch, out_ch, expand=6, stride=1):        super().__init__()        mid = in_ch * expand        self.use_res = (stride == 1 and in_ch == out_ch)        self.expand_conv = nn.Conv2d(in_ch, mid, 1, bias=False)        self.depthwise = nn.Conv2d(mid, mid, 3, stride, 1, groups=mid, bias=False)        self.se = nn.Sequential(            nn.AdaptiveAvgPool2d(1),            nn.Conv2d(mid, max(4, mid // 8), 1),            nn.ReLU(),            nn.Conv2d(max(4, mid // 8), mid, 1),            nn.Sigmoid(),        )        self.project = nn.Conv2d(mid, out_ch, 1, bias=False)        self.bn1 = nn.BatchNorm2d(mid)        self.bn2 = nn.BatchNorm2d(out_ch)     def forward(self, x):        h = torch.relu(self.bn1(self.expand_conv(x)))        h = self.depthwise(h)        h = h * self.se(h)        h = self.bn2(self.project(h))        if self.use_res:            h = h + x        return h  class MiniEfficientNet(nn.Module):    """迷你 EfficientNet:用 phi 同时控制深度与宽度"""     def __init__(self, phi=1.0, num_classes=10):        super().__init__()        widen = lambda c: max(2, int(c * (1.1 ** phi)))        deepen = max(1, round(2 * (1.2 ** phi)))        self.stem = nn.Sequential(            nn.Conv2d(3, widen(32), 3, 2, 1, bias=False),            nn.BatchNorm2d(widen(32)),            nn.ReLU(),        )        self.stages = nn.ModuleList([            nn.Sequential(*([MBConv(widen(32), widen(64), stride=2)] +                            [MBConv(widen(64), widen(64)) for _ in range(deepen)])),            nn.Sequential(*([MBConv(widen(64), widen(128), stride=2)] +                            [MBConv(widen(128), widen(128)) for _ in range(deepen)])),        ])        self.head = nn.Sequential(            nn.AdaptiveAvgPool2d(1),            nn.Flatten(),            nn.Linear(widen(128), num_classes),        )     def forward(self, x):        x = self.stem(x)        for stage in self.stages:            x = stage(x)        return self.head(x)  if __name__ == "__main__":    x = torch.randn(2, 3, 64, 64)    for phi in [0.0, 0.5, 1.0]:        depth, width, res, flops = compound_scale(phi)        net = MiniEfficientNet(phi=phi)        total = sum(p.numel() for p in net.parameters())        out = net(x)        print("phi=%.1f depth=%.2f width=%.2f res=%.2f flops=%.2f params=%.3fM out=%s"              % (phi, depth, width, res, flops, total / 1e6, tuple(out.shape)))
目的:用 PyTorch 实现一个迷你 EfficientNet,直观演示复合缩放如何用一个 φ 同时控制网络深度、宽度与计算量预算。
  1. depth = alpha ** phi深度按系数 α 的 φ 次方放大,这是复合缩放的“深度档位”。
  2. flops = (alpha * beta ** 2 * gamma ** 2) ** phi计算量约扩大 2^φ 倍的约束来自这一行的数学关系。
  3. self.depthwise = nn.Conv2d(mid, mid, 3, stride, 1, groups=mid, bias=False)groups=mid 即深度可分离卷积的关键:每个通道独立做空间卷积。
  4. h = h * self.se(h)SE 模块按通道重要性重新加权特征,是 MBConv 的“智能调光”。
  5. if self.use_res: h = h + x残差连接让梯度有“逃生通道”,训练深层网络时不退化。
  6. widen = lambda c: max(2, int(c * (1.1 ** phi)))φ 控制宽度的缩放,beta=1.1 是论文给出的宽度基准倍率。
  7. deepen = max(1, round(2 * (1.2 ** phi)))φ 同时控制深度,alpha=1.2 决定每个 stage 里 MBConv 重复的次数。

常见误区

误区EfficientNet 不就是把网络层数堆得更高吗?深度上去了,精度自然就上去了,跟 ResNet 的路子差不多。

正解EfficientNet 的核心恰恰不是加深。B0 只有 7 个 block 深,它的关键是复合缩放——深度、宽度、分辨率三者按一份“2^φ 的预算”同步增长。单维加深的 ResNet 到 152 层就撞上收益天花板,而 EfficientNet 在三个维度都不极端的情况下刷新了 ImageNet 纪录。

为何常见:“更深网络等于更强”是 2012-2015 年 ResNet 带来的思维惯性,很多人下意识把一切精度提升都归因于层数变多。

误区复合缩放嘛,就是深度×2、宽度×2、分辨率×2,暴力等比例放大,简单粗暴。

正解如果三个维度都乘 2,计算量会变成原来的 8 倍,而不是论文中受控的约 2 倍。复合缩放先用 NAS 锁定 α、β、γ 的比例(1.2、1.1、1.15),再满足 αβ²γ²≈2 约束,φ 每加 1 整体计算量只约翻一倍。这是“有配方”的缩放,不是“无脑等比例放大”。

为何常见:复合(compound)这个词容易让人误解为“所有东西一起乘同一个数”,忽略了背后保 FLOPS 翻倍的约束条件。

误区MBConv 不就是有个残差连接的三层卷积吗?跟 ResNet 的 BasicBlock 没什么本质区别。

正解MBConv 里藏着三处关键设计:深度可分离卷积把计算量压到约 1/9;倒瓶颈结构先扩后压、用 1×1 卷积融合通道;SE 模块用全局池化加两个卷积学通道权重。它和 ResNet 块“3×3 卷积加恒等映射”的朴素结构有本质差异,是专门为移动端效率设计的精装模块。

为何常见:MBConv 也有残差连接也有卷积,外观跟 ResNet 块相似,不细看内部结构的人容易想当然。

误区NAS 要几十万美元的算力,是 Google 才能用的黑科技,普通工程师只能看看论文。

正解NAS 的核心是“在约束空间内自动搜索”,而 EfficientNet 已经开源了 B0 的结构和缩放公式,工程团队直接拿来用就好。自己从零跑 NAS 确实需要相当算力,但我们可以直接享受它的成果——就像你不需要自己造芯片,也能用上手机里的 AI。

为何常见:看到“搜索”和“百万 FLOPS”就望而生畏,忽略了模型供应链中“别人已经搜好、自己直接引用”的环节。

面试题

Q1. EfficientNet 的核心创新是什么?

单选题 · easy

  • A.把网络层数堆到千层以上
  • B.用复合缩放同步提升三维度← 正确答案
  • C.用无监督预训练替代监督学习
  • D.引入全新的自注意力机制

答案:B。EfficientNet 最核心的贡献是复合缩放——用 φ 同时控制深度、宽度、分辨率。A 是旧的加深思路;C 是无监督方向;D 是 Transformer 方向,都与 EfficientNet 的核心创新无关。

Q2. 复合缩放同时调整的三个维度是?

单选题 · easy

  • A.深度、宽度、通道数
  • B.深度、宽度、分辨率← 正确答案
  • C.层数、卷积核大小、学习率
  • D.参数量、批次大小、训练轮数

答案:B。三个维度是深度(层数)、宽度(每层通道数)、分辨率(输入图像尺寸)。A 中通道数已被宽度包含;C 和 D 混入了训练超参数,属于干扰项。

Q3. EfficientNet 的基线网络 B0 是如何得到的?

单选题 · easy

  • A.手工设计逐层调参
  • B.神经架构搜索自动发现← 正确答案
  • C.对 ResNet-152 剪枝得来
  • D.随机初始化后暴力训练

答案:B。B0 是 NAS 在受限搜索空间中以精度最高、计算量不超标为目标搜索出的帕累托最优结构。它不是手工设计、不是剪枝、更不是随机训练出来的模型。

Q4. 复合缩放约束中 αβ²γ²≈2 的直接作用是?

单选题 · mid

  • A.让参数量减少一半
  • B.控制整体计算量按 2^φ 增长← 正确答案
  • C.保证模型精度至少翻倍
  • D.让网络更容易被剪枝部署

答案:B。深度贡献 α、宽度贡献 β²、分辨率贡献 γ²,三者乘积约等于 2,使 φ 每加 1 时总 FLOPS 约翻一倍。这不是减参数、保精度或为剪枝准备的约束。

Q5. MBConv 中的 SE 模块主要起什么作用?

单选题 · mid

  • A.扩大卷积核的感受野
  • B.按通道重要性重新加权特征← 正确答案
  • C.降低输入图像的分辨率
  • D.完全替代 BatchNorm 的效果

答案:B。SE(挤压激励)先全局池化读出每通道的“亮度”,再学出一组权重对特征重新加权,本质是通道注意力。它不改变感受野、不降分辨率、也不替代 BatchNorm。

Q6. EfficientNet-B0 相比同精度 ResNet 的优势是什么?

单选题 · mid

  • A.参数更少、计算量更小← 正确答案
  • B.网络结构更简单、更容易训练
  • C.不需要任何预训练数据
  • D.在任意硬件上推理都更快

答案:A。B0 用 5.3M 参数追平了 ResNet-152(60M 参数)的精度,参数少约一个数量级。B 不对:B0 的结构其实更复杂;C 和 D 过于绝对,推理速度还取决于硬件优化。

Q7. 关于 φ=1 时的复合缩放,下列说法正确的是?

单选题 · hard

  • A.深度变为 α 倍,宽度变为 β 倍,分辨率变为 γ 倍,计算量约翻一倍← 正确答案
  • B.三个维度各乘 2,计算量变为原来的 8 倍
  • C.只有深度变为原来的 2 倍,宽度和分辨率不变
  • D.模型精度保证提升 2 个百分点以上

答案:A。φ=1 时 D=α^1、W=β^1、R=γ^1,且 αβ²γ²≈2 保证 FLOPS 约翻倍。B 是无约束的暴力放大;C 是单维缩放;D 是经验观察而非保证。

Q8. MBConv 模块包含以下哪些结构?

多选题 · mid

  • A.深度可分离卷积← 正确答案
  • B.挤压激励模块← 正确答案
  • C.残差连接分支← 正确答案
  • D.全局平均池化层

答案:ABC。MBConv 由深度可分离卷积、倒瓶颈结构、SE 注意力和残差连接组成。全局平均池化是分类头(head)里的结构,不出现在 MBConv 单元内部。

Q9. 以下哪些是 EfficientNet 参数少但精度高的原因?

多选题 · mid

  • A.复合缩放让三维均衡增长← 正确答案
  • B.MBConv 大幅降低了冗余计算← 正确答案
  • C.NAS 搜索出了更优的结构组合← 正确答案
  • D.使用了更大的私有训练数据集

答案:ABC。复合缩放解决“维度失衡”,MBConv 解决“单元低效”,NAS 解决“结构最优”,三者共同造就高效率。D 错误:EfficientNet 用的是公开 ImageNet 数据集,没有用更大的私有数据。

Q10. 部署 EfficientNet 到实际任务时,合理的做法有哪些?

多选题 · hard

  • A.移动端优先选用 B0 或 B1← 正确答案
  • B.迁移到新任务时用预训练权重微调← 正确答案
  • C.按 FLOPS 预算选择合适型号← 正确答案
  • D.任何任务都用 B7 才能保证效果

答案:ABC。B0/B1 适合端侧,预训练微调是迁移学习标配,FLOPS 预算是选型核心依据。D 片面:B7 算力要求高,在延时敏感或边缘场景反而适得其反。