这篇文章还是出自Google Brain,本文提出的方法极大提升了NAS的搜索速度,不再动辄需要几百个GPU days了,这篇文章发表在了ICML 2018。原文可见Efficient Neural Architecture Search via Parameter Sharing。
这篇文章提出了一种高效的神经架构搜索(ENAS),是一种快速而廉价的自动模型设计方法。ENAS构造了一个大的计算图,其中每个子图表示一个神经网络结构,因此迫使所有结构共享它们的参数。使用策略梯度训练控制器以搜索在验证集上最大化期望回报的子图。同时训练与所选子图相对应的模型,以最小化典型的交叉熵损失。在子模型之间共享参数使ENAS可以提供强大的经验性能,同时使用的GPU时间要比现有的自动模型设计方法少得多,尤其是与标准的NAS相比要cheap了1000倍。
NAS已被成功应用于图像分类及语言模型的模型架构设计。在NAS中,控制器是循环训练的:控制器首先采样候选架构(即子模型),训练其至收敛,并根据期望的任务衡量其性能。然后,控制器将此性能用作指导信号,以找到更有前途的架构。以上过程会重复很多次。尽管NAS具有令人印象深刻的经验性能,但它在计算上是昂贵和耗时的,例如NASNet使用450个GPU搜索了3-4天(即32400-43200个GPU时)。同时,使用更少的资源往往会产生不那么引人注目的结果。作者观察到,NAS的计算瓶颈就是训练每个子模型到收敛,然后只测量其精度,而丢弃所有训练过的权重。
这项工作的主要贡献是通过强制所有子模型共享权重来提高NAS的效率,从而避免从零开始训练每个子模型到收敛。这个想法有明显的复杂性,因为不同的子模型可能会不同地利用它们的权重,但是之前关于迁移学习和多任务学习的工作鼓励了这个想法,这些工作确定了为特定任务的特定模型学习的参数可以用于其他任务的其他模型,且这些参数几乎没有修改。
经验表明,不仅在子模型之间共享参数是可能的,而且它还允许非常强的性能。重要的是,在所有的实验中,使用一个NVIDIA GTX 1080Ti GPU,搜索架构只需不到16个小时。与NAS相比,GPU的工作时间减少了1000倍以上。
ENAS概念的核心是观察到,NAS最终迭代的所有图都可以看作是一个较大的图的子图。换句话说,可以用一个有向无环图(DAG)来表示NAS的搜索空间。图2展示了一个通用的示例DAG,其中可以通过获取DAG的子图来实现体系结构。直观地说,ENAS的DAG是NAS搜索空间中所有可能的子模型的叠加,节点表示局部计算,边表示信息流动。每个节点上的局部计算都有其自己的参数,仅当特定计算被激活时才使用。因此,ENAS的设计允许在搜索空间中的所有子模型(即体系结构)之间共享参数。
ENAS的控制器是一个RNN,它决定:1)哪些边被激活,2)在DAG中的每个节点执行哪些计算。这里通过一个简单的例子,用N=4个计算节点来说明ENAS机制(如图1所示)。设 x t x_{t} xt为递归cell的输入信号, h t − 1 h_{t-1} ht−1为上一时间步的输出。则采样过程如下:
在上面的例子中,对于每对节点 j < l j
这里的搜索空间是指数级的。具体来说,如果递归cell有N个node,并且允许4个激活函数(即tanh、ReLU、identity和sigmoid),那么搜索空间就有 4 N × ( N − 1 ) ! 4^{N}\times(N-1)! 4N×(N−1)!种配置。本文的实验中, N = 12 N=12 N=12,这意味着搜索空间中大约有 1 0 14 10^{14} 1014个模型。
这里的控制器网络是一个有100个隐藏单元的LSTM,该LSTM以自回归方式通过softmax分类器对决策进行采样:上一步中的决策作为输入嵌入到下一步中。
在ENAS中,有两组可学习参数:用 θ \theta θ表示的控制器LSTM参数和用 ω \omega ω表示的子模型的共享参数。ENAS的训练过程由两个交织阶段组成。第一阶段在整个训练集上训练子模型的共享参数 ω \omega ω,第二阶段训练固定步骤数的控制器LSTM的参数 θ \theta θ。 在ENAS训练期间,这两个阶段是交替进行的。
在这一步中,固定控制器的策略 π ( m ; θ ) \pi(\mathbf{m};\theta) π(m;θ)并对 ω \omega ω执行随机梯度下降(SGD)以最小化期望损失函数 E m ∼ π [ L ( m ; ω ) ] \mathbb{E}_{\mathbf{m}\sim\pi}[\mathcal{L}(\mathbf{m};\omega)] Em∼π[L(m;ω)]。这里, L ( m ; ω ) \mathcal{L}(\mathbf{m};\omega) L(m;ω)是标准的交叉熵损失,根据一个minibatch的训练数据计算,模型 m \mathbf{m} m从 π ( m ; θ ) \pi(\mathbf{m};\theta) π(m;θ)采样。梯度是用蒙特卡罗估计来计算的
∇ ω E m ∼ π ( m ; θ ) [ L ( m ; ω ) ] ≈ 1 M ∑ i = 1 M ∇ ω L ( m i , ω ) (1) \nabla_{\omega}\mathbb{E}_{\mathbf{m}\sim\pi(\mathbf{m};\theta)}[\mathcal{L}(\mathbf{m};\omega)]\approx\frac{1}{M}\sum_{i=1}^{M}\nabla_{\omega}\mathcal{L}(\mathbf{m}_{i},\omega)\tag{1} ∇ωEm∼π(m;θ)[L(m;ω)]≈M1i=1∑M∇ωL(mi,ω)(1)
式中,各 m i \mathbf{m}_{i} mi从 π ( m ; θ ) \pi(\mathbf{m};\theta) π(m;θ)采样,如上所述。方程1提供了梯度的无偏估计。但是,该估计值比标准SGD梯度(其中 m \mathbf{m} m固定)具有更高的方差。但是 M = 1 M = 1 M=1正好工作地很好,即可以使用从 π ( m ; θ ) \pi(\mathbf{m};\theta) π(m;θ)采样的任何单个模型 m \mathbf{m} m的梯度来更新 ω \omega ω。
在这一步中,固定 ω \omega ω并更新策略参数 θ \theta θ,以最大化预期回报 E m ∼ π ( m ; θ ) [ R ( m , ω ) ] \mathbb{E}_{\mathbf{m}\sim\pi(\mathbf{m};\theta)}[\mathcal{R}(\mathbf{m},\omega)] Em∼π(m;θ)[R(m,ω)]。奖励 R ( m , ω ) \mathcal{R}(\mathbf{m},\omega) R(m,ω)是在验证集而不是在训练集上计算的,以鼓励ENAS选择泛化性好的模型,而不是过拟合训练集的模型。
首先从训练后的策略 π ( m ; θ ) \pi(\mathbf{m};\theta) π(m;θ)中采样几个模型。对于每个采样模型,从验证集中采样的单个mini-batch计算其奖励。然后,只采用奖励最高的模型从头开始重新训练。当然,通过从头开始训练所有采样模型,并在分离的验证集上选择性能最高的模型,可能可以改进实验结果。然而,本文的方法在经济性更高的同时,也产生了类似的性能。
与之前循环cell的类似,在卷积模型的搜索空间中,控制器RNN也对每个决策块上的两组决策进行采样:1)连接到以前的哪些节点,2)使用什么计算操作。这些决策构成了卷积模型的一层。
决定连接哪个先前的节点允许模型形成skip连接。具体地说,在第k层,最多对k-1个相互不同的先前索引进行采样,从而在第k层导致 2 k − 1 2^{k-1} 2k−1个可能的决策。如图3所示是对卷积网络进行采样的示例。在这个例子中,在k=4层,控制器对以前的索引{1,3}进行采样,因此第1层和第3层的输出沿着它们的深度维度concat起来并送到第4层。
同时,使用哪种计算操作的决策将特定层设置为卷积或平均池化或最大池化。控制器可用的6个操作是: 3 × 3 3\times3 3×3和 5 × 5 5\times5 5×5卷积, 3 × 3 3\times3 3×3和 5 × 5 5\times5 5×5可分离卷积, 3 × 3 3\times3 3×3最大池化和平均池化。对于循环cell,ENAS卷积网络中每一层的每个操作都有一组不同的参数。将所描述的一组决策总共进行L次,可以对L层的网络进行采样。由于所有的决策都是独立的,因此在搜索空间中存在 6 L × 2 L ( L − 1 ) / 2 6^{L}\times2^{L(L-1)/2} 6L×2L(L−1)/2个网络。本文的实验中,L=12,得到 1.6 × 1 0 29 1.6\times10^{29} 1.6×1029个可能的网络。
与其设计整个卷积网络,不如设计更小的模块,然后将它们连接在一起形成网络。图4说明了此设计,其中将设计卷积cell和Reduction cell的结构。
这里利用带有B个节点的ENAS计算DAG来表示cell中局部发生的计算。在这个DAG中,node 1和node 2被视为cell的输入,这是最终网络中前两个cell的输出(见图5)。对于剩余的B-2节点中的每一个,要求控制器RNN做出两组决策:1)将两个之前的节点用作当前节点的输入,2)将两个操作应用于两个采样节点。可用的5种操作是:identity、 3 × 3 3\times3 3×3和 5 × 5 5\times5 5×5可分离卷积、 3 × 3 3\times3 3×3平均池化和最大池化。在每个节点上,在对先前节点及其对应的操作进行采样之后,将这些操作应用于先前的节点,并将其结果加起来。
如图5所示是B=5个节点的示例,用以说明搜索空间的机制:
也可以从此搜索空间中实现一个Reduction cell,方法很简单:1)从搜索空间中采样计算图,2)以2的步长应用所有操作。跟NASNet的一样,基于卷积采样Reduction cell,从而使控制器RNN总共运行2(B-2)个块。
最后估计一下此搜索空间的复杂度。在节点i( 3 ≤ i ≤ B 3\le i\le B 3≤i≤B),控制器可以从i-1个之前的节点中选择任意两个节点,并从5个操作中选择任意两个操作。由于所有决策都是独立的,因此有 ( 5 × ( B − 2 ) ! ) 2 (5\times(B−2)!)^{2} (5×(B−2)!)2个可能的cell(注意是可以重复的所以这里有个平方)。由于是独立地对卷积cell和Reduction cell进行采样的,所以搜索空间的最终大小为 ( 5 × ( B − 2 ) ! ) 4 (5\times(B−2)!)^{4} (5×(B−2)!)4。本实验中B=7,搜索空间可以实现 1.3 × 1 0 11 1.3\times10^{11} 1.3×1011个最终网络,使得它比整个卷积网络的搜索空间小得多(2.3节)。
这里首先介绍了在Penn Treebank数据集上使用ENAS设计循环cell和在CIFAR-10数据集上设计卷积结构的实验结果。然后展示一项消融研究,断言了ENAS在发现新结构中的作用。
ENAS在单个Nvidia GTX 1080Ti GPU上运行,可以在大约10小时内找到一个循环cell。 在表1中展示了ENAS发现的cell的性能以及未采用训练后处理的其他基准。重要的是,ENAS发现的cell比NAS的好了6个多点,而ENAS的搜索过程,就GPU小时而言,要快1000倍以上。
而ENAS发现的cell如图6所示。
这里将ENAS应用于两个搜索空间:1)整个卷积模型上的宏搜索空间(2.3节);2)卷积cell上的微观搜索空间(2.4节)。
表2总结了ENAS和其他方法的测试误差。
正如表中第二部分所示,ENAS找到了一个如图7所示的网络架构,实现了4.23%的测试误差,优于次优NAS模型的4.47%。如果保留架构,但将网络最高层的滤波器数量增加到512个,那么测试误差将减少到3.87%,与NAS的最佳模型(测试误差为3.65%)相距不远。但与NAS相比,ENAS大约需要7个小时来找到此体系结构,将GPU小时数减少了5000倍以上。
表2的第三部分介绍了一些方法的性能,这些方法试图设计更多的模块,然后将它们连接在一起形成最终网络。ENAS需要11.5小时来找到卷积cell和Reduction cell,如图8所示。通过将卷积cell重复 N = 6 N=6 N=6次(参见图4),与NASNet-A的3.41%的错误率处于同等水平,ENAS可以实现3.54%的测试错误率。与NASNet-A的2.65%相比,使用CutOut时,ENAS的误差降低到2.89%。
除了ENAS的强大性能外,作者还发现ENAS发现的模型在某种意义上是其搜索空间中的局部极小值。特别是,在从宏搜索空间得到的模型中,如果用标准卷积替换所有可分离卷积,然后调整模型大小,使参数数目保持不变,那么测试误差增加1.7%。类似地,如果随机改变在微搜索空间中搜索到的cell中的几个连接,则测试误差增加2.1%。当ENAS搜索循环cell以及在NAS中,也观察到这种行为。因此作者认为由ENAS学习的控制器RNN与由NAS学习的控制器RNN一样好,而NAS与ENAS之间的性能差距是因为ENAS没有从经过训练的控制器中采样多个体系结构,对它们进行训练,并根据验证数据选择最佳体系结构。这一额外步骤有利于NAS的性能。
有关ENAS重要性的一个问题是ENAS是否真正有能力找到好的架构,或者是否是搜索空间的设计导致了ENAS强大的经验表现。
随机的循环cell在Penn Treebank上达到了81.2,远比ENAS的56.3差。在CIFAR-10上,随机的卷积网络达到了5.86%的测试误差,两个随机cell达到了6.77%,而ENAS分别达到了4.23%和3.54%
除了随机搜索,这里尝试只训练共享参数 ω \omega ω而不更新控制器。在收敛时,模型的误差率为8.92%。在验证集上,该训练模型的250个蒙特卡罗配置的ensemble只能达到5.49%的测试误差。因此,对ENAS控制器进行适当的训练对于良好的性能至关重要。
ENAS在架构间共享权重的设计受到神经模型进化中权重继承概念的启发。此外,ENAS选择使用DAG表示计算受到随机计算图概念的启发,该概念将具有随机输出的节点引入计算图中。ENAS利用网络中的这种随机决策来做出控制网络中后续计算的离散体系结构决策,效率决策者(即控制器),并最终获取决策以得到体系结构。
NAS是神经网络设计过程自动化的一个重要进展。然而,NAS的计算开销阻碍了它的广泛应用。本文提出了一种新的方法ENAS,它可以将NAS的速度提高1000倍以上。ENAS的主要贡献是在搜索架构期间跨子模型共享参数。 通过在较大的图中搜索子图来实现这种想法,该大图包含了一个搜索空间中的体系结构。
本文的ENAS通过将NAS的采样过程变成在一个DAG里面采样子图的过程,通过使采样到的子图里面的各操作(比如卷积等操作)参数共享(即直接从DAG中继承而来而不是重新初始化),避免了再次重头训练,从而极大的加快了速度。当然这里DAG的参数以及采样器(RNN)是需要优化的(本文采用的是交替优化DAG中的参数和采样器中的参数)。总的来说这篇文章是NAS平民化的一个极大进步,通过参数共享将NAS的成本控制到了普通玩家也可以玩得起的程度(也就一个1080Ti跑半天,毫无压力)。