薛羽,卢畅畅
(南京信息工程大学软件学院,江苏 南京 210044)
近年来,卷积神经网络(CNN)在自动驾驶[1]、医疗诊断[2]、智能推荐[3]等领域得到了广泛的应用。卷积神经网络的性能很大程度上取决于网络的拓扑结构。设计卷积神经网络结构是一件十分耗时的试错过程,需要由具有丰富知识的专家进行大量的试验。随着神经网络的结构变得越来越复杂,完全依靠人工设计神经网络结构变得不现实。正因为此,作为自动化机器学习(AutoML)的重要组成部分,神经架构搜索(NAS)越来越引起人们关注。
神经架构搜索框架由搜索空间、搜索策略和评估方法三部分组成。早期的学者们主要使用演化计算(EC)[4]或者强化学习(RL)[5]的方法从搜索空间中挑选网络并对网络精度进行评估,网络的评估精度将被用来指导下一阶段网络的挑选。然而网络性能评估是一件十分费时的工作,这导致整个神经架构搜索过程往往需要耗费昂贵的计算资源才能完成。例如REAL 等[4]使用遗传算法在CIFAR-10 上进行架构搜索,整个搜索过程使用了450 块图形处理器(GPU)持续搜索了7 天。同样在CIFAR-10 数据集上,ZOPH等[5]使用强化学习的方法在800块GPU 上搜索了3周。如此巨大的时间消耗决定了基于演化计算的NAS 方法和基于强化学习的NAS 方法难以被实际应用。
为了缩短神经架构搜索的资源消耗,学者们陆续提出了早停、低保真度估计、曲线外推等方法,但是由于这些方法主观性过强,结果往往不够理想。2018 年,PHAM 等[6]提出了One-shot 方法。该方法将搜索空间中的任何可能的神经网络架构视为一个超网络的子网络。在训练过程中,只需要训练超网络,子网络则直接继承超网络的权重进行性能评估。研究人员一般采用单路径训练策略训练超网络,即每次训练超网络中的一条子网络,并对子网络所对应的超网络部分的参数进行优化。但是由于所有子网络共享一组权重参数,超网络存在严重的权重耦合现象。GreedyNAS[7]优先训练那些当前表现优异的子网络,提高了One-shot NAS 的性能。另一种常用的神经架构搜索方法是可微分架构搜索(DARTS)[8]。DARTS在One-shot NAS 的基础上使用Softmax 函数将整个搜索空间连续松弛化,使得可以使用梯度下降的方法交替优化超网络的权重参数和结构参数,进一步提高了搜索效率并成功应用于工业界[9]。但DARTS的鲁棒性较差,容易出现大量的跳跃连接,且DARTS 搜索结果单一,难以实现多目标搜索。
连续进化结构搜索(CARS)[10]是一种基于演化计算的神经架构搜索方法。该方法维护一个超网络,演化计算种群中的每个个体都是该超网络的一个子网络,在演化计算的过程中,每一代从当前种群中随机采样部分子网络,然后使用这些采样到的子网络对超网络进行单路径训练。新生成的子代个体将继承超网络中的权重并直接进行性能评估。这种方法大大缩减了搜索时间,使CARS 仅使用较少的计算资源就完成了搜索。但是CARS 仅仅从演化计算的种群中选取子网络训练超网络,这种方法虽然在一定程度上减少了权重耦合,但是超网络中一开始表现较优异的子网络会不断被训练到,从而越来越优异,而一开始表现较差的子网络可能永远都不会被训练到,从而导致算法的全局搜索能力变差。
本文提出一种基于有偏采样的连续进化神经架构搜索方法。区别于CARS 从种群中均匀采样子网络,本文采用有偏采样的方法,通过更改超网络训练过程中不同子网络架构的采样频率,以更大的概率训练表现优异的子网络,同时兼顾算法的全局探索能力。此外,本文设计高效的交叉和变异方式,在保证全局探索能力的同时减少超网络的权重耦合,提高神经网络的搜索效率。
搜索空间决定了可以搜索到的神经网络架构的范围。基于人工设计的神经网络会使用重复模块的经验,本文采用基于Cell 的搜索空间。与DARTS 的搜索空间类似,整个搜索空间由Normal Cell 和Reduction Cell 两种Cell 组成,整个网络1/3 和2/3 的部位放置Reduction Cell,其余部位放置Normal Cell。Reduction Cell 使用步长为2 的卷积操作将特征图尺寸减半,同时将卷积通道数加倍。本文将搜索到的Cell 重复堆叠成最终的网络。
每个Cell由两个输入节点、一个输出节点和若干中间节点组成。每个中间节点都和其之前的所有节点相连,每两个节点之间有若干可供选择的候选操作。整个搜索空间可以使用有向无环图表示,其中,边代表各种操作(如卷积或者池化等),节点代表特征图。所有中间节点的输出拼接起来作为最终的输出。
如果令最终搜索到的网络架构中每个中间节点有两个输入,那么每个中间节点可以使用一个四元数组(s1,o1,s2,o2)表示,其中,s1、o1表示该节点的第一个输入的前继节点与其所对应的操作,s2、o2表示该节点的第二个输入的前继节点与其所对应的操作。图1 给出了有4 个中间节点的网络的编码方式及其对应的网络。本文分别使用avg_pool_3×3 和max_pool_3×3 表示3×3 平均 池化和3×3 最大 池化,使 用sep_conv_3×3 表 示3×3 可分离卷积,使 用dil_conv_3×3 表示3×3 空洞卷积。在图1 中,中间节点4 所选择的两个前继节点分别是节点1 和节点3,节点1 到节点4 之间的操作为3×3 空洞卷积,节点3到节点4 之间的操作为5×5 空洞卷积。
图1 编码方式示意图Fig.1 Schematic diagram of coding mode
假设搜索空间有n个中间节点,每两个节点之间有m个候选操作,由于Normal Cell 和Reduction Cell是分别独立搜索的,因此该搜索空间中所有可能的神经网络结构的个数Tn可由式(1)计算得到:
当存在4 个中间节点,每两个节点之间存在10 种候选操作方式时,搜索空间中存在1013种不同的神经网络架构。
为提高神经网络架构搜索的效率,本文提出一个基于有偏采样的连续进化神经架构搜索方法。该方法在演化计算每一代对超网络进行少量的训练,子代网络将直接继承超网络的权重进行性能评估而不需要重新训练。为了在搜索过程中减少权重耦合同时保证算法的全局搜索能力,本文提出有偏采样的超网络训练策略。算法1 给出了基于有偏采样的连续进化神经架构搜索算法的伪代码。
本文使用采样训练的方式训练超网络的参数。每个被采样到的神经网络个体解码之后都对应超网络中的一个子网络。使用W表示超网络的权重,ci表示第i个被采样的个体,ωi表示第i个被采样的个体的权重,那么ωi=W⊙ci,其中,⊙表示仅保留超网络中与个体ci相关的操作的权重信息。以x表示输入图片,y表示对应的标签,fi(x)表示第i个采样子网络个体对输入图片x的预测结果,那么第i个子网络的预测损失可由式(2)计算得到:
其中:Li表示损失函数。本文使用标准梯度下降法更新子网络的参数。
由于超网络中保存着所有父代网络架构的权重信息,新生成的子代个体只要直接继承超网络中对应节点的权重就相当于继承了父母的权重。这种方法加速了种群中个体评估过程。
由于子代直接继承超网络中对应节点的权重信息并进行性能评估选出父代个体,因此超网络的预测性能对子代网络的排序精度起着决定性的作用。在超网络的搜索空间中,往往有数以亿计的可选择的网络架构,在这些架构中,绝大多数网络性能是很差的。本文的目的并不是获取每一个子网络的绝对精度,而是获取它们之间的相对排序。由于所有的子网络共享一组权重参数,如果对所有的子网络进行均等训练,不仅会浪费大量的资源,还会加重超网络的权重耦合。基于这一考虑,本文提出了有偏采样的训练策略。在超网络训练过程中,本文在保证算法全局搜索能力的同时,尽可能偏向于训练当前表现优异的神经架构。
如图2 所示,本文采用一个超参数α,在超网络训练过程中随机生成一个随机数,如果这个随机数大于α,则在当前种群中使用二元锦标赛选择法选择一个子网络架构进行单路径训练,否则随机生成一个子网络架构对超网络进行单路径训练。这种训练方法使得超网络在训练过程中更偏向于训练当前表现优异的网络。虽然算法在前期由于超网络训练不充分,可能存在不稳定的现象,但随着种群的更新,算法不断趋向于稳定并表现出优秀的训练结果。
图2 有偏采样Fig.2 Biased sampling
算法2 给出了基于有偏采样的超网络参数优化算法的伪代码。
选择、交叉、变异操作被用来产生子代个体。为了防止算法缺乏多样性从而导致过早收敛,本文采用二元锦标赛选择法选择父母个体。具体来说,从种群中随机选择两个个体,然后选择出这两个个体中较优的一个个体作为父母的一方,并以同样的方法选择出父母的另一方。然后,父母双方将会经历交叉和变异操作产生新的个体。下面详细介绍交叉和变异操作。
2.2.1 交叉操作
本文提出两种交叉方式:节点层面的交叉和操作层面的交叉。
对于节点层面的交叉,新生成个体的每个中间节点的连接方式由父母双方中随机一方的相对应节点连接的方式决定。图3(a)给出一个有4 个中间节点的Cell 在节点层面交叉的示意图。子代个体的4 个中间节点分别由父母1、父母2、父母2、父母1决定。
图3 交叉操作Fig.3 Cross operation
操作层面的交叉指的是子代个体中每个中间节点的第一个连接方式由父母一方决定,第二个连接方式由父母另一方决定。操作层面的交叉存在一个问题,例如在图3(b)中,如果父母2 的第一个中间节点的两个前继节点分别为0、1 而不是1、0,那么经过操作层面的交叉之后,子代个体第一个中间节点的两个前继节点为1、1 或者0、0,这显然是不合理的,因此,在遇到这种情况时,本文选择节点层面的交叉操作。
2.2.2 变异操作
变异操作可以增加结构的多样性,从而增强算法的全局探索能力。本文使用了交换和更改两种变异方式。如图4(a)所示,交换指的是保持节点的前继节点不变,但是将节点的两个前继节点所对应的操作方式互换。图4(b)给出了更改操作示意图,更改指的是在符合编码规则的前提下,随机更改某个中间节点的前继节点或者对应的操作。
图4 变异操作Fig.4 Variation operation
为验证基于有偏采样的连续进化神经架构搜索方法的性能,本文首先在神经架构搜索数据集NATS-Bench[11]上探索 有偏采 样阈值α对于超网络预测能力的影响,然后在广泛使用的CIFAR-10 和CIFAR-100 上验证OEvNAS 的图片分类精度并结合实验结果阐述所提算法的优越性。
CIFAR-10 和CIFAR-100 是被广泛使用的图像分类数据集。CIFAR-10 中包含60 000 张32×32 像素的图片,这些图片被分为10 类,其中有50 000 张训练图片和10 000 张测试图片。CIFAR-100 包含100 类图片数据,其中每一类包含500 张训练图片和100 张验证图片。训练图片被用来训练搜索到的神经架构,验证图片被用来验证搜索的神经架构的性能。
NATS-Bench 是一个广泛使用神经架构搜索数据集。该数据集包含了15 625 种不同的神经网络架构及其在CIFAR-10、CIFAR-100 和ImageNet16-120上的分类精度。
在神经架构搜索过程中,首先对超网络进行少量的预训练,然后使用演化计算进行神经架构搜索。本文将种群大小设置为50 并使用有偏采样策略训练超网络,训练过程中batchsize 大小设置为64,初始学习率设置为0.025,并使用余弦退火策略更新学习率。将搜索到的最后一代网络架构中性能排在前三的3 个挑选出来进行重训练,并选出综合性能最优的一个神经架构作为最终的搜索结果。
在新一代个体生成过程中,使用二元锦标赛选择法选出两个个体作为父代。两个父代将以0.5 的概率进行节点层面交叉或者操作层面交叉。将变异率设置为0.1,变异个体将以0.5 的概率进行交换或者更改的变异操作。
本文的所有搜索和重训练过程都是在CUDA11.4 上进行的,采用的PyTorch 版本是1.11,采用的显卡是NVIDIA GeForce GTX 3090。
实验1有偏采样策略性能验证
基于有偏采样的训练策略不仅减少了超网络权重耦合,同时提高了超网络的训练效率。为验证有偏训练策略的有效性,设计一组基于NATS-Bench 的实验。
首先使用提出的基于有偏采样的连续神经架构搜索方法在NATS-Bench 搜索空间上进行神经架构搜索,然后使用NATS-Bench 数据集给出的精度对搜索到的架构进行评估。为了对搜索空间进行精简,实验过程中删除了NAS-Bench 中的“none”操作。
从表1 所示的实验结果可以看出,OEvNAS 除了在CIFAR-10 数据集上取得了第二高平均测试精度外,在其他数据集上均取得了最高的平均测试精度和验证精度(加粗表示)。事实上,在3 次独立实验中,OEvNAS 在CIFAR-10 上所获得的最高测试精度是94.29%,这仍是所有算法中最高的。
表1 在NATS-Bench 上的分类精度Table 1 Classification accuracy on NATS-Bench %
为验证有偏采样阈值α对算法性能的影响,挑选3 次独立实验搜索到的架构在CIFAR-10 上的验证精度进行分析。如图5 所示,对于3 个不同的随机数种子,OEvNAS 都呈现出了随着α的增加精度先增长后下降的趋势。在3 次独立实验中,算法有2 次在α=0.4时取得了最优的分类精度,有1 次在α=0.6 时取得了最优的分类精度。
图5 α 对分类精度的影响Fig.5 Influence of α on classification accuracy
采用有偏采样的训练方法使得网络在训练过程中更倾向于训练当前表现性能优越的神经架构。由于不同的子网络是共享超网络权重的,这就导致一个操作的权重可能被数以千计的网络共用,超网络权重存在着严重的耦合现象。在训练超网络的时候,大量表现较差的网络可能对超网络性能衡量起到负面的干扰作用。通过引入有偏采样,本文更倾向于从当前种群中选出表现较为优异的子网络训练超网络,这样不仅减少了权重耦合,同时提高了超网络的训练效率。
有偏采样的引入同时导致了一个问题:超网络在训练过程中往往倾向于采样那些表现性能优异的子网络,导致这些网络会受到一些不公平的优待,从而减小其他子网的比较优势。随着演化的进行,种群中的个体也是在不停地动态更新的,有偏采样虽然会使表现优异的个体得到较多的训练,但并不阻止其他个体进入种群。如果α值设置得当,可以在超网络性能和全局搜索能力之间取得平衡。下文实验结果将验证,当α值取0.4~0.6 时,搜索得到的网络架构取得了最佳的分类精度,此时既保证了算法的全局探索能力,同时也使超网络达到了最高的预测性能。
实验2算法分类精度验证
根据在NATS-Bench 数据集上的实验结果,将有偏采样的阈值α设置为0.4,并在本文设计的搜索空间上进行25 个epoch 的神经架构搜索。将搜索到的Normal Cell 和Reduction Cell 重复堆叠成20 层的网络后使用随机梯度下降法对搜索到的网络进行网络重训练。重训练过程中batchsize 大小设置为64,初始学习率为0.025 并使用余弦退火策略更新学习率。为了进行数据增强,防止过拟合,在网络重训练的过程中采用Cutout 方法并使用辅助损失策略,Cutout裁剪尺寸为16。
表2 中给出了OEvNAS 在CIFAR-10、CIFAR-100上的分类精度并与近几年的主流算法进行了对比。为验证本文算法在不同的参数量要求下都能有优异的表现并可减少实验误差,本文进行多次实验。OEvNAS-A、OEvNAS-B、OEvNAS-C 所示3 行分别给出了本文算法在不同参数量下的分类精度表现。从表2 中可以看出,OEvNAS 搜索到的神经网络架构在CIFAR-10 上最高取得了97.67%的分类精度。最重要的是,由于本文在网络训练的过程中使用了权重继承策略和有偏采样的权重训练方法,因此可以在较少的计算资源内完成架构的搜索。与传统基于演化计算的神经架构搜索方法相比,极大地减少了搜索过程中所耗费的资源,并且提高了搜索到的神经结构的性能。
表2 在CIFAR-10 和CIFAR-100 上的分类精度 Table 2 Classification accuracy on CIFAR-10 and CIFAR-100
本文提出一种基于One-shot 模型的演化神经架构搜索方法(OEvNAS)。在超网络的训练过程中,提出有偏训练策略解决权重耦合问题。基于CIFAR-10 和CIFAR-100 进行实 验,验 证OEvNAS 搜索到的神经架构的分类性能。实验结果表明,本文模型在测试数据集上取得了较好的分类精度。笔者认为现在使用的搜索空间中存在大量的冗余结构,更优化的搜索空间的设计可以在提高搜索精度的同时减小算法的计算复杂度,因此,后续将致力于改进搜索空间的设计,。