设计一个高性能的神经网络通常被形容为一门玄学。它需要深厚的专业知识、直觉以及大量的反复试验。如果我们能将这个过程自动化呢?这就是神经架构搜索 (Neural Architecture Search,NAS) 的愿景——自动为特定任务寻找最佳网络架构。

Zoph 与 Le (2017) 的原始 NAS 论文是一项里程碑式的成果。它使用强化学习为图像分类和语言建模任务找到了当时的最优架构,甚至超越了人类专家的设计。但代价却极其高昂: 搜索过程需要数百块 GPU 持续运行数天。例如,NASNet (Zoph 等人,2018) 使用了 450 块 GPU 运行了 3–4 天。这种资源消耗对于大多数研究人员、学生和公司来说都是遥不可及的。

核心瓶颈在于: 对于系统提出的每一个候选架构,都必须从零开始训练到收敛,才能得到一个性能评分。然后所有训练好的权重都会被丢弃,换一个新架构重新开始。这是极其浪费的。

这正是论文 《通过参数共享实现高效的神经架构搜索》 (ENAS) 切入的核心问题。作者将这种浪费视为关键痛点,并提出了一个简单却强大的解决思路: 让所有候选架构 (子模型) 共享同一组权重**。

这个想法带来了惊人的效率提升。ENAS 能够在保持与原始 NAS 相近性能的前提下,将 GPU 计算量减少超过 1000 倍,甚至可以在单块 GPU 上一夜完成搜索。这项研究不是小步前进,而是一次飞跃,让几乎每个人都能接触到自动化模型设计。本文将深入解析它的原理。


背景: 原始 NAS 及其瓶颈

要理解 ENAS 的创新之处,我们首先需要了解原始的 NAS 框架。系统包含两个主要组件:

  1. 控制器 (Controller) : 通常是一个循环神经网络 (RNN) ,通过生成一系列决策来提议新的神经网络架构,例如“使用 3×3 卷积”、“连接到第 2 层”、“使用 ReLU 激活函数”等等。这些决策定义了一个完整的子网络。
  2. 子模型 (Child Model) : 由控制器采样得到的神经网络。

整个迭代过程如下:

  1. 采样: 控制器 RNN 采样一个架构。
  2. 训练与评估: 构建该子模型,并从头开始训练至收敛,在验证集上评估性能。
  3. 更新: 将验证性能作为奖励信号,通过策略梯度方法 (如 REINFORCE) 更新控制器参数。

经过多轮迭代,控制器能够学会生成高性能网络。但每个子模型都从头训练的方式使 NAS 极为缓慢。

ENAS 的核心创新就是通过让所有架构共享参数,彻底消除了这一高昂步骤。


ENAS 的核心方法: 用一个图统领所有架构

关键观察是: 控制器可采样的所有架构,其实都可以表示为单个超图中的子图,这个超图是一个大型有向无环图 (DAG)

一个表示整个搜索空间的大型计算有向无环图,红色边构成一个采样架构。

图 2. 整个搜索空间表示为一个有向无环图 (DAG) ;红色箭头表示控制器采样得到的一个模型。

设计架构现在就变成了激活预定义 DAG 中某些节点和边的问题。每个节点代表一次计算 (例如卷积或池化操作) ,并拥有自己的权重。当控制器采样一个架构时,它只是选择了超图中的一条路径。所有架构都使用同一共享权重池,记为 \(\omega\)。


ENAS 的训练循环

ENAS 学习两组参数:

  • \(\omega\): 超图中的共享权重 (所有子模型共用) 。
  • \(\theta\): 控制器 RNN 的参数。

训练过程在两个阶段间交替进行:


阶段 1: 训练共享权重 \(\omega\)
冻结控制器策略 (不更新 \(\theta\)) 。从当前策略采样一个架构,并用一个训练数据批对其进行一步训练。梯度用于更新共享权重 \(\omega\):

\[ \nabla_{\omega} \ \mathbb{E}_{m \sim \pi(m;\theta)} \big[ \mathcal{L}(m; \omega) \big] \approx \frac{1}{M} \sum_{i=1}^M \nabla_{\omega} \mathcal{L}(m_i, \omega) \]

这里,\(\mathcal{L}(m; \omega)\) 表示带有权重 \(\omega\) 的模型 \(m\) 的损失。作者发现取 \(M=1\) 就足够——即只采样一个架构,计算梯度,更新 \(\omega\) 后立即进入下一步。


阶段 2: 训练控制器 \(\theta\)
冻结 \(\omega\)。控制器采样架构,并在验证集上评估其性能以获得奖励 \(\mathcal{R}\)。这个奖励通过 REINFORCE 算法更新 \(\theta\),以最大化期望奖励:

\[ \max_\theta \ \mathbb{E}_{m \sim \pi(m;\theta)}\big[ \mathcal{R}(m, \omega) \big] \]

使用验证数据可以避免控制器对训练集过拟合。


通过交替进行上述两个阶段,ENAS 同时获得优化的共享权重和更智能的控制器策略,从而极大加快搜索速度。


ENAS 的应用: 设计不同类型的架构

ENAS 框架具有高度灵活性;论文表明它既适用于**RNN 单元设计 (语言建模) ,也适用于CNN 设计 **(图像分类) 。


设计循环单元

在 RNN 单元的搜索空间中,一个 DAG 有 \(N\) 个节点。对于每个节点,控制器必须决定:

  1. 使用哪个之前节点的输出。
  2. 使用哪种激活函数 (tanhReLUsigmoididentity) 。

下面是一个 4 节点的示例:

