MnasNet(2019):NAS 自动架构搜索

MnasNet(2019):NAS 自动架构搜索

导出时间:2025/11/23 20:22:54

1、研究背景和动机(MnasNet)

我们先回顾一下背景:
  1. 以前的做法(人工 + 理论指标)
  • 在 MobileNet、ShuffleNet 之前,网络基本靠 人类专家拍脑袋设计:
    • 用什么卷积?
    • 每层多少通道?
    • 多深?
  • 改进方向主要看 FLOPs(理论计算量),但这有个大坑:
    • FLOPs 低 ≠ 手机上跑得快。
    • 因为硬件(手机 CPU/GPU)有内存访问瓶颈,导致一些理论轻量的模型,实际并不快。
👉 举例:MobileNet v2 FLOPs 比较少,但在手机上推理并没有预期那么快。

如果一味减小网络,速度快了但精度掉太多;如果一味加深网络,精度提高了但速度变慢。
MnasNet 的核心动机就是:
  • 用自动化的神经网络结构搜索(NAS)方法,帮我们在“速度—精度”之间找到最优平衡,而且是真正针对具体硬件(比如手机 CPU)来优化的。

2、MnasNet 的核心创新

具体方法叫 平台感知的神经架构搜索(Platform-Aware NAS)
  • 它的主要特点:
    1. 不是人手工设计,而是让 AI(强化学习控制器)自动生成模型结构。
    2. 不是光看 FLOPs,而是直接在真手机上跑,测出每个候选模型的 真实延迟(Latency)
    3. 最后选择 精度高 + 延迟低 的模型,而不是单一优化。

3、MnasNet 的网络结构

传统 NAS(神经网络搜索)就像 在整个工厂里,每一台机器都要重新挑选(卷积方式、卷积核大小、是否加注意力…)。 👉 问题:搜索空间巨大,计算成本爆炸。

🚀 MnasNet 的新思路:分解层次搜索

MnasNet 说:别傻傻地在每个小零件上都重新选,我们 按车间(Block)来分工,让搜索更聪明!
image.png

🏭 工厂类比讲解

  1. 整个网络是一家工厂 工厂一共有 7 个“车间”(Block1 ~ Block7)。
    • 早期车间处理的是大尺寸原料(高分辨率图片)。
    • 后期车间处理的是精细零件(小分辨率但通道多)。
  2. 每个车间里有多台一样的机器(Layers)
    • 比如 Block4 有 4 台机器(Layer 4-1 … Layer 4-4)。
    • 这些机器都是同一型号,这样整个车间的风格统一,也让搜索问题更简单。
    • 如果需要缩小尺寸(stride=2),就让车间里的第一台机器负责“压缩尺寸”。
  3. 搜索任务:给每个车间选一种机器型号 对于某个车间(比如 Block4),我们要决定:
    • 用什么类型的机器?(普通卷积 or 深度卷积 or 倒残差 MBConv)
    • 零件刀片多大?(3×3 还是 5×5 卷积核)
    • 要不要加个“质检员”?(SE 注意力模块)
    • 是否需要旁边开一条捷径?(跳跃连接 identity/pooling)
    • 每台机器能处理多少原料?(通道数)
    • 这个车间要放几台机器?(重复次数 N)
  4. 块内同构、块间异构
    • 块内同构:一个车间内机器全都一样 → 好管理,减少搜索空间。
    • 块间异构:不同车间可以选不同型号机器 → 早期车间选小卷积,后期车间选大卷积,更灵活。

