automl-神经架构搜索(NAS)-综述

参考文献:
AutoDL论文解读(一):基于强化学习的开创性工作
AutoDL论文解读(二):基于遗传算法的典型方法
AutoDL论文解读(三):基于块搜索的NAS
AutoDL论文解读(四):权值共享的NAS
AutoDL论文解读(五):可微分方法的NAS
AutoDL论文解读(六):基于代理模型的NAS
AutoDL论文解读(七):基于one-shot的NAS

超越 EfficientNet与MobileNetV3,NeurIPS 2020 微软NAS方向最新研究(基于优先路径的网络蒸馏)


综述文章

Neural Architecture Search: A Survey (神经网络结构搜索survey)
在这里插入图片描述

神经架构搜索的几个研究视角

在这里插入图片描述

在这里插入图片描述

搜索空间/模型结构

搜索空间定义了NAS算法可以搜索的神经网络的类型,同时也定义了应该如何描述神经网络结构。神经网络所实现的计算可以抽象成一个无孤立节点的有向无环图(DAG),图的节点代表神经网络的层(卷积网络中的特征图),边代表数据的流动(进行的操作:卷积、池化等)。每个节点从其前驱节点(有边射入)接收数据,经过计算之后将数据输出到后续节点(有边射出)。理论上说,只要是无孤立节点的DAG,都是合法的神经网络结构。按照不同的尺度,神经网络的结构定义包含如下层次的信息:

(1)网络的拓扑结构。网络有多少个层,这些层的连接关系。最简单的神经网络是线性链式结构,其对应的图的每个节点最多只有一个前驱,一个后续,类似于数据结构中的链表。早期的全连接神经网络,卷积神经网络都是这种拓扑结构。Inception、ResNet、DenseNet中的节点允许有多个前驱,多个后续,从而形成了多分支、跨层连接结构,它们是更复杂的图。在描述网络的拓扑结构时,一般采用前驱节点来定义,即定义每个节点的前驱节点,一旦该信息确定,则网络拓扑结构确定。

(2)每个层的类型。除了第一个层必须为输入层,最后一个层必须为输出之外,中间的层的类型是可选的,它们代表了各种不同的运算即层的类型。典型有全连接,卷积,反卷积,可分离卷积,空洞卷积,池化,激活函数等。但这些层的组合使用一般要符合某些规则。

(3)每层内部的超参数。卷积层的超参数有卷积核的数量,卷积核的通道数,高度,宽度,水平方向的步长,垂直方向的步长等。池化层的超参数包含池化核高度,池化核宽度,水平方向步长,垂直方向步长。全连接层的超参数有神经元的数量。激活函数层的超参数有激活函数的类型,函数的参数(如果有)等。

为了提高搜索效率,有时候会搜索空间进行限定或简化。在某些NAS实现中会把网络切分成基本单元(cell),通过这些单元的堆叠形成更复杂的网络。基本单元由多个节点(神经网络的层)组成,它们在整个网络中重复出现多次,但具有不同的权重参数。另外一种做法是限定神经网络的整体拓扑结构,借鉴于人类设计神经网络的经验。这些做法虽然减少了NAS算法的计算量,但也限定了算法能够寻找的神经网络的类型。

由于描述神经网络结构的参数含有离散数据(如拓扑结构的定义,层的类型,层内的离散型超参数),因此网络结构搜索是一个离散优化问题。定义结构的参数数量一般比较大,因此属于高维优化问题。另外,对于该问题,算法不知道优化目标函数的具体形式(每种网络结构与该网络的性能的函数关系),因此属于黑盒优化问题。这些特点为NAS带来了巨大的挑战。

搜索策略

强化学习

进化学习

darts

其它

何凯明团队

Exploring Randomly Wired Neural Networks for Image Recognition
论文通过控制变量法做了两件事:

  1. 在同一个网络生成器下,比较生成网络的性能
  2. 在不同网络生成器下,比较生成网络的性能