设计一个包含四个计算节点的循环单元,展示了 DAG、操作和控制器的决策。

图 1. 一个循环单元示例: 左 — DAG;中 — 单元结构图;右 — 生成该设计的控制器输出。

逐步说明:

  1. 节点 1: 激活函数 = tanh。输入 = \(x_t\) 和 \(h_{t-1}\)。
  2. 节点 2: 连接到节点 1,激活函数 = ReLU
  3. 节点 3: 连接到节点 2,激活函数 = ReLU
  4. 节点 4: 连接到节点 1,激活函数 = tanh
  5. 输出: 将所有“游离端” (未作为其他节点输入的节点) 求平均——这里是节点 3 和节点 4。

当 \(N=12\) 时,该搜索空间包含约 \(10^{15}\) 种可能的单元。


设计卷积网络

1. 宏观搜索空间: 完整网络设计

控制器逐层设计整个 CNN。每一层需要指定:

  1. 操作: 选择一种计算——卷积 (3×3 或 5×5) 、深度可分离卷积、最大池化或平均池化。
  2. 连接: 选择输入的前几层 (定义跳跃连接) 。

选择的层输出会被拼接,然后再进行该层的计算操作。

控制器采样一个 CNN: 控制器输出 (顶部) ,DAG (左下) ,以及最终网络 (右下) 。

图 3. 采样得到的卷积网络: 红色箭头 = 激活路径;虚线箭头 = 跳跃连接。

这个搜索空间极其庞大——对于 \(L=12\) 层网络,有 \(1.6 \times 10^{29}\) 种可能架构。


2. 微观搜索空间: 可复用单元

受 NASNet 启发,控制器设计两种单元:

  • 普通单元 (Normal Cell) : 保持空间尺寸不变。
  • 缩减单元 (Reduction Cell) : 将空间尺寸下采样 (步长为 2) 。

这些单元按固定模式堆叠成最终网络:

普通单元 (Conv × N) 和缩减单元堆叠成最终网络。

图 4. 网络结构: 卷积单元块与缩减单元交替堆叠。

在每个单元内部 (一个包含 \(B\) 个节点的 DAG) :

  1. 选择两个之前的节点作为输入。
  2. 选择两种操作 (如 sep_conv_3x3avg_pool_3x3) ,对输入分别执行并将结果相加。

控制器通过为节点 3 和 4 选择输入和操作来设计一个卷积单元。

图 5. 单元设计示例: 上 — 控制器输出;下 — 对应的单元 DAG。

微观搜索空间规模更小,但能得到可扩展性更强的可复用结构。


实验与结果: 实践中的 1000 倍加速

Penn Treebank (语言建模)

在该数据集基准上,ENAS 发现了一个新型 RNN 单元:

ENAS 及其他方法在 Penn Treebank 上的测试困惑度结果。

表 1. ENAS 在无后处理的情况下达到了 55.8 的困惑度,优于 NAS 的 62.4。

  • ENAS 在单块 GPU 上耗时约 10 小时找到该单元。
  • 该单元 (如下图) 仅使用了 tanhReLU,并对六个内部节点取平均——与独立发现的“上下文混合” (Mixture of Contexts) 方法相似。

ENAS 为 Penn Treebank 发现的 RNN 单元。

图 6. ENAS 发现的 RNN 单元: tanh + ReLU 操作以及多条跳跃连接。


CIFAR-10 (图像分类)

ENAS 在宏观和微观搜索空间中均进行了实验:

ENAS 及其他基线模型在 CIFAR-10 上的分类错误率结果。

表 2. ENAS 以显著更少的计算量达成与 NASNet-A 相当的精度。

宏观搜索:

  • ENAS 设计的网络 (如下图) 错误率为 4.23%——与 NAS 的 4.47% 相当。
  • 搜索耗时**单块 GPU 7 小时 **(NAS 则需数千 GPU 小时) 。

来自宏观搜索空间的网络,包含分层卷积和跳跃连接。

图 7. ENAS 发现的宏观网络。


微观搜索:

  • 普通单元 + 缩减单元 (如下图) 错误率为 3.54%
  • 应用 CutOut 数据增强后:** 2.89%**——接近 NASNet-A 的 2.65%。
  • 搜索耗时:** 单块 GPU 11.5 小时**。

在微观搜索空间中发现的普通单元和缩减单元。

图 8. ENAS 在微观搜索空间中发现的单元。


控制器真的在学习吗?

两个消融实验给出了答案:

  1. 随机搜索: 随机采样的架构性能远不及 ENAS 设计的架构。
  2. 不训练控制器: 使用固定的随机控制器仅训练 \(\omega\)——性能显著下降。

结论: 训练好的控制器策略至关重要,它的确引导搜索走向了更优架构。


结论与启示

Efficient Neural Architecture Search 论文是 AutoML 领域的分水岭。通过引入参数共享,作者将 NAS 的计算量削减了三个数量级以上——从一个“谷歌级”问题变成个人研究者可承受的任务。

要点总结:

  • 问题: 原始 NAS 成本高得惊人,因为每个候选架构都需从零训练。
  • 解决方案: 将搜索空间构建成单个超图;所有候选架构都是共享权重的子图。
  • 方法: 交替训练共享权重 (\(\omega\)) 和控制器 (\(\theta\)) 。
  • 成果: 在语言建模与图像分类任务上,以减少 1000 倍的计算量达成最优结果。

ENAS 让 NAS 大众化,并引发了高效架构搜索技术的热潮。它将问题从“能否自动化架构设计?”变为“如何最高效地自动化架构设计?”,并至今仍是 AutoML 历史的重要基石。