文章目录
- 基于参数共享的高效神经网络架构搜索
-
- 创新点
- 摘要
- 1.引言
- 2.方法
-
- [2.1 循环单元的设计](#2.1 循环单元的设计)
- [2.2 ENAS 训练流程与架构导出](#2.2 ENAS 训练流程与架构导出)
- [2.3 卷积网络的设计](#2.3 卷积网络的设计)
- [2.4 卷积单元(Cell)的设计](#2.4 卷积单元(Cell)的设计)
- [3. 实验](#3. 实验)
-
- [3.1 Penn Treebank语言规模](#3.1 Penn Treebank语言规模)
- [3.2 CIFAR‑10 图像分类](#3.2 CIFAR‑10 图像分类)
- [3.3 ENAS \text{ENAS} ENAS 有效性验证](#3.3 ENAS \text{ENAS} ENAS 有效性验证)
- [附录 A Penn Treebank 实验补充细节](#附录 A Penn Treebank 实验补充细节)
-
- [RNN 单元内部计算](#RNN 单元内部计算)
- 参数初始化
- [稳定 ω \boldsymbol{\omega} ω更新](#稳定 ω \boldsymbol{\omega} ω更新)
- [附录 B CIFAR‑10 实验补充细节](#附录 B CIFAR‑10 实验补充细节)
基于参数共享的高效神经网络架构搜索
- 论文:https://proceedings.mlr.press/v80/pham18a/pham18a.pdf
- 代码:-
- 发表:Proceedings of Machine Learning Research,PMLR
- 年份:2018
创新点
让所有子模型共享权重,避免每个子模型都从零开始训练到收敛,以此提升 NAS 的效率 \color{brown}\textbf{让所有子模型共享权重,避免每个子模型都从零开始训练到收敛,以此提升 NAS 的效率} 让所有子模型共享权重,避免每个子模型都从零开始训练到收敛,以此提升 NAS 的效率
摘要
本文提出高效神经网络架构搜索(ENAS) ,这是一种 快速、低成本的自动模型设计方法 \boxed{快速、低成本的自动模型设计方法} 快速、低成本的自动模型设计方法。在 ENAS 中,控制器 在一个大型计算图内搜索最优子图 \fbox{在一个大型计算图内搜索最优子图} 在一个大型计算图内搜索最优子图,以此发现神经网络架构。控制器借助策略梯度进行训练, 目标是选出在验证集上期望奖励最大的子图 \boxed{目标是选出在验证集上期望奖励最大的子图} 目标是选出在验证集上期望奖励最大的子图;与此同时,被选中子图对应的模型进行训练,最小化标 准交叉熵损失 \boxed{准交叉熵损失} 准交叉熵损失。
通过 在子模型之间共享参数 \boxed{在子模型之间共享参数} 在子模型之间共享参数,ENAS 不仅取得优异的实验效果,而且相比现有的自动模型设计方法,消耗的 GPU 算力小时数大幅降低 ------ 相比原版神经网络架构搜索(NAS),算力开销足足减少 1000 倍。在宾夕法尼亚树库(Penn Treebank)数据集上,ENAS 搜索得到全新架构,测试集困惑度达到 55.8,在所有不使用后处理的方法中刷新当前最优结果。在 CIFAR‑10 数据集上,ENAS 得到的新架构测试错误率为 2.89%,和 NASNet 模型 2.65% 的测试错误率处于同一水平。
1.引言
神经网络架构搜索(NAS)已经被成功用于为图像分类、语言模型设计网络架构。NAS 的流程循环执行:循环神经网络(RNN)控制器首先采样候选架构(即子模型),接着把该模型训练至收敛,测量其在目标任务上的性能;控制器再将该性能作为指导信号,寻找更有潜力的架构,不断重复迭代。
尽管 NAS 实验效果出众,但其计算开销巨大、耗时长。例如 Zoph 等人的工作使用 450 块 GPU,耗时 3‑4 天,对应 32400‑43200 GPU 小时。而如果缩减计算资源,得到的模型效果往往会大打折扣。
本文发现 NAS 的计算瓶颈在于:每一个子模型都要完整训练到收敛,仅仅为了评估精度,训练得到的权重随后就被直接丢弃。
本文核心贡献:
让所有子模型共享权重,避免每个子模型都从零开始训练到收敛,以此提升 NAS 的效率 \textbf{让所有子模型共享权重,避免每个子模型都从零开始训练到收敛,以此提升 NAS 的效率} 让所有子模型共享权重,避免每个子模型都从零开始训练到收敛,以此提升 NAS 的效率。
这个想法看似存在难点 ------ 不同子模型对权重的使用方式各不相同。但是迁移学习、多任务学习领域已有相关研究支撑:在某一个任务上训练得到的模型参数,几乎不用修改就可以复用到其他模型、其他任务上。
实验证明:子模型之间参数共享是完全可行的,并且能够取得很好的效果。在 CIFAR‑10 上,本文方法测试错误率 2.89%,NAS 为 2.65%;在 Penn Treebank 数据集,本文测试困惑度 55.8,显著优于 NAS 的 62.4,这也是不使用后处理技术下的新高。最重要的是,全部实验仅使用单块 Nvidia GTX 1080Ti GPU,架构搜索耗时不超过 16 小时。相比 NAS,GPU 小时数下降超过 1000 倍。正因为它极高的效率,我们将该方法命名为 ENAS(Efficient Neural Architecture Search)。
2.方法
ENAS 的核心思想:
NAS 遍历得到的全部计算图,都可以看作一张更大图的子图。 \textbf{NAS 遍历得到的全部计算图,都可以看作一张更大图的子图。} NAS 遍历得到的全部计算图,都可以看作一张更大图的子图。
也就是说,我们可以 用一张有向无环图 DAG来表示 NAS 的整个搜索空间 \boxed{\textbf{用一张有向无环图 DAG来表示 NAS 的整个搜索空间}} 用一张有向无环图 DAG来表示 NAS 的整个搜索空间。图 2 给出通用 DAG 示例:架构等价于从 DAG 中取出的一个子图。简单理解,ENAS 的 DAG 就是 NAS 搜索空间中全部候选子模型的叠加;节点代表局部计算,边代表信息流动。每个节点上的局部计算拥有自己的参数,只有当该计算被激活时,对应的参数才会被使用。因此 ENAS 的设计实现搜索空间内全部子模型之间的参数共享。

图2:该图表示完整的搜索空间,红色箭头划定出搜索空间内的一个模型,该模型由控制器确定。其中,节点1为模型的输入,节点3和节点6是模型的输出。
下文先以循环神经网络单元的设计为例,介绍 ENAS 机制(2.1 节);之后讲解 ENAS 的训练流程,以及如何从控制器导出最终架构(2.2 节);最后介绍卷积网络对应的搜索空间(2.3、2.4 节)。
2.1 循环单元的设计
为设计循环单元,构建一个拥有 N 个节点的 DAG: 节点代表局部计算,边代表节点之间的信息传递 \boxed{节点代表局部计算,边代表节点之间的信息传递} 节点代表局部计算,边代表节点之间的信息传递。ENAS 的控制器是 RNN,负责做两类决策:1)激活哪些边;2)每个节点执行什么计算。
原版 NAS 的 RNN 单元搜索空间把拓扑固定为二叉树,只学习树每个节点上的运算;与之不同,ENAS 的搜索空间可以同时学习 RNN 单元的拓扑结构和运算类型 ,灵活性更强。

图1:本文搜索空间中包含4个计算节点的循环单元示例。左侧:该循环单元对应的计算有向无环图(DAG),红色边代表图中的信息流向。中间:循环单元。右侧:控制器循环神经网络(RNN)的输出,正是这些输出生成了中间的循环单元以及左侧的有向无环图。注意:节点3和节点4从未被RNN选为其他节点的输入,因此将二者的输出取平均值,作为该循环单元的输出。
要生成一个循环单元,控制器 RNN 会输出 N N N 组决策。下面以 N = 4 N=4 N=4 个计算节点的循环单元举例(见图 1)。设 x t x_t xt是循环单元输入(词嵌入), h t − 1 h_{t-1} ht−1是上一时刻的输出,采样过程如下:
- 节点1:控制器选择激活函数(本例子中选择 tanh \tanh tanh)。节点1计算
h 1 = tanh ( x t ⋅ W ( x ) + h t − 1 ⋅ W 1 ( h ) ) h_1=\tanh\left(x_t \cdot W^{(x)}+h_{t-1} \cdot W_{1}^{(h)}\right) h1=tanh(xt⋅W(x)+ht−1⋅W1(h)) - 节点2:控制器采样一个前置节点编号和激活函数。本例选前置节点 1,激活函数 ReLU \text{ReLU} ReLU。节点 2 计算:
h 2 = ReLU ( h 1 ⋅ W 2 , 1 ( h ) ) h_2=\text{ReLU}\left(h_{1}\cdot W_{2,1}^{(h)}\right) h2=ReLU(h1⋅W2,1(h)) - 节点3:控制器再次采样前置索引与激活函数,本例选节点 2、 ReLU \text{ReLU} ReLU:
h 3 = ReLU ( h 2 ⋅ W 3 , 2 ( h ) ) h_3=\text{ReLU}\left(h_{2}\cdot W_{3,2}^{(h)}\right) h3=ReLU(h2⋅W3,2(h)) - 节点 4:采样前置索引 1 与激活函数 tanh \tanh tanh:
h 4 = ReLU ( h 1 ⋅ W 4 , 1 ( h ) ) h_4=\text{ReLU}\left(h_{1}\cdot W_{4,1}^{(h)}\right) h4=ReLU(h1⋅W4,1(h)) - 输出处理 :把所有没有被其他节点当作输入的节点(游离节点)取平均,作为单元输出。本例中节点 3、4 没有被后续节点引用,因此单元输出 h t = ( h 3 + h 4 ) / 2 h_t=(h_3+h_4)/2 ht=(h3+h4)/2。
在上述例子中,对任意一对节点 j < l j<l j<l,都有独立的参数矩阵 W l , j ( h ) W_{l,j}^{(h)} Wl,j(h)。控制器选择前置节点编号,本质就是选择启用哪些参数矩阵。因此,搜索空间内的所有循环单元共享同一套参数。
该搜索空间可以生成指数级数量的配置:若循环单元有 N N N个节点,可选 4 种激活函数( tanh \tanh tanh、 ReLU \text{ReLU} ReLU、恒等映射、 Sigmoid \text{Sigmoid} Sigmoid),总配置数目为 4 N × N ! 4^N \times N! 4N×N!。本文实验设置 N = 12 N=12 N=12,搜索空间大约包含 10 15 10^{15} 1015种模型。
2.2 ENAS 训练流程与架构导出
控制器网络是一个隐层维度 100 的 LSTM。该 LSTM 以自回归的方式,通过 softmax \text{softmax} softmax 分类器输出决策:上一步输出的决策会作为嵌入输入下一步;第一步输入为空嵌入。
ENAS 包含两组可学习参数:控制器 LSTM 的参数 θ \theta θ; 子模型的共享参数 ω \omega ω。ENAS 训练交替执行两个阶段:
- 阶段一:训练子模型共享参数 ω {\omega} ω
固定控制器策略 π ( m ; θ ) \pi(m;\theta) π(m;θ),使用随机梯度下降SGD优化 ω \omega ω,最小化期望损失 E m ∼ π L ( m ; ω ) \mathbb{E}_{m \sim \pi}\\mathcal{L}(m;\\omega) Em∼πL(m;ω)。其中 m m m是从策略中采样出来的模型; L ( m ; ω ) \mathcal{L}(m;\omega) L(m;ω)是标准化交叉熵损失。
使用蒙特卡洛估计梯度:
∇ ω E m ∼ π ( m ; θ ) L ( m ; ω ) ≈ 1 M ∑ i = 1 M ∇ ω L ( m i , ω ) \nabla_{\omega}\mathbb{E}{m\sim \pi(m;\theta)}\\mathcal{L}(m;\\omega) \approx \frac{1}{M}\sum{i=1}^{M}\nabla_{\omega}\mathcal{L}(m_{i},\omega) ∇ωEm∼π(m;θ)L(m;ω)≈M1i=1∑M∇ωL(mi,ω)
式中, m i m_i mi采样自策略分布。该估计是无偏的, 但是相比于模型固定的普通SGD梯度,方差更大。但是实验发现取 M = 1 M=1 M=1就足够,也就是每次只用采样得到的单个模型计算梯度更新 ω \omega ω。
在 Penn Treebank 实验中, ω \omega ω训练约 400 步,每个小批量包含 64 个样本,使用时间反向传播,截断长度 35 步。CIFAR‑10 实验使用 45000 张训练图,批大小 128,采用普通反向传播。
- 阶段二:训练控制器参数 θ \theta θ
固定共享参数 ω \omega ω,更新策略参数 θ \theta θ,最大化期望奖励 E m ∼ π ( m , θ ) R ( m , ω ) \mathbb{E}_{m\sim\pi(m,\theta)}R(m,\\omega) Em∼π(m,θ)R(m,ω)。优化器使用Adam,梯度使用REINFORCE 算法,配合移动平均基线降低方差。
奖励 R ( m , ω ) R(m,\omega) R(m,ω)在验证集上计算,而非训练集,目的是引导选出泛化能力好的模型,而不是只在训练集上过拟合的模型。
- 语言模型任务:奖励等于验证集困惑的倒数
- 图像分类任务:奖励等于验证集上的分类精度
从训练好的ENAS导出架构
从训练完成的策略 π ( m , θ ) \pi(m,\theta) π(m,θ)中采样若干模型,在验证集的一个小批量样本上计算每个模型的奖励,选取奖励最高的模型,从零开始完整重训。
其他工作会把全部采样模型重训,再在独立验证集筛选最优,可以进一步提升效果;但本文方法仅挑选一个重训,就可以获得接近的性能,同时开销低得多。
2.3 卷积网络的设计

图3:本文搜索空间内一个含4个计算节点的循环单元示例,这4个节点对应卷积网络中的4层。上方:控制器RNN的输出。左下:该网络架构对应的计算有向无环图(DAG),红色箭头代表激活的计算路径。右下:完整网络,虚线箭头表示跳跃连接。
循环单元搜索空间 \fbox{循环单元搜索空间} 循环单元搜索空间中, 控制器每个决策块输出两类选择:要连接哪些前置节点;选用什么激活函数 \fbox{控制器每个决策块输出两类选择:要连接哪些前置节点;选用什么激活函数} 控制器每个决策块输出两类选择:要连接哪些前置节点;选用什么激活函数。 卷积模型搜索空间 \fbox{卷积模型搜索空间} 卷积模型搜索空间里, 控制器每个决策块同样输出两组决策:要连接哪些前置节点;执行什么计算操作 \fbox{控制器每个决策块同样输出两组决策:要连接哪些前置节点;执行什么计算操作} 控制器每个决策块同样输出两组决策:要连接哪些前置节点;执行什么计算操作,由此构建卷积网络的一层。
选择连接哪些前置节点 \fbox{选择连接哪些前置节点} 选择连接哪些前置节点,可以实现跳跃连接。第 k k k层最多可以选择 k − 1 k-1 k−1个互不重复的前置节点,对应 2 k − 1 2^{k-1} 2k−1种选择。选出来的多个前置层输出会沿着通道维度拼接,送入当前层。
选择计算操作 \fbox{选择计算操作} 选择计算操作,可以指定该层执行:3×3、5×5 普通卷积;3×3、5×5 深度可分离卷积;3×3 最大池化、3×3 平均池化,共 6 种可选运算。和循环单元一样,卷积网络每一层的每种运算都有独立参数。
执行 L L L次完整决策,就采样得到一个 L L L层网络。全部决策相互独立,搜索空间规模 6 L × 2 L ( L − 1 ) / 2 6^{L} \times 2^{L(L-1)/2} 6L×2L(L−1)/2。本文实验取 L = 12 L=12 L=12,约有 1.6 × 10 29 1.6\times10^{29} 1.6×1029种网络。
2.4 卷积单元(Cell)的设计
不必直接搜索完整卷积网络,也可以只搜索小规模模块(单元),再把多个单元拼接成完整网络,和 NASNet 思路保持一致。
使用有 B B B个节点的 DAG 表示一个单元内部计算。节点 1、2 作为单元输入,对应前序两个单元的输出。剩下的 B − 2 B-2 B−2个节点,控制器需要输出两组决策:
- 选择两个前置节点,作为当前节点输入;
- 对两个选中的前置节点分别选择一种运算。

图4:将3个模块相连构成最终网络,每个模块包含N个卷积单元与1个降采样单元。
可选的 5 种运算:恒等映射;3×3、5×5 可分离卷积;3×3 平均池化、3×3 最大池化。对每个节点,将运算作用于前置节点,再把两个结果相加。

下面以 B = 4 B=4 B=4节点举例:
- 节点1,2为输入节点,无需做决策,输出记为 h 1 h_1 h1、 h 2 h_2 h2;
- 节点3:控制器选择前置节点2、节点2(注此处论文中写明为 it samples node 2, node 2 \textbf{it samples node 2, node 2} it samples node 2, node 2),运算分别为 5 × 5 5\times5 5×5可分离卷积、恒等映射,于是:
h 3 = sep_conv 5 × 5 ( h 2 ) + id ( h 2 ) h_3=\text{sep\_conv}5\times5(h_2)+\text{id}(h_2) h3=sep_conv5×5(h2)+id(h2)- 节点4:控制器选择前置节点3,1,运算分别为 3 × 3 3\times3 3×3平均池化、 3 × 3 3\times3 3×3可分离卷积,则:
h 4 = avg_pool 3 × 3 ( h 3 ) + sep_conv 3 × 3 ( h 1 ) h_4=\text{avg\_pool}3\times3(h_3)+\text{sep\_conv}3\times3(h_1) h4=avg_pool3×3(h3)+sep_conv3×3(h1)- 输出:没有被其他节点当作输入的 "游离节点",把它们沿着通道维度拼接,作为整个单元输出。本例只有 h 4 h_4 h4是游离节点,直接作为单元输出。
降采样单元(Reduction Cell) :复用完全一样的搜索空间采样计算图,所有运算步长设置为 2,就可以得到降采样单元,空间尺寸减半。按照 NASNet 的做法,降采样单元依赖卷积单元的采样结果,控制器 RNN 总共执行 2 ( B − 2 ) 2(B-2) 2(B−2)个决策块。
搜索规模估算:对于节点 i i i( 3 ≤ i ≤ B 3\le i \le B 3≤i≤B),控制器可以从前 i − 1 i-1 i−1个节点中任选两个,5 种运算里面任选两个。卷积单元和降采样单元独立采样,整体搜索空间大小为 ( 5 × ( B − 2 ) ! ) 4 \big(5 \times (B-2)!\big)^4 (5×(B−2)!)4。本文实验设置 B = 7 B=7 B=7,可以生成 1.3 × 10 11 1.3\times10^{11} 1.3×1011种网络,相比直接搜索完整卷积网络的空间规模小很多。
3. 实验
首先展示 ENAS 在 Penn Treebank 数据集搜索循环单元、CIFAR‑10 搜索卷积架构的实验结果;之后通过消融实验验证 ENAS 对于发现优质架构的作用。
3.1 Penn Treebank语言规模
数据集与实验设置:Penn Treebank 是语言建模领域经典基准数据集,使用学界通用预处理版本。本文目标只搜索单元结构,不使用神经缓存、动态评估等后处理技巧。限制 ENAS 单元参数量不超过 24M,也没有做大量超参调优,也不像部分基线训练大量架构再挑选最优,因此性能提升只能来自搜索得到的单元本身。
训练细节:控制器使用 Adam 优化器,学习率 0.00035。为避免过早收敛,对采样 logits 使用 tanh 常数 2.5、温度系数 5.0;将控制器输出熵加权 0.0001 加到奖励函数中。循环单元节点之间加入高速连接。
共享参数 ω \omega ω使用 SGD 训练,初始学习率 20.0,从第 15 轮开始每轮乘以 0.96 做衰减,总共训练 150 轮;梯度范数裁剪上限 0.25。正则化包含:权重衰减系数 10 − 7 10^{-7} 10−7的 L2 正则、变分 Dropout、词嵌入与 softmax 权重共享。更多细节见附录 A。

图6:ENAS在Penn Treebank数据集上搜索得到的RNN单元。
结果:单块 GTX1080Ti GPU,搜索循环单元耗时约 10 小时。结果如表 1 所示,ENAS 单元测试困惑度达到 55.8,和 MoS 方法 56.0 的 SOTA 接近,并且没有使用 MoS 技术。相比原版 NAS(62.4),困惑度下降超过 6 个点,搜索算力却少 1000 倍以上。
ENAS 搜索出来的 RNN 单元有几个有意思特点:
- 单元内部非线性只有 ReLU 和 tanh,尽管搜索空间同时提供恒等映射与 sigmoid;
- 该架构属于搜索空间的局部最优:随机把部分节点激活函数替换为恒等 /sigmoid,困惑度最高上涨 8;ReLU 与 tanh 互相替换,困惑度最高上涨 3;
- 单元输出是 6 个节点的平均,行为类似 MoC(混合上下文),模型自动学到平衡上下文数量与单元变换深度。

表 1 Penn Treebank 上 ENAS 与基线方法测试困惑度。RHN = 循环高速网络;VD = 变分 Dropout;WT = 权重绑定;L2 = 权重惩罚;AWD = 平均权重 Dropout;MoC = 混合上下文;MoS = 混合 Softmax。
3.2 CIFAR‑10 图像分类
数据集:CIFAR‑10 包含 5 万训练图、1 万测试图。采用标准预处理与数据增强:减去通道均值除以标准差;训练图先填充到 40×40,随机裁剪回 32×32,随机水平翻转。
搜索空间:ENAS 测试两套搜索空间:①宏搜索空间,直接搜索完整卷积网络;②微搜索空间,只搜索卷积单元、降采样单元。
训练细节 :共享参数 ω \omega ω使用 Nesterov 动量,学习率余弦调度:最大 l m a x = 0.05 l_{max}=0.05 lmax=0.05,最小 l m i n = 0.001 l_{min}=0.001 lmin=0.001, T 0 = 10 T_0=10 T0=10, T m u l = 2 T_{mul}=2 Tmul=2,架构搜索一共训练 310 轮;He 初始化;L2 权重衰减 10 − 4 10^{-4} 10−4。控制器参数 θ \boldsymbol{\theta} θ在 − 0.1 , 0.1 -0.1,0.1 −0.1,0.1均匀初始化;Adam 学习率 0.00035;logits 设置 tanh 常数 2.5、温度 5.0;熵项权重 0.1。宏搜索空间中为了让跳跃连接更加稀疏,在奖励中加入 KL 散度约束,先验概率 ρ = 0.4 \rho=0.4 ρ=0.4,权重 0.8。更多细节见附录 B。
结果 :结果汇总在表 2。

表2:ENAS及各基线模型在CIFAR‑10数据集上的分类错误率。本表第一部分为DenseNet,这是由人工专家设计的SOTA(当前最优)网络架构之一。第二部分列出的方法用于搜索设计完整网络。最后一部分介绍的技术用于设计模块化单元,将这些单元拼接组合即可构建最终网络。

图7:ENAS在图像分类任务的宏搜索空间中搜索得到的网络。
- 宏搜索空间(搜索完整网络):单 GPU 耗时约 7 小时,得到的网络测试错误率 4.23%,优于 NAS 原版 4.47%;增加通道数后参数量提升,错误率下降到 3.87%。相比原版 NAS,GPU 小时数减少 5 万倍以上。
- 微搜索空间(搜索单元):单 GPU 耗时约 11.5 小时。搜索得到卷积单元与降采样单元,堆叠 6 次卷积单元,测试错误率 3.54%,和 NASNet‑A(3.41%)相当;叠加 CutOut 增强后,错误率 2.89%,NASNet‑A+CutOut 为 2.65%。
实验同样观察到:ENAS 找到的架构属于局部最优。宏搜索得到的网络,若把可分离卷积替换普通卷积、保持参数量不变,错误率上升 1.7%;微搜索得到的单元随机改动部分连接,错误率上升 2.1%。和原版 NAS 现象一致。本文分析 ENAS 与 NAS 之间微小性能差距来源于:NAS 会采样大量架构全部重训再挑选最优,而 ENAS 只采样少量。

图8:ENAS在微搜索空间中搜索得到的单元。
3.3 ENAS \text{ENAS} ENAS 有效性验证
需要回答:性能好到底来自 ENAS 搜索算法,还是仅仅得益于搜索空间本身?
- 对比引导随机搜索 :从相同搜索空间均匀采样架构,使用完全相同设置训练至收敛。
- Penn Treebank 随机采样循环单元,困惑度 81.2,远差于 ENAS 的 55.8;
- CIFAR‑10 宏空间随机网络错误率 5.86%,ENAS 为 4.23%;
- CIFAR‑10 随机卷积 + 降采样单元组合错误率 6.77%,ENAS 为 3.54%。
- 禁用控制器更新 :只训练共享参数 ω \boldsymbol{\omega} ω,控制器参数不更新(相当于随机控制器)。宏搜索空间最终错误率 8.92%;把该模型 250 种蒙特卡洛配置做集成,测试错误率也仅 5.49%。
结论:对控制器做训练是 ENAS 取得好效果的关键,性能不是单纯搜索空间带来的。
附录 A Penn Treebank 实验补充细节
RNN 单元内部计算
把 t t t时刻单元堪称包含有 N N N个节点 h 1 t , h 2 t , ⋯ , h N t h_{1}^{t},h_{2}^{t},\cdots,h_{N}^{t} h1t,h2t,⋯,hNt的DAG。节点 h 1 t h_{1}^{t} h1t接收当前输入 x ( t ) x^{(t)} x(t)和上一时刻单元输出 h N ( t − 1 ) h_{N}^{(t-1)} hN(t−1)。
c 1 ( t ) ← sigmoid ( x ( t ) ⋅ W ( x , c ) + h N ( t − 1 ) ⋅ W 0 ( c ) ) c_1^{(t)}\leftarrow \text{sigmoid}\left(x^{(t)}\cdot W^{(x,c)}+h_{N}^{(t-1)}\cdot W_{0}^{(c)}\right) c1(t)←sigmoid(x(t)⋅W(x,c)+hN(t−1)⋅W0(c))
h 1 ( t ) ← c 1 ( t ) ⊗ f 1 ( x ( t ) ⋅ W ( x , h ) + h N ( t − 1 ) ⋅ W 1 ( h ) ) + ( 1 − c 1 ( t ) ) ⊗ h N ( t − 1 ) h_1^{(t)} \leftarrow c_1^{(t)}\otimes f_1\left(x^{(t)}\cdot W^{(x,h)}+h_{N}^{(t-1)}\cdot W_{1}^{(h)}\right)+\left(1-c_{1}^{(t)}\right)\otimes h_{N}^{(t-1)} h1(t)←c1(t)⊗f1(x(t)⋅W(x,h)+hN(t−1)⋅W1(h))+(1−c1(t))⊗hN(t−1)
其中, f 1 f_1 f1是控制器选定的激活函数。
对于 ℓ = 2 , 3 , ⋯ , N \ell=2,3,\cdots,N ℓ=2,3,⋯,N,节点 h ℓ ( t ) h_{\ell}^{(t)} hℓ(t)接收控制器选定的前置节点 j ℓ j_{\ell} jℓ的输出:
c ℓ ( t ) ← sigmoid ( h j ℓ ( t ) ⋅ W ℓ , j ℓ ( c ) ) c_{\ell}^{(t)}\leftarrow \text{sigmoid}\left(h_{j_{\ell}}^{(t)}\cdot W_{\ell,j_{\ell}}^{(c)}\right) cℓ(t)←sigmoid(hjℓ(t)⋅Wℓ,jℓ(c))
h ℓ ( t ) ← c ℓ ( t ) ⊗ f ℓ ( h j ℓ ( t ) ⋅ W ℓ , j ℓ ( h ) ) + ( 1 − c ℓ ( t ) ) ⊗ h j ℓ ( t ) h_{\ell}^{(t)}\leftarrow c_{\ell}^{(t)}\otimes f_{\ell}\left(h_{j_{\ell}}^{(t)}\cdot W_{\ell,j_{\ell}}^{(h)}\right)+\left(1-c_{\ell}^{(t)}\right)\otimes h_{j_{\ell}}^{(t)} hℓ(t)←cℓ(t)⊗fℓ(hjℓ(t)⋅Wℓ,jℓ(h))+(1−cℓ(t))⊗hjℓ(t)
循环单元全部共享参数 ω \omega ω包含: W ( x , c ) , W ( x , h ) , W ℓ , j ( c ) , W ℓ , j h W^{(x,c)},W^{(x,h)},W_{\ell,j}^{(c)},W_{\ell,j}^{h} W(x,c),W(x,h),Wℓ,j(c),Wℓ,jh,词嵌入矩阵;若没有做权重绑定,还包含 softmax 层权重。控制器为每个节点选择前置连接 j ℓ j_{\ell} jℓ和激活函数 f ℓ f_{\ell} fℓ。没有被其他节点引用的节点取平均,作为单元输出,送入 softmax 或者上层循环层。
参数初始化
控制器参数 θ \mathbb{\theta} θ在 − 0.1 , 0.1 -0.1,0.1 −0.1,0.1均匀初始化。Penn Treebank 任务对初始化相比 CIFAR‑10 不敏感。架构搜索阶段,共享参数 ω \boldsymbol{\omega} ω在 − 0.025 , 0.025 -0.025,0.025 −0.025,0.025均匀初始化;当取出固定架构单独训练时,初始化区间调整为 − 0.04 , 0.04 -0.04,0.04 −0.04,0.04。
稳定 ω \boldsymbol{\omega} ω更新
架构搜索阶段,单元输出(各游离节点取平均之后)之后增加一层批归一化;取出固定单元做单独训练时,可以移除该 BN 层,性能不受损失。
附录 B CIFAR‑10 实验补充细节
下面几个技巧对 ENAS 效果至关重要,原版 NAS 同样依赖类似技巧:
- 卷积层内部顺序:每一处卷积运算执行顺序为 ReLU‑Conv‑BN。微搜索空间中,深度可分离卷积执行两次。
- 处理随机跳跃连接:当一层接收多个前置层跳跃连接,前置层输出先沿通道拼接,再接 1×1 卷积 + BN+ReLU,保证不同架构之间输出通道数统一。取出固定架构之后,可删掉这些 BN,节省参数量与计算量,性能几乎不受影响。
- 全局平均池化:最后卷积层输出对每个通道做全局平均池化,再送入 Softmax。该手段减少全连接参数量,缓解过拟合。
后两项技巧尤为关键:公式 (1) 中共享参数 ω \boldsymbol{\omega} ω的梯度估计方差很高,如果没有上述技巧,ENAS 训练会非常不稳定。