结论就是:同一个网络生成器下产生的相同节点的网络结构的性能差别不大;不同网络结构生成器产生的网络结构的性能存在差别;因此在NAS的探索中我们可以通过以上观点缩小搜索空间,花较少的时间在搜索空间上,与此同时花更多的时间在设计一个优越的网络生成器上。

微软

Efficient forward architecture search–2019

加速技术/模型评估

性能预测/曲线外推(performance prediction/proxy /surrogate-based)

Domhan 等提出推测一开始的学习曲线,并终止那些预计性能不好的网络结构的训练,借此来加速结构搜索的过程。S,K,B,R等考虑使用网络架构的超参数来预测哪些 部分学习的曲线 是最有用的。
Liu 提出训练一个代理网络来预测新结构的性能,他不使用学习曲线外推法而是基于结构/cell 的特点来预测性能。 预测网络性能的主要挑战是:为加快搜索过程,需要在对较大的搜索空间进行较少的评估的基础上进行良好的预测。

低保真度/代理(Lower fidelity estimates/ proxy metrics)

为了减少计算负担,可以基于完全训练后的实际性能的 lower fidelities来估测性能。 这种 lower fidelities 包括:

  • 短一些的训练时间、s
  • 在训练集的子集上训练、
  • 在低分辨率的图像上训练、
  • 或者每层使用少一些的通道数。

虽然这些lower fidelities 的近似能够减少训练花费, 他们同时也引入误差。但只要搜索策略只依赖于不同结构的排名并且相对排名保持稳定,这个误差将不是问题。 可是最近的研究表明,当这种近似估计与完全评价之间的差异较大时,这种相对排名可能变化很大,并强调这种误差会逐渐增加。

迁移方法

在NAS过程中,最为耗时的其实就是对于候选模型的训练。初版的NAS因为对每个候选模型都是从头训练的,因此会相当耗时。一个直观的想法是有没有办法让训练好的网络尽可能重用,目前主要有两种途径:

  • 一种思路是利用网络态射从小网络开始做加法,所谓网络态射就是将网络进行变形,同时保持其功能不变。这样带来的好处是变形后可以重用之前训练好的权重,而不用重头开始训练。例如上海交大和伦敦大学学院的论文《Reinforcement Learning for Architecture Search by Network Transformation》中将Network morphisms(网络态射)与神经网络搜索结合,论文《Simple And Efficient Architecture Search for Convolutional Neural Networks》也使用了网络态射来达到共享权重的目的,只是它使用了爬山算法为搜索策略;
  • 另一种思路就是从大网络开始做减法,如One-Shot Architecture Search方法,就是在一个大而全的网络上做减法。
a 网络态射/参数继承

加速性能估测的另一种方法是使用预训练好的网络结构的参数来初始化新结构的权重。实现这一目标的方法,称为网络态射(Wei等人),这种方法允许修改架构,同时保持网络所代表的功能不变。这就允许连续的增加网络容量并保持高性能而无需从头开始训练。连续训练几个epoch 也能够利用网络态射带来的额外结构。这些方法的优点是它能够对网络结构的深度不设上限,但是严格的网络态射只能使网络变大,这样就可能使网络过于复杂。之后E提出允许网络结构减小的网络态射来改进。

  • 一般的网络设计方法是首先设计出一个网络结构,然后训练它并在验证集上查看它的性能表现,如果表现较差,则重新设计一个网络。可以很明显地发现这种设计方法会做很多无用功,因此耗费大量时间。
  • 而基于网络态射结构方法能够在原有的网络结构基础上做修改,所以其在很大程度上能保留原网络的优点,而且其特殊的变换方式能够保证新的网络结构还原成原网络,也就是说它的表现至少不会差于原网络。
    在这里插入图片描述
    相关文章:
    Net2net: Accelerating learning via knowledge transfer,” arXiv preprint , 2015.
    Efficient multi-objective neural architecture search via lamarckian evolution. 2018
    Efficient architecture search by network transformation,” AAAI, 2018
    Simple And Efficient Architecture Search For Neural Networks, (NASH,爬山法,网络态射),2017
    Path-Level Network Transformation for Efficient Architecture Search,2018
    解读:Path-Level Network Transformation for Efficient Architecture Search 神经网络架构搜索
