ML 学习站
跳到正文

神经架构搜索 (NAS)

DARTS / Once-for-All / EfficientNet, 让 AI 设计网络。

50 分钟3 / 42,142
加载中...

本章介绍了神经架构搜索(NAS),一种让算法自动设计神经网络结构的技术,核心概念包括搜索空间、搜索策略和性能评估。NAS旨在解决人工设计神经网络耗时且难以适应不同任务和硬件的问题。通过自动化搜索,NAS能够根据数据分布和硬件特性生成更高效的网络结构。NAS的主要流派包括基于强化学习、进化算法、梯度可微方法和一次性训练的方法,其中DARTS和Once-for-All是两种代表性方法。DARTS通过将离散选择转化为可微操作,实现了网络权重和架构参数的联合训练,而Once-for-All则通过训练一个支持所有子网结构的超网,显著减少了部署到不同硬件时的计算需求。读者学完本章后,将能够理解NAS的基本原理,掌握主流的NAS方法,并能够在实际项目中应用这些技术来自动设计和优化神经网络结构。

神经架构搜索 (NAS):让 AI 设计神经网络

传统 CNN / Transformer 结构是人工设计的 (ResNet, EfficientNet, BERT)。NAS 让算法自动搜索最优结构, 这一章拆解三大流派。

1. 为什么需要 NAS

  • 人工设计耗时: ResNet 论文作者试了几十种结构
  • 结构差异巨大: 不同任务最优结构不同
  • 硬件感知: 同一结构在 GPU / 移动端 / FPGA 上效率差 100x
  • 数据驱动: 让模型自己适配数据分布

2. NAS 三要素

1. 搜索空间 (Search Space)
   ↓
2. 搜索策略 (Search Strategy)
   ↓
3. 性能评估 (Performance Estimation)

2.1 搜索空间

Cell-based: 整个网络由若干 cell 堆叠 (NASNet, DARTS)

Cell 内部: N 个节点, 边是候选操作
候选操作集: {3x3 conv, 5x5 conv, 3x3 depthwise, identity, ...}

优势: 搜索空间小, 可迁移到大网络

2.2 搜索策略

流派方法代表
强化学习用 RNN 生成架构字符串, 训练后 rewardNAS-RL (Zoph & Le 2017)
进化算法群体 mutation + selectionAmoebaNet (Real et al. 2019)
梯度 (可微)把离散选择变成 softmax over opsDARTS (Liu et al. 2019)
一次性超网训练一次, 子网采样Once-for-All (Cai et al. 2020)

2.3 性能评估

不能每次重新训练 → 用代理指标:

  • 训练少量 epoch 的精度
  • 在小数据集上训练
  • 用 predictor model 预测精度

Liu et al. 2019, NAS 里程碑。

核心思想: 把"选哪个 op"变成 softmax over candidate ops, 联合训练网络权重 + 架构 α。

output = Σ_{op ∈ O} (softmax(α)_op × op(input))

两类参数:

  • w: 网络权重 (常规梯度下降)
  • α: 架构参数 (梯度上升)
min_α  L_val(w*(α), α)
s.t.  w*(α) = argmin_w L_train(w, α)

实战示例 (PyTorch)

from darts import DARTS

# 搜索
searcher = DARTS(
    search_space="nas-bench-101",
    epochs=50,
    output_dir="./darts",
)
best_genotype = searcher.search()

# 评估
model = build_from_genotype(best_genotype)
model.fit(X_train, y_train, epochs=300)

4. Once-for-All (OFA)

Cai et al. 2020, MIT, 工业级 NAS。

核心: 训练一个 超网 (支持所有子网), 然后采样子网部署到不同硬件。

Phase 1: 训练超网 (一次, 占 GPU 几天)
Phase 2: 采样子网 (几秒, 无需训练)
  → 移动端: 小子网, 推理 <10ms
  → 服务器: 大子网, 精度 85%+

优势:

  • 训练一次, 部署多个硬件
  • 子网采样用进化算法, 不需再训练
  • 节省 90%+ 算力

5. EfficientNet (复合缩放)

虽然不是严格 NAS, 但代表"自动化设计"的另一思路:

深度 (d) × 宽度 (w) × 分辨率 (r) = const
φ = 复合系数

作者用 grid search 找最优 compound coefficient, 然后按比例缩放。

EfficientNet-B0 → B7 (从小到大)
精度  84%   →  87%
FLOPs  0.4G → 66G

6. 实战: 用 Optuna 搜 RNN 结构

import optuna
import torch.nn as nn

def objective(trial):
    # 搜索超参
    n_layers = trial.suggest_int("n_layers", 2, 6)
    hidden_size = trial.suggest_categorical("hidden_size", [64, 128, 256])
    dropout = trial.suggest_float("dropout", 0.1, 0.5)
    
    # 动态建模型
    model = build_rnn(n_layers, hidden_size, dropout)
    acc = train_and_eval(model)
    return acc

study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=50)

7. NAS 应用案例

任务NAS 模型效果
图像分类NASNet, AmoebaNet, DARTSSOTA on ImageNet
检测NAS-FPN, DetNASCOCO mAP 提升
分割Auto-DeepLabCityscapes SOTA
翻译Evolved TransformerWMT BLEU +1
架构搜索AutoML-Zero (Google 2020)从零发现 ML 算法

8. NAS 的局限

  1. 算力惊人: 一次搜索要 100-1000 GPU days
  2. 搜索空间设计: 人工先验决定上限
  3. 可解释性差: 搜出来的结构难以理解为什么好
  4. 泛化性: 跨数据集效果未必好

9. 工业化 NAS 实践

  • Google AutoML-Zero: 从数学运算开始搜索 (2020, NAS 前沿)
  • Microsoft NNI: 开源 AutoML 工具包, 集成 NAS
  • Microsoft Archai: 离散 NAS 框架
  • Google Model Search: 子网搜索
  • Huawei MindSpore: 端到端 NAS
# NNI 实战
from nni.algorithms.nas.pytorch.darts import DartsTrainer

trainer = DartsTrainer(
    model=model_space,
    loss=nn.CrossEntropyLoss(),
    metrics=lambda output, target: accuracy(output, target),
    optimizer= torch.optim.Adam,
    num_epochs=50,
)
trainer.train()
trainer.export()

总结

  • NAS: 让算法自动设计网络结构
  • DARTS: 梯度可微, 主流方法
  • Once-for-All: 训练一次, 部署多次, 工业首选
  • EfficientNet: 复合缩放, 实用的非 NAS 思路

下一章 AutoML 平台实战, 看 Auto-sklearn / FLAML / AutoGluon 怎么用。

章末小测验

检验你对《神经架构搜索 (NAS)》的掌握程度。

1

DARTS 核心思想是把离散搜索变成什么?

2

Once-for-All (OFA) 核心优势是什么?

讨论区(0)

加载评论中...