🧩 图里的意思

  • 图上绿色方块(Block1~7)就是车间。
  • 黄色小方块(Layer 2-1 … Layer 2-N₂)表示同一车间里重复的机器。
  • 蓝色箭头上的选项(ConvOp、KernelSize、SE Ratio、SkipOp、FilterSize、#Layers)就是我们给工厂配机器时的菜单。
  • 底部小蓝框示例(1×1 conv → 5×5 depthwise → SE → 1×1 conv → 残差)就是某个车间最终选中的机器型号。

MnasNet 的“分解层次搜索”就像是:

👉 不再在工厂里的 每一台机器上瞎选,而是 先把工厂划分成车间,再给每个车间统一选好机器型号和数量。

  • 块内机器相同 → 节省精力(缩小搜索空间)。
  • 不同车间机器可不同 → 保证灵活性(不同阶段处理不同任务)。

🔄 整体流程

image.png
  1. Controller(控制器) → 经理
    • 它的任务就是 从搜索空间里挑选一份候选模型
    • 搜索空间就像“人才市场”,有各种可能的神经网络结构(不同卷积、核大小、层数等)。
    • Controller 会“抽签”一样,采样出一个模型交给 Trainer。

  1. Trainer(训练器) → 培训班老师
    • 它接收 Controller 提供的候选模型,把它放到数据集上做训练,看看效果。
    • 训练后会测试两个关键指标:
      • accuracy(准确率):模型识别的对不对。
      • latency(延迟):模型在 真实手机上跑的速度

  1. Mobile phones(手机硬件) → 真机考核
    • MnasNet 强调 平台感知,所以不是只在电脑上测,而是直接把模型丢到手机里,测真实延迟。
    • 这样能避免模型“纸面上很快,但手机上很慢”的问题。

  1. Multi-objective reward(多目标奖励) → 综合打分系统
    • 这里就像考核工人的总分,不仅看工作质量(准确率),还要看效率(延迟)。
    • 如果模型又准又快 → 奖励高。
    • 如果模型虽然准,但很慢 → 奖励低。
    • 如果模型快,但不准 → 奖励也低。

  1. Reward 回传给 Controller(奖惩反馈) → 经理学习
    • Controller 根据奖励结果来调整“挑人策略”。
    • 就像经理从经验中学会:
      • “哦,原来在手机上用 5×5 卷积太慢了,以后少挑。”
      • “用 SE 模块虽然稍慢,但精度大幅提升,值得保留。”
    • 经过不断循环,Controller 越来越会挑模型,最后找到一个“既准又快”的最佳结构。

这个搜索算法就像是:

  • Controller = 招聘经理:负责挑选候选人(模型结构)。
  • Trainer = 培训老师:负责对候选人进行测试(训练+验证)。
  • Mobile phone = 真机面试官:直接考察候选人在真实岗位(硬件)上的表现。
  • Reward = 总分系统:把准确率和速度综合起来,打分反馈。
  • 闭环学习:经理不断从反馈中学习,最终能招到“又能干又高效”的最佳员工(最终模型)。

4、 致命缺陷:搜索开销巨大,效率低

MnasNet 用的是 强化学习(RL)+真实手机延迟测试 的搜索方式。
  • 每次 Controller 采样一个模型 → Trainer 要训练、评估精度 → 还要真机跑延迟 → 最后才能打分。
  • 这个过程要 成千上万次循环,一次搜索往往需要 几百上千 GPU 天


5、后续改进方向(怎么解决 MnasNet 的高开销问题)

1️⃣ ProxylessNAS(2019)

  • 问题:MnasNet 每次都要真机测试延迟,太耗时。
  • 改进:ProxylessNAS 提出了 直接在目标硬件上搜索,但是用了一种 延迟预测模型,不需要每次都跑真机。
  • 好处:把搜索效率提升了一个量级,训练更快,硬件友好。
👉 打个比方:MnasNet 是每造一辆赛车都拉到赛道跑一圈;ProxylessNAS 则是先训练一个“赛道模拟器”,能预测赛车的速度,这样大大节省时间。

2️⃣ FBNet(Facebook,2019)

  • 问题:MnasNet 训练每个候选模型太慢。
  • 改进:FBNet 提出 可微分 NAS(Differentiable NAS),直接把搜索问题变成一个 梯度优化问题
  • 核心思想:候选模型不再一个个训练,而是共享参数(weight sharing),用梯度下降来一步到位找到最优结构。
  • 好处:搜索效率从几百 GPU 天 → 1 GPU 天就能完成
👉 打个比方:MnasNet 是“造一辆车就训练一辆车”;FBNet 是“造一个车厂,把所有车的零件都放进去,让它们共享零件,只训练一次,就能挑出最好车”。

3️⃣ EfficientNet(Google,2019)

  • 问题:MnasNet 搜到的结构是固定的,如果要换大小(比如大模型、小模型),得重新搜索。
  • 改进:EfficientNet 提出了 复合缩放法(Compound Scaling),只用一个基础网络(通过类似 MnasNet 搜出来的),再用统一规则同时放大宽度、深度和分辨率。
  • 好处:不用每次重新搜索,一次搜索 → 一家子模型(EfficientNet-B0 到 B7)。
👉 打个比方:MnasNet 是“每次都要重新设计车子”;EfficientNet 是“设计一辆车的原型,然后通过放大缩小比例,就能得到不同排量的车型(小轿车 → SUV → 卡车)”。