b 参数共享(One-Shot Models/Weight Sharing)

one-shot模型的基本套路:

  • 第一步,训练一个one-shot模型(或者超图),得到超图的权重参数。
  • 第二步,通过超图生成许多子图,每个子图都是一个网络架构。子图继承了超图的权重参数(不再训练),用继承的参数直接进行评估,得到各个子图的评估值并进行排序。(一种简单的生成子图的方式:超图包含了全部的连接边,将超图中的部分边删除,就可得到多个子图)
  • 第三步,将最好的子图遴选出来,在训练集上从头开始训练,得到该子图的权重参数,并用该参数在测试集上进行评估。

(以下摘自:https://blog.csdn.net/qq_20852429/article/details/83573345)
One-Shot Architecture Search是另一种加速性能评估的有效的方法,它将所有体系结构视为super graph的不同子图,并不同子图在super graph 中的有共同边的结构之间共享权重。只有一个简单的 one-shot model 需要训练,然后通过从one-shot model 中继承权重来评估网络结构的性能,这样便不再需要其他的训练。这样就大大加快了模型性能的评估。这种方法通常会产生很大的偏差,因为它严重低估了架构的实际性能; 然而,它对架构的性能排序是有一定可靠性的,因为估计的性能与实际性能密切相关。不同的one-shot NAS 方法的区别在于 one-shot model 是如何训练得到的: ENAS学习了一个RNN控制器,这个控制器从搜索空间中采样结构,并且基于 通过RL获得的近似梯度 来训练 one-shot model。DARTS结合搜索空间的连续松弛性来优化 one-shot model 的所有权重,搜索空间通过在 one-shot model 的每个边缘上放置 候选操作 的混合来获得。Bender 等只训练one-shot model 一次,并表明 在训练过程中使用 path dropout 随机的使模型的一些部分失活就足够了。Bender等人的方法可以看作使用固定的分布,而ENAS和DARTS在训练期间优化了网络结构上的分布。Bender 获得的高性能表明: 权值共享和固定分布两者的组合 可能是 one-shot NAS 的唯一必要条件。与这些方法相关的是 hypernetworks 的 meta-learning,它为新的网络结构生成权重, 因此只需要训练 hypernetworks 而不需要训练网络本身。他他们的主要区别在于网络的权重不是严格共享的,而是由 hypernetwork 生成的。

one-shot NAS 方法的局限在于 supergraph 对子图确定了一个先验约束。此外,在网络结构搜索过程中,supergraph被要求常驻GPU的方法 相应的 就需要使用较小的 supergraph 和 搜索空间, 因此这种方法通常会与基于 cell 的搜索空间结合使用。虽然基于权重共享的方法已经大大减少了NAS所需的计算资源,但是如果结构的采样分布与 one-shot model 一起优化,目前尚不清楚它们会在搜索中引入哪些偏差。 例如:探索搜索空间某些部分的初始偏差可能会导致 one-shot model 的权重更好地适应这些体系结构,这反过来会加强搜索对搜索空间这些部分的偏差。这可能导致NAS的过早收敛,并且可能是Bender使用的固定采样分布的一个优点。 一般而言,对不同性能估计器引入的偏差进行更系统的分析将是未来工作的理想方向。

ENAS参数共享的原理
参考:https://zhuanlan.zhihu.com/p/35339663
图解高效神经网络结构搜索(ENAS)

ENAS也是一种NAS实现,因此也是需要人类先给出基本的网络结构搜索空间,这也是目前ENAS的一种限制(论文中并没有提哦)。
ENAS需要人类给出生成的网络模型的节点数,我们也可以理解为层数,但如果人类说只有10层那ENAS是不可能产出一个超过10层网络结构,更加不可能凭空产生一个ResNet或者Inception

ENAS为什么比其他NAS高效因为做了权值共享(Parameter sharing)。 权值共享是怎样实现的?

ENAS定义了节点(Node)的概念,这个节点和神经网络中的层(Layer)类似,但因为Layer肯定是附着在前一个Layer的后面,而Node是可以任意替换前置输入的。
事实上,ENAS要学习和挑选的就是Node之间的连线关系,通过不同的连线就会产生大量的神经网络模型结构,从中选择最优的连线相当于“设计”了新的神经网络模型。
下面有一个较为直观的图,对于普通的神经网络,我们一般每一层都会接前一层的输入作为输出,当然我们也可以定义一些分支不一定是一条线的组合关系,而ENAS的每一个Node都会一个pre-node index属性,在这个图里Node1指向了Node0,Node2也指向了Node0,Node3指向了Node1。
在这里插入图片描述
目前ENAS可以做的就是帮你把连线改一下然后生成一个新的模型,而节点(layer)数是固定的,但这个就是ENAS共享权重的基础,而且可以帮你以极低的代码帮你调整模型结构生成一个更好的模型,接下来就是本文最核心的ENAS的E(Efficient)的实现原理介绍了。

当我们把上图中所有Layer连成一条直线的模型改成右边交叉连线的模型,显然两者是不同的Graph,而前一个导出模型权重的checkpint是无法导入到后一个模型中的,但直观上看这几个节点位置本没有变,如果输入和输出的Tensor的shape不变,这些节点的权重个数是一样的,也就是说左边Node0、Node1、Node2、Node3的权重是可以完全复制到右边对应的节点的

这也就是ENAS实现权重共享的原理:

  • 首先会定义数量固定的Node,然后通过一组参数去控制每个节点连接的前置节点索引,有了一组参数就可以表示一个固定神经网络结构。
  • 多组参数就对应多个模型,从多组参数中选择好的参数组。
  • 只要用前面提到的优化算法如贝叶斯优化、DQN来调优选择最好的这组参数就可以了(控制器的事)。

那评估模型也是先生成多组参数,然后用新的网络结构来训练模型得到AUC等指标吗?答案是否定的,如果是这样那就和普通的NAS算法没什么区别了,因为训练模型后评估就是非常不Efficient的操作。
ENAS的模型评估方法:

  • 第一步:在多个模型中选择某个模型(是不是第一个产生的模型?)进行训练,得到各个节点的参数权重;
  • 第二步:其它各组模型用相同的一组权重(每个节点的参数权重),各自在未被训练的验证集中做一次Inference,最终选择AUC或者正确率最好的模型结构。
  • 第三步:共享权重的更新。第一步、第二步这个过程会进行很多次,而这组共享的权重也会在一段时间后更新,例如我找个一个更好的模型结构了,就可以用这个接口来训练更新权重,然后看有没有其他模型结构在使用这组权重后能在验证机有更好的表现。

稍微总结一下,因为ENAS生成的所有模型节点数是一样的,而且节点的输入和输出都是一样的,因此所有模型的所有节点的所有权重都是可以加载来使用的,因此我们只需要训练一次模型得到权重后,让各个模型都去在验证集做一个预估,只要效果好的说明发现了更好的模型了。实际上这个过程会进行很多次,而这组共享的权重也会在一段时间后更新,例如我找个一个更好的模型结构了,就可以用这个接口来训练更新权重,然后看有没有其他模型结构在使用这组权重后能在验证机有更好的表现。

darts原理
DARTS和ENAS很像,也是从DAG中找子图,并且同样采用了weight sharing,主要的区别在于搜索空间和搜索算法上。搜索空间比较类似NASNet search space,搜索算法则是采用了可微分的方式。

DARTS也是搜cell然后按照一定的模式堆起来,在搜索算法上与之前的方法最大的区别在于DARTS选择某个操作的时候并不是像之前按照RNN的输出概率进行采样,而是把所有操作都按照权重(不是直接加权,先将权重softmax归一化)加起来,那这样权重就在计算图里面了,在计算验证集loss之后就可以backward计算权重的梯度,直接通过梯度下降来优化权重。搜索的过程也就是优化权重的过程,最后保留权重最大的操作就是最后搜到的结构。

评价标准

NAS-Bench-101: Towards Reproducible Neural Architecture Search:第一个NAS查表数据集

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值