设计一个高性能的神经网络通常被形容为一门玄学。它需要深厚的专业知识、直觉以及大量的反复试验。如果我们能将这个过程自动化呢?这就是神经架构搜索 (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 框架。系统包含两个主要组件:
- 控制器 (Controller) : 通常是一个循环神经网络 (RNN) ,通过生成一系列决策来提议新的神经网络架构,例如“使用 3×3 卷积”、“连接到第 2 层”、“使用 ReLU 激活函数”等等。这些决策定义了一个完整的子网络。
- 子模型 (Child Model) : 由控制器采样得到的神经网络。
整个迭代过程如下:
- 采样: 控制器 RNN 采样一个架构。
- 训练与评估: 构建该子模型,并从头开始训练至收敛,在验证集上评估性能。
- 更新: 将验证性能作为奖励信号,通过策略梯度方法 (如 REINFORCE) 更新控制器参数。
经过多轮迭代,控制器能够学会生成高性能网络。但每个子模型都从头训练的方式使 NAS 极为缓慢。
ENAS 的核心创新就是通过让所有架构共享参数,彻底消除了这一高昂步骤。
ENAS 的核心方法: 用一个图统领所有架构
关键观察是: 控制器可采样的所有架构,其实都可以表示为单个超图中的子图,这个超图是一个大型有向无环图 (DAG) 。
图 2. 整个搜索空间表示为一个有向无环图 (DAG) ;红色箭头表示控制器采样得到的一个模型。
设计架构现在就变成了激活预定义 DAG 中某些节点和边的问题。每个节点代表一次计算 (例如卷积或池化操作) ,并拥有自己的权重。当控制器采样一个架构时,它只是选择了超图中的一条路径。所有架构都使用同一共享权重池,记为 \(\omega\)。
ENAS 的训练循环
ENAS 学习两组参数:
- \(\omega\): 超图中的共享权重 (所有子模型共用) 。
- \(\theta\): 控制器 RNN 的参数。
训练过程在两个阶段间交替进行:
阶段 1: 训练共享权重 \(\omega\)
冻结控制器策略 (不更新 \(\theta\)) 。从当前策略采样一个架构,并用一个训练数据批对其进行一步训练。梯度用于更新共享权重 \(\omega\):
这里,\(\mathcal{L}(m; \omega)\) 表示带有权重 \(\omega\) 的模型 \(m\) 的损失。作者发现取 \(M=1\) 就足够——即只采样一个架构,计算梯度,更新 \(\omega\) 后立即进入下一步。
阶段 2: 训练控制器 \(\theta\)
冻结 \(\omega\)。控制器采样架构,并在验证集上评估其性能以获得奖励 \(\mathcal{R}\)。这个奖励通过 REINFORCE 算法更新 \(\theta\),以最大化期望奖励:
使用验证数据可以避免控制器对训练集过拟合。
通过交替进行上述两个阶段,ENAS 同时获得优化的共享权重和更智能的控制器策略,从而极大加快搜索速度。
ENAS 的应用: 设计不同类型的架构
ENAS 框架具有高度灵活性;论文表明它既适用于**RNN 单元设计 (语言建模) ,也适用于CNN 设计 **(图像分类) 。
设计循环单元
在 RNN 单元的搜索空间中,一个 DAG 有 \(N\) 个节点。对于每个节点,控制器必须决定:
- 使用哪个之前节点的输出。
- 使用哪种激活函数 (
tanh
、ReLU
、sigmoid
或identity
) 。
下面是一个 4 节点的示例:
图 1. 一个循环单元示例: 左 — DAG;中 — 单元结构图;右 — 生成该设计的控制器输出。
逐步说明:
- 节点 1: 激活函数 =
tanh
。输入 = \(x_t\) 和 \(h_{t-1}\)。 - 节点 2: 连接到节点 1,激活函数 =
ReLU
。 - 节点 3: 连接到节点 2,激活函数 =
ReLU
。 - 节点 4: 连接到节点 1,激活函数 =
tanh
。 - 输出: 将所有“游离端” (未作为其他节点输入的节点) 求平均——这里是节点 3 和节点 4。
当 \(N=12\) 时,该搜索空间包含约 \(10^{15}\) 种可能的单元。
设计卷积网络
1. 宏观搜索空间: 完整网络设计
控制器逐层设计整个 CNN。每一层需要指定:
- 操作: 选择一种计算——卷积 (3×3 或 5×5) 、深度可分离卷积、最大池化或平均池化。
- 连接: 选择输入的前几层 (定义跳跃连接) 。
选择的层输出会被拼接,然后再进行该层的计算操作。
图 3. 采样得到的卷积网络: 红色箭头 = 激活路径;虚线箭头 = 跳跃连接。
这个搜索空间极其庞大——对于 \(L=12\) 层网络,有 \(1.6 \times 10^{29}\) 种可能架构。
2. 微观搜索空间: 可复用单元
受 NASNet 启发,控制器设计两种单元:
- 普通单元 (Normal Cell) : 保持空间尺寸不变。
- 缩减单元 (Reduction Cell) : 将空间尺寸下采样 (步长为 2) 。
这些单元按固定模式堆叠成最终网络:
图 4. 网络结构: 卷积单元块与缩减单元交替堆叠。
在每个单元内部 (一个包含 \(B\) 个节点的 DAG) :
- 选择两个之前的节点作为输入。
- 选择两种操作 (如
sep_conv_3x3
、avg_pool_3x3
) ,对输入分别执行并将结果相加。
图 5. 单元设计示例: 上 — 控制器输出;下 — 对应的单元 DAG。
微观搜索空间规模更小,但能得到可扩展性更强的可复用结构。
实验与结果: 实践中的 1000 倍加速
Penn Treebank (语言建模)
在该数据集基准上,ENAS 发现了一个新型 RNN 单元:
表 1. ENAS 在无后处理的情况下达到了 55.8 的困惑度,优于 NAS 的 62.4。
- ENAS 在单块 GPU 上耗时约 10 小时找到该单元。
- 该单元 (如下图) 仅使用了
tanh
和ReLU
,并对六个内部节点取平均——与独立发现的“上下文混合” (Mixture of Contexts) 方法相似。
图 6. ENAS 发现的 RNN 单元: tanh + ReLU 操作以及多条跳跃连接。
CIFAR-10 (图像分类)
ENAS 在宏观和微观搜索空间中均进行了实验:
表 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 在微观搜索空间中发现的单元。
控制器真的在学习吗?
两个消融实验给出了答案:
- 随机搜索: 随机采样的架构性能远不及 ENAS 设计的架构。
- 不训练控制器: 使用固定的随机控制器仅训练 \(\omega\)——性能显著下降。
结论: 训练好的控制器策略至关重要,它的确引导搜索走向了更优架构。
结论与启示
Efficient Neural Architecture Search 论文是 AutoML 领域的分水岭。通过引入参数共享,作者将 NAS 的计算量削减了三个数量级以上——从一个“谷歌级”问题变成个人研究者可承受的任务。
要点总结:
- 问题: 原始 NAS 成本高得惊人,因为每个候选架构都需从零训练。
- 解决方案: 将搜索空间构建成单个超图;所有候选架构都是共享权重的子图。
- 方法: 交替训练共享权重 (\(\omega\)) 和控制器 (\(\theta\)) 。
- 成果: 在语言建模与图像分类任务上,以减少 1000 倍的计算量达成最优结果。
ENAS 让 NAS 大众化,并引发了高效架构搜索技术的热潮。它将问题从“能否自动化架构设计?”变为“如何最高效地自动化架构设计?”,并至今仍是 AutoML 历史的重要基石。