精华内容
下载资源
问答
  • 神经网络架构搜索(Neural Architecture Search)杂谈
    万次阅读 多人点赞
    2018-12-02 13:24:26

    一、背景

    机器学习从业者被戏称为“调参工”已经不是一天两天了。我们知道,机器学习算法的效果好坏不仅取决于参数,而且很大程度上取决于各种超参数。有些paper的结果很难重现原因之一就是获得最优超参值往往需要花很大的力气。超参数的自动搜索优化是一个古老的话题了。深度学习兴起前它主要针对传统机器学习算法中的模型超参数,比较经典的方法有随机搜索(Random search), 网格搜索(Grid search),贝叶斯优化(Bayesian optimization),强化学习(Reinforcement learning), 进化算法(Evolutionary Algorithm)等,统称为Hyperparameter optimization(HO)。像Auto-sklearn和Auto-WEKA都是比较有名的HO框架。对于深度学习说,超参数主要可为两类:一类是训练参数(如learning rate,batch size,weight decay等);另一类是定义网络结构的参数(比如有几层,每层是啥算子,卷积中的filter size等),它具有维度高,离散且相互依赖等特点。前者的自动调优仍是HO的范畴,而后者的自动调优一般称为网络架构搜索(Neural Architecture Search,NAS)。这些年来大热的深度神经网络,虽然将以前很另人头疼的特征提取自动化了,但网络结构的设计很大程度上还是需要人肉,且依赖经验。每年各AI顶会上一大批论文就是在提出各种新的更优的网络子结构。一个自然的诉求就是这个工作能否交给机器来做。

    本质上网络架构搜索,和围棋类似,是个高维空间的最优参数搜索问题。既然围棋上AlphaGo可以战胜人类,那在网络架构搜索上机器最后也很有可能可以取代人类。我们知道,AlphaGo主要是基于强化学习。2016年,MIT和Google的学者们差不多在同一时间发表论文,将强化学习引入到深度神经网络结构的搜索中,取得了不俗的成果。在几个小型的经典数据集上击败同时代同级别的手工设计网络。但这个方法有个缺点是消耗计算资源巨大,基本就不是一般人玩得起的。这个坑也是后面一大波工作改进的重点。尔后,Google发布AutoML平台,将之带入公众视野。现在这块领域无论是在学界还是在工业界,都成为香饽饽的热点。本文主要杂聊NAS中的搜索策略,加速方法,以及变体与扩展。涉及点及举例如图所示。
    在这里插入图片描述

    NAS的套路大多是这样的:先定义搜索空间,然后通过搜索策略找出候选网络结构,对它们进行评估,根据反馈进行下一轮的搜索。

    首先定义搜索空间。搜索空间定义基本是和DNN的发展相应。可以看到,早期的CNN大都是链式结构,因此初期的NAS工作中搜索空间也主要考虑该结构,只需考虑共几层,每层分别是什么类型,以及该类型对应的超参数。再后面,随着像ResNet,DenseNet,Skip connection这样的多叉结构的出现,NAS中也开始考虑多叉结构,这样就增大了组合的自由度可以组合出更多样的结构。另外,很多DNN结构开始包含重复的子结构(如Inception,DenseNet,ResNet等),称为cell或block。于是NAS也开始考虑这样的结构,提出基于cell的搜索。即只对cell结构进行结构搜索,总体网络对这些cell进行重叠拼接而成。当然如何拼接本身也可以通过NAS来学习。这样相当于减少自由度来达到减少搜索空间的目的,同样也可以使搜索到的结构具有更好的数据集间迁移能力。为了让搜索模型可以处理网络结构,需要对其编码。搜索空间中的网络架构可以表示为描述结构的字符串或向量。

    二、搜索策略

    网络结构的搜索策略有很多。像随机搜索就是比较简单,但相对低效的做法,通常用作baseline。其它研究得比较多的有几类:

    • 基于强化学习(Reinforcement learning):如上面提到的,开创性的工作主要是2016年由MIT发表的《Designing Neural Network Architectures using Reinforcement Learning》和Google发表的《Neural Architecture Search with Reinforcement Learning》两篇文章。前者提出MetaQNN,它将网络架构搜索建模成马尔可夫决策过程,使用RL方法(具体地,Q-learning算法)来产生CNN架构。对于CNN的每一层,学习体会选取层的类型和相应参数。生成网络结构后训练后得到的评估精度作为回报。这个回报用以参于Q-learning训练。作者在SVHN、CIFAR-10和MNIST三个数据集上进行了实验。用了10个GPU花费8-10天时间,基本可以击败同『重量级』的网络。后者采用RNN网络作为控制器来采样生成描述网络结构的字符串,该结构会用于训练并得到评估的准确率,然后使用了REINFORCE算法(早期的RL方法,在他们后面的工作中又使用了比较新的更加sample efficient的PPO算法)学习控制器的参数,使之能产生更高准确率的网络结构。它动用了800个GPU,最终在CIFAR-10数据集上击败了具有类似网络架构的人工设计模型,在PTB数据集上达到了新的SOTA水平,并且还找到了比广泛使用的LSTM更优的结构。
    • 基于进化算法(Evolutionary algorithm):在Google的论文《Large-Scale Evolution of Image Classifiers》中,进化算法被引入来解决NAS问题,并被证明在CIFAR-10和CIFAR-100两个数据集上能从一个简单的初始条件开始达到高的精度。首先,网络结构会进行编码,称为DNA。演进过程中会维扩护网络模型的集合,这些网络模型的fitness通过它们在验证集上的准确率给出。在进行过程中,会随机选取两个模型 ,差的那个直接被干掉(淘汰),好的那个会成为父节点(这种方式为tournament selection)。子节点经过变异(就是在一些预定的网络结构变更操作中随机选取)形成子结点。子结点经过训练和验证过放入集合。该作者在后续论文《Regularized Evolution for Image Classifier Architecture Search》中,提出了tournament selection的变体aging evolution,让进化中的选择倾向于比较『年轻』的模型,它可以帮助更好地进行探索。经搜索出的最优网络结构称为AmoebaNet(源码链接)。另外作者对强化学习,进化算法和随机搜索作了比较,发现强化学习和进化算法从准确率上来说表现很好。与强化学习相比进化算法搜索得更快(尤其是早期),且能得到更小的模型。随机搜索在学习到的网络准确率上会次于前面两者,但差距不是那么大(尤其是小数据集上)。
    • 基于梯度的方法(Gradient-based method):这是比较新的一类方法。前面提到的基于强化学习和进化算法的方法本质上都还是在离散空间中搜索,它们将目标函数看作黑盒。我们知道,如果搜索空间连续,目标函数可微,那基于梯度信息可以更有效地搜索。CMU和Google的学者在《DARTS: Differentiable Architecture Search》一文中提出DARTS方法。一个要搜索最优结构的cell,可以看作是包含N个有序结点的有向无环图。结点代表隐式表征(例如特征图),连接结点的的有向边代表算子操作。DARTS方法中最关键的trick是将候选操作使用softmax函数进行混合。这样就将搜索空间变成了连续空间,目标函数成为了可微函数。这样就可以用基于梯度的优化方法找寻最优结构了。搜索结束后,这些混合的操作会被权重最大的操作替代,形成最终的结果网络。另外,中科大和微软发表的论文《Neural Architecture Optimization》中提出另一种基于梯度的方法。它的做法是先将网络结构做嵌入(embedding)到一个连续的空间,这个空间中的每一个点对应一个网络结构。在这个空间上可以定义准确率的预测函数。以它为目标函数进行基于梯度的优化,找到更优网络结构的嵌入表征。优化完成后,再将这个嵌入表征映射回网络结构。这类方法的优点之一就是搜索效率高,对于CIFAR-10和PTB,结合一些像权重共享这样的加速手段,消耗可以少于1 GPU/天。

    其它还有如基于Boosting、MCTS、BO,Hill Climbing Algorithm等的方法,如论文《Adaptive structural learning of artificial neural networks》,《Deeparchitect: Automatically designing and training deep architectures》,《Neural architecture search with bayesian optimisation and optimal transport》,《Simple And Efficient Architecture Search for Convolutional Neural Networks》。这些方法相关讨论相对少些,就不详细展开了。

    三、加速

    上面提到,由于NAS中涉及的搜索空间巨大,而且其性能评估往往得涉及模型的训练,导致消耗的资源很大。像前面提到的基于强化学习和进化算法的方法,对于CIFAR这样不算大的数据集,基本都是用了上千GPU/天,家里没矿的或是小公司可能连研究的门槛都没到,可以说基本还没法平民化。因此,后面的一大批论文就是和这个问题作斗争。其中比较典型的加速方法有几类:

    • 层次化表示(Hierarchical Representation):如果要对一整个神经网络结构进行搜索,搜索空间是非常大的。Google的论文《Learning Transferable Architectures for Scalable Image Recognition》提出NASNet(源码链接),它假设整体网络是由cell重复构建的,那搜索空间就缩小到对两类cell(normal cell和reduction cell)结构的搜索上,从而大大减小了搜索空间。在CIFAR数据集上达到了比同期SOTA网络更高的精度,同时这样的分解也有助于知识的迁移,学习到的cell结构可以帮助在更大的图片分类数据集以及在物体检测数据集上得到SOTA的结果。注意在这个方法中,虽然cell结构是学习得到的,但如何重复和组合这些cell的元网络结构是预定义的。更拓展地,CMU和Google发表的论文《Hierarchical Representations for Efficient Architecture Search》中定义了一种层次化的网络结构:最底层为像卷积和池化等基本组件;中间层为这些组件所构成的图;最高层就是由这些图层叠而成的整体网络。
    • 权重共享(Weight sharing):在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方法,就是在一个大而全的网络上做减法。Google的论文《Efficient Neural Architecture Search via Parameter Sharing》提出了ENAS,其核心思想也是让搜索中所有的子模型重用权重。它将NAS的过程看作是在一张大图中找子图,图中的边代表算子操作。基本方法和《Neural Architecture Search with Reinforcement Learning》中的类似,使用基于LSTM的控制器产生候选网络结构,只是这里是决定大图中的哪些边激活,以及使用什么样的操作。这个LSTM控制器的参数和模型参数交替优化。由于权重共享,使用Nvidia GTX 1080Ti可以在一天内完成搜索,实现了1000x的提速。Auto-Keras就是基于ENAS的思想加以改造实现的。还有一个比较特别的思路,论文《SMASH: One-Shot Model Architecture Search through HyperNetworks》中对于候选模型,使用HyperNet来给出其权重,从而避免重头训练。最近,中科院的论文《You Only Search Once: Single Shot Neural Architecture Search via Direct Sparse Optimization》中提出了DSO-NAS方法,如其名称其特点是只搜一次。它始于一个完全连接的块,然后在操作间引入缩放因子,同时添加稀疏正则化来去除无用的连接,也就是去除不重要的操作,得到最优结构。文中提出可以在一个优化问题中同时学习网络结构和参数。
    • 表现预测(Performance prediction):我们知道,NAS中最费时的是候选模型的训练,而训练的目的是为了评估该结构的精度。为了得到某个网络模型的精度又不花费太多时间训练,通常会找一些代理测度作为估计量。比如在少量数据集上、或是低分辨率上训练的模型精度,或是训练少量epoch后的模型精度。尽管这会普遍低估精度,但我们要的其实不是其绝对精度估计,而是不同网络间的相对值。换言之,只要能体现不同网络间的优劣关系,是不是绝对精准没啥关系。从另一个角度思考,有没有可能基于模型结构直接预测其准确率呢。论文《Progressive Neural Architecture Search》中的关键点之一是使用了一个代理模型来指导网络结构的搜索。具体来说,这个代理模型是个LSTM模型,输入为网络结构的变长字符串描述,输出预测的验证精度。也正是有个这个利器,使得它里边提出方法即使用看起来并不复杂的启发式搜索,也能达到很好的效果。还有一个思路就是基于学习曲线来预测,这基于一个直观认识,就是我们在训练时基本训练一段时间看各种指标曲线就能大体判断这个模型是否靠谱。学习曲线预测,一种直观的想法就是外插值,如论文《Speeding up Automatic Hyperparameter Optimization of Deep Neural Networks by Extrapolation of Learning Curves》中所讨论的。之后论文《Learning Curve Prediction with Bayesian Neural Networks》中使用Bayesian neural network对学习曲线进行建模与预测。当然实际的预测中,可以不局限于单一的特征,如在论文《Accelerating Neural Architecture Search using Performance Prediction》中,结合了网络结构信息,超参数信息和时序上的验证精度信息来进行预测,从而提高预测准确性。总得来说,表现预测由于其高效性,在NAS中起到越来越关键的作用。很多的前沿方法也采用这类方法,如前面提到的《Neural Architecture Optimization》中就有预测器来基于网络表示预测其准确率。

    四、变体及扩展

    以上主要针对NAS本身的改进,且主要实验限于图像分类任务和自然语言处理,且大多只关注模型准确率。很自然的,大家就将NAS往其它的任务上应用,或者将更多因素纳入目标考虑。比如下面两项工作:

    • 语义分割:Google论文《Searching for Efficient Multi-Scale Architectures for Dense Image Prediction》将NAS拓展到主义分割领域(源码链接)。语义分割任务与图片分类相比,输入的尺寸更大。经典的语义分割网络需要特殊的结构,如空洞卷积、ASPP等来提取多尺度上下文信息。这给NAS带来了更大的挑战。这篇文章主要focus在两点:搜索空间的设计与代理任务的设计。对于搜索空间,文中提出了适合语义分割任务的DPC(Dense Prediction Cell)。对于评估精度的代理任务,由于语义分割任务与图片分类不同,往往依赖大分辨率,因此,代理任务的设计上,一方面采用小的网络backbone;另一方面将在训练集上得到的feature map cache起来重用。实验表明,机器搜到的网络在如Cityscapes、PASCAL-Person-Part和PASCAL VOC2012上能得到SOTA结果。
    • 多目标:随着各种AI场景在手机等端设备上应用需求的涌现,一些适用于资源受限环境的轻量级网络,如MobileNet,ShuffleNet开始出现并被广泛研究。自然地,NAS也开始从只考虑精度的单目标演进到多目标,如同时考虑精度、计算量、功耗等。多任务优化问题的一个挑战是往往没法找到单一解让所有子目标同时最优,所以我们找的一般是帕累托最优解。而具体到实际应用中,就涉及到多目标间tradeoff的问题。Google的论文《MnasNet: Platform-Aware Neural Architecture Search for Mobile》提出的MnasNet就是比较典型的例子。搜索方法上还是延续之前经典的RNN控制器+强化学习方法,在一个层次化搜索空间中搜索。它一方面提出带参数的优化目标,通过调节参数可以在精度和延时之间做权衡(如将延时作为硬要求或者软要求);另一方面在实现中将实际设备运行得到的推理延迟作为评估。尽管我们有模型大小、计算量和compute intensity等作为侧面的延时估计,但现实中由于延时会被很多因素影响,很难精确估计,还不如直接拿个设备来跑。。。从实验来看,能比前沿的轻量级模型找到更优的网络结构(如在ImageNet分类任务中,差不多精度下比MobileNet v2快50%)。其它比如论文《Resource-Efficient Neural Architect》中提出的RENA(Resource-Efficient Neural Architect),《PPP-Net: Platform-aware Progressive Search for Pareto-optimal Neural Architectures》中提出的PPP-Net(Platform-aware Progressive search for Pareto-optimal Net),《Efficient Multi-objective Neural Architecture Search via Lamarckian Evolution》中提出的LEMONADE(Lamarckian Evolutionary algorithm for Multi-Objective Neural Architecture DEsign),《NSGA-NET: A Multi-Objective Genetic Algorithm for Neural Architecture Search》中的NSGA-NET,都是对多目标NAS的探讨。

    NAS已在一些基本任务及数据集上证明能超越人类手工设计,那在其它深度学习相关的超参数上是否也能使用类似的思想让机器自动学习,从而得到比人工设计更好的参数,并免除人肉调参的痛苦呢。下面列举了几个这方面比较有趣的尝试。

    • 优化器:相对网络结构来说,优化器的迭代可以说是比较慢的,但每次重要的演进又很容易引人关注,因为这个太通用了。从最基本的SGD到Adagrad, Adadelta, RMSProp,Adam等更加精巧的更新方式,很多其实是加入了一些启发(如物理中的momentum概念),还是属于手工打造,实验证明。论文《Neural Optimizer Search with Reinforcement Learning》将使用在NAS上的方法拓展到了优化器(更准确地,更新公式)的优化上。与其它类似工作相比其优点之一是它输出的是更新公式,因此在不同模型和任务间具有更好的迁移能力。首先将更新规则用字符串描述,其描述了该更新公式中所使用的操作数(像梯度及其幂,和它们的指数滑动平均、噪声、Adam/RMSProp或一些常数等),应用在其上的unary函数(取负、自然底数、绝对值取对数、clip等),以及操作数之间的binary函数(加减乘除等)。然后采用NAS中类似的基于RNN的控制器,之后用验证集精度为回报来采用强化学习训练控制器。作者实验中找到了两个新的优化器 - PowerSign和AddSign,并被证明在实验数据集上强于现在常见的优化器。
    • 模型压缩:这几年,模型压缩可谓是深度学习中最为火热的分支之一。该方向对于落地到移动端上尤其重要。在AutoML的浪潮下,这项工作也有了新的拓展。MIT,西安交大和Google的论文《AMC: AutoML for Model Compression and Acceleration on Mobile Devices》主要针对模型压缩中的重要方法之一 - 剪枝(Pruning)。业界普遍认为虽然模型训练时需要复杂的结构,但训练好的模型一般有比较高的冗余度,因此可以进行裁剪,且只降低很少精度,甚至可能提高精度(由于剪枝能起到正则化效果,从而提高模型的泛化能力)。但是,剪枝策略中的参数选择是件很tricky的事。拿稀疏率来说,由于每层可能都有不同的冗余程度,因此有各自不同的最优稀疏率。虽然有不少启发式的策略,但还是需要人肉试验看效果。这篇文章提出AMC(AutoML for Model Compression)方法,引入强化学习(具体地,DDPG算法)来学习最优的参数,并且通过设计不同的回报函数可以让最后得到的模型满足不同需要(如高压缩率,或是保证精度)。实验表明,在ImageNet数据集VGG-16模型上,在计算量减少到1/4的情况下准确率比人工调参下高2.7%;另外MobileNet模型可以在准确率只掉0.1%的前提下在Android手机和Titan XP GPU上分别达到1.81和1.43倍的加速。
    • 数据增强:AutoML的意义在于把之前启发式人工设计的东西用机器搜索来替代。而深度学习尤其是视觉任务中,有一项容易被忽视但又对结果至关重要的就是数据增强,它被认为可以很大程度上在已有数据集条件下增强模型的泛化能力。另外,数据增强方法的挑战之一是它不是完全通用的,如某一特定数据集上最优的数据增强方法可能并不适用于另一数据集。这就意味着对于特定任务,我们需要找到最适合的数据增强手段。论文《AutoAugment: Learning Augmentation Policies from Data》正是做了这方面的探索,首先定义搜索空间:一个数据增强策略包含五个子策略,每个子策略包含两个图像操作,每个图像操作包含两个超参数:一个是应用该操作的概念,另一个是操作相关应用程度。考虑的操作包含shear, translate, rotate等16种。这样就把该问题很好地转化为最优参数搜索问题了。然后基本可以沿用NAS中的方法,使用一个基于RNN的控制器来给出数据增强策略,然后将应用该数据增强策略下的模型精度作为回报,使用强化学习(具体地,PPO算法)训练该控制器。作者实验表明,该方法可以在CIFAR-10, CIFAR-100, SVHN和ImageNet数据集上达到了SOTA水平。

    可以看出,要将NAS中的超参数自动调优的方法应用到其它领域,最关键的其实是搜索空间的定义和编码,而这个往往是领域相关的。其它的基本都可以沿用。可以预见,将来可能会被拓展到更多目前需要人工设计的部分。以后可能只要提供数据,从数据增强、到优化器、到网络结构,再到训练参数,都能全自动完成了。

    更多相关内容
  • 自动网络搜索(NAS)的理解

    千次阅读 2021-02-21 14:47:08
    现代的深度神经网络有时会包含多种类型的层,而且这些层不止一个。Skip connections和子模块方法也被用来促进模型的收敛,它们对可能形成的模型体系结构的空间没有限制。目前大多数的深度神经网络结构都是根据人类...

    问题定义

    现代的深度神经网络有时会包含多种类型的层,而且这些层不止一个。Skip connections和子模块方法也被用来促进模型的收敛,它们对可能形成的模型体系结构的空间没有限制。目前大多数的深度神经网络结构都是根据人类经验建立起来的,这种方式需要一个漫长而繁琐的试错过程。NAS试图在不需要人工干预的情况下能够针对特定深度学习问题检测出有效架构。

    网络架构和超参数优化的问题,有以下的特点:

    1. 评价函数未知,是一个黑箱优化问题,因为评价往往是在 unseen dataset 上进行评价;

    2. 非线性;

    3. 非凸;

    4. 混合优化,既有离散空间,又有连续空间;

    5. 一次优化结果的评价非常耗时,大型的深度学习模型参数数以亿计,运行一次结果需要几周时间;

    6. 在某些应用场景中,存在多个目标。比如:移动端的模型结构优化,既希望得到尽量高的准确率,又希望有非常好的模型计算效率。

    搜索空间

    搜索空间定义了优化问题的变量,网络结构和超参数的变量定义有所不同,不同的变量规模对于算法的难度来说也不尽相同。

    早期很多工作都是用以遗传算法为代表的进化算法对神经网络的超参数和权重进行优化,因为当时的神经网络只有几层,每层十几个神经元,也不存在复杂的网络架构,参数很有限,可直接进行优化。而深度学习模型一方面有着复杂的网络结构,另一方面权重参数通常都以百万到亿来计,进化算法根本无法优化。

    但换个思路,假如我们找到了一组网络架构参数和对应的超参数,深度学习模型的性能其实是由这组参数来控制和决定的,所以只需要对复杂模型的架构参数和对应的超参数进行优化即可

    目前常见的一种网络架构是链状结构,如下图:

    img

    这种结构相当于一个 N 层的序列,每一层有几种可选的算子,比如卷积、池化等,每种算子包括一些超参数,比如卷积尺寸、卷积步长等。

    最近的一些工作受启发于一些人工设计的网络架构,研究带有多分支的网络,如下图:

    img

    很多的深层 RNN 会有类似的结构,很多的网络结构虽然很深,但会有许多重复 cell,将 cell 抽象出来之后,复杂的结构也会变得简单。这种抽象一方面可以减少优化变量数目,另一方面相同的 cell 在不同任务之间进行迁移,如下图。

    img

    网络架构搜索问题由于其高维度、连续和离散混合等诸多难点,在搜索空间维度这块如果可以做些降维,将会大大提升效果,Zoph 在 2018 年的工作用了 cell 这种方式相比于 2017 年的工作有 7 倍的加速。

    搜索策略

    **搜索策略定义了使用怎样的算法可以快速、准确找到最优的网络结构参数配置。**常见的搜索方法包括:随机搜索、贝叶斯优化、进化算法、强化学习、基于梯度的算法。其中,2017 年谷歌大脑的那篇强化学习搜索方法将这一研究带成了研究热点,后来 Uber、Sentient、OpenAI、Deepmind 等公司和研究机构用进化算法对这一问题进行了研究,这个 task 算是进化算法一大热点应用。

    注:国内有很多家公司在做 AutoML,其中用到的一种主流搜索算法是进化算法。

    强化学习

    强化学习是一种非常有意思的范式,几乎只要可以提炼出强化学习四要素,原问题就可以用强化学习来求解。

    在 NAS 任务中,将架构的生成看成是一个 agent 在选择 action,reward 是通过一个测试集上的效果预测函数来获得(这个函数类似于工程优化问题中的 surrogate model,即代理模型)。这类工作整体的框架都是基于此,不同的点在于策略表示和优化算法。

    一个工作是,用 RNN 来表示策略函数,初始化时先用策略梯度算法赋初值,然后用 PPO 来进行优化。另一个工作是,用简单的 Q-learning 算法来训练策略函数,序列地进行动作选择,即选择 layer 的类型和相关的超参数。

    因为在 NAS 任务中,agent 与环境没有交互,可以降阶为无状态的多臂老虎机(MAB)问题。这里的几个工作都是近两三年的新工作,后面会对这些 paper 进行专门解读。

    进化算法

    进化算法是一大类算法,大概的框架也基本类似,先随机生成一个种群(N 组解),开始循环以下几个步骤:选择、交叉、变异,直到满足最终条件。最近几年流行一种基于概率模型的进化算法 EDA (Estimation Distribution of Algorithm),基本的思路类似遗传算法,不同的是没有交叉、变异的环节,而是通过 learning 得到一个概率模型,由概率模型来 sample 下一步的种群。

    用进化算法对神经网络超参数进行优化是一种很古老、很经典的解决方案,90 年代的学者用进化算法同时优化网络结构参数和各层之间的权重,因为当时的网络规模非常小,所以还能解决,但后续深度学习模型网络规模都非常大,无法直接优化。

    **进化算法是一种无梯度的优化算法(Derivative Free Optimization Algorithm),优点是可能会得到全局最优解,缺点是效率相对较低,**近两年几家高科技企业做 NAS 时都在用进化算法优化网络结构,同时用基于梯度的方法(BP)来优化权值。在 NAS 任务中,进化算法的交叉算子和任务结合比较紧,被定义为一些类似添加、删除层的操作,而非简单的更改某一位编码。

    用进化算法解决 NAS 问题,不同的工作可能聚焦在不同的过程中,比如如何 sample 种群,如何 update 种群,如何生成子代种群等。这些工作将会被在后面的文章中进行解读。

    贝叶斯优化

    贝叶斯优化(Bayesian Optimization)是超参数优化问题的常用手段,尤其是针对一些低维的问题,基于高斯过程(Gaussian Processes)和核方法(kernel trick)。对于高维优化问题,一些工作融合了树模型或者随机森林来解决,取得了不错的效果。

    除了常见的三大类方法,一些工作也在研究分层优化的思路,比如将进化算法和基于模型的序列优化方法融合起来,取各种方法的优势。Real 在 2018 年的一个工作对比了强化学习、进化算法和随机搜索三类方法,前两种的效果会更好一些。

    评价预估

    评价预估类似于工程优化中的代理模型(surrogate model),因为深度学习模型的效果非常依赖于训练数据的规模,大规模数据上的模型训练会非常耗时,对优化结果的评价将会非常耗时,所以需要一些手段去做近似的评估。

    一种思路是用一些低保真的训练集来训练模型,低保真在实际应用可以有多种表达,比如训练更少的次数,用原始训练数据的一部分,低分辨率的图片,每一层用更少的滤波器等。用这种低保真的训练集来测试优化算法会大大降低计算时间,但也存在一定的 bias,不过选择最优的架构并不需要绝对数值,只需要有相对值就可以进行排序选优了。

    另一种主流思路是借鉴于工程优化中的代理模型,在很多工程优化问题中,每一次优化得到的结果需要经过实验或者高保真仿真(有限元分析)进行评价,实验和仿真的时间非常久,不可能无限制地进行评价尝试,学者们提出了一种叫做代理模型的回归模型,用观测到的点进行插值预测,这类方法中最重要的是在大搜索空间中如何选择尽量少的点预测出最优结果的位置。

    第三种主流思路是参数级别的迁移,用之前已经训练好的模型权重参数对 target 问题进行赋值,从一个高起点的初值开始寻优将会大大地提高效率。在这类问题中,积累了大量的历史寻优数据,对新问题的寻优将会起到很大的帮助,用迁移学习进行求解,是一个很不错的思路。

    另一种比较有意思的思路叫做单次(One-Shot)架构搜索,这种方法将所有架构视作一个 one-shot 模型(超图)的子图,子图之间通过超图的边来共享权重。

    本篇笔记主要来源是 Thomas Elsken的bolg,来自德国弗莱堡大学的博士生。

    展开全文
  • 海康威视IP自动搜索软件,通过网络搜索软件所在网段内的在线设备。
  • 无限网络安装后会自动帮你搜索连接到无限网络信号,不需任何注册,安装即可使用
  • 方面三,神经网络结构搜索。本文侧重于方面三,神级网络结构搜索自动化机器学习的前两个部分,都有一个特点——只对现在已有的算法进行搜索,而不创造新的算法。一般而言机器学习专家在开发机器学习应用或者构建...

    技术介绍

    简介

    自动化机器学习就是能够自动建立机器学习模型的方法,其主要包含三个方面:方面一,超参数优化;方面二,自动特征工程与机器学习算法自动选择;方面三,神经网络结构搜索。本文侧重于方面三,神级网络结构搜索。

    自动化机器学习的前两个部分,都有一个特点——只对现在已有的算法进行搜索,而不创造新的算法。一般而言机器学习专家在开发机器学习应用或者构建机器学习模型时,都不太可能从头造轮子,直接创造一个新的算法。但是到了深度神经网路的时候,就发生了一些变化。严格意义上来说,神经网络的基本结构都是固定的,有限的。但是每当我们重新创建一个模型的时候,基本单元的不同组合又可以视作是在创建一个新的神经网络模型。在这种基本现实之下,第三种自动化机器学习技术应用而生,那就是神经网络架构搜索综述(NAS),根据基本的神经网络基本单元创建新的神经网络结构,最终结果就是得到一个非常强大的神经网络。

    在这方面也已经有大量的科学家进行了深入的研究。不过由于其基本假设就是深度神经网络,而且是在其之上进行架构的搜索,因此对算力的要求往往都比较高。目前比较厉害,且可以单卡运行的算法当要属enas,而enas的作者在发布论文的同时开源了其基于enas的作品——autokeras,任何人都可以下载和使用该类库。

    autokeras底层都是enas算法,但是根据应用不同其存在可以详细的分为以下类型:

    • 图像分类
    • 图像回归
    • 文本分类
    • 文本回归
    • 结构化数据分类
    • 结构化数据回归
      我们直接进行比较复杂的操作,使用autokeras进行自动图像分类。

    技术栈

    • tensorflow
    • pathlib
    • numpy
    • autokeras

    实现

    数据

    数据我们这里使用的是keras中的flower_photos数据集,该数据集是五类鲜花的图片数据,共有3675张图片。可以直接使用keras自带代下载该数据集。具体命令如下:

    import tensorflow as tf
    AUTOTUNE = tf.data.experimental.AUTOTUNE
    import pathlib
    import numpy as np
    import os
    
    data_dir = tf.keras.utils.get_file(origin='https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
                                             fname='flower_photos', untar=True)
    data_dir = pathlib.Path(data_dir)
    image_count = len(list(data_dir.glob('*/*.jpg')))
    print("This directory: ",data_dir," have ",image_count,"images")
    
    CLASS_NAMES = np.array([item.name for item in data_dir.glob('*') if item.name != "LICENSE.txt"])
    print("CLASS_NAMES :",CLASS_NAMES,",They are the names of the secondary directories")
    
    This directory:  /home/fonttian/.keras/datasets/flower_photos  have  3670 images
    CLASS_NAMES : ['roses' 'dandelion' 'daisy' 'sunflowers' 'tulips'] ,They are the names of the secondary directories
    

    数据读取

    之后我们将数据的读取转化为tfds格式,这样使用效率会高很多,具体实现如下:

    import warnings
    warnings.filterwarnings("ignore")
    
    print("----------------- 参数 -----------------")
    
    BATCH_SIZE = 256
    IMG_HEIGHT = 224
    IMG_WIDTH = 224
    STEPS_PER_EPOCH = np.ceil(image_count/BATCH_SIZE)
    
    print("----------------- start tfds -----------------")
    list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'))
    
    def get_label(file_path):
      # convert the path to a list of path components
      parts = tf.strings.split(file_path, os.path.sep)
      # The second to last is the class-directory
      return parts[-2] == CLASS_NAMES
    
    def decode_img(img):
      # convert the compressed string to a 3D uint8 tensor
      img = tf.image.decode_jpeg(img, channels=3)
      # Use `convert_image_dtype` to convert to floats in the [0,1] range.
      img = tf.image.convert_image_dtype(img, tf.float32)
      # resize the image to the desired size.
      return tf.image.resize(img, [IMG_HEIGHT, IMG_WIDTH])
    
    def process_path(file_path):
      label = get_label(file_path)
      # load the raw data from the file as a string
      img = tf.io.read_file(file_path)
      img = decode_img(img)
      return img, label
    
    # Set `num_parallel_calls` so multiple images are loaded/processed in parallel.
    labeled_ds = list_ds.map(process_path, num_parallel_calls=AUTOTUNE)
    print("type(labeled_ds): ",type(labeled_ds))
    
    ----------------- 参数 -----------------
    ----------------- start tfds -----------------
    type(labeled_ds):  <class 'tensorflow.python.data.ops.dataset_ops.ParallelMapDataset'>
    

    创建模型并训练

    之后我们使用几条简单的命令进行模型的创建,然后使用fit方法进行训练。

    print("----------------- autokeras.fit with tfds -----------------")
    
    import autokeras as ak
    clf = ak.ImageClassifier(
        overwrite=True,
        max_trials=1)
    
    print("type(clf) :",type(clf))
    
    # Feed the tensorflow Dataset to the classifier.
    # model = clf.fit(train_ds, epochs=10)
    clf.fit(labeled_ds, epochs=10)
    print("End of training")
    
    ----------------- autokeras.fit with tfds -----------------
    type(clf) : <class 'autokeras.tasks.image.ImageClassifier'>
    

    Starting new trial

    Epoch 1/10
    92/92 [==============================] - ETA: 0s - loss: 1.6533 - accuracy: 0.18 - ETA: 5s - loss: 3.6870 - accuracy: 0.18 - ETA: 7s - loss: 12.2507 - accuracy: 0.187 - ETA: 8s - loss: 20.0298 - accuracy: 0.179 - ETA: 8s - loss: 19.0134 - accuracy: 0.181 - ETA: 8s - loss: 17.3803 - accuracy: 0.208 - ETA: 8s - loss: 15.9739 - accuracy: 0.218 - ETA: 8s - loss: 
    
    ......
    

    Trial complete

    Trial summary

    |-Trial ID: c908fe149791b23cd0f4595ec5bde856

    |-Score: 1.596627950668335

    |-Best step: 6

    Hyperparameters:

    |-classification_head_1/dropout_rate: 0.5

    |-classification_head_1/spatial_reduction_1/reduction_type: flatten

    |-image_block_1/augment: False

    |-image_block_1/block_type: vanilla

    |-image_block_1/conv_block_1/dropout_rate: 0.25

    |-image_block_1/conv_block_1/filters_0_0: 32

    |-image_block_1/conv_block_1/filters_0_1: 64

    |-image_block_1/conv_block_1/kernel_size: 3

    |-image_block_1/conv_block_1/max_pooling: True

    |-image_block_1/conv_block_1/num_blocks: 1

    |-image_block_1/conv_block_1/num_layers: 2

    |-image_block_1/conv_block_1/separable: False

    |-image_block_1/normalize: True

    |-optimizer: adam

    INFO:tensorflow:Oracle triggered exit
    115/115 [==============================] - ETA: 0s - loss: 1.7198 - accuracy: 0.28 - ETA: 6s - loss: 26.4634 - accuracy: 0.250 - ETA: 8s - loss: 21.2743 - accuracy: 0.239 - ETA: 9s - loss: 20.6605 - accuracy: 0.250 - ETA: 10s - loss: 21.1210 - accuracy: 0.21 - ETA: 10s - loss: 19.7904 - accuracy: 0.19 - ETA: 10s - loss: 18.0614 - accuracy: 0.19 - ETA: 10s - loss: 16.6908 - accuracy: 0.20 - ETA: 10s - loss: 15.4958 - accuracy: 0.21 - ETA: 10s - loss: 14.4523 - accuracy: 0.21 
    ......
    ETA: 0s - loss: 2.7511 - accuracy: 0.23 - 15s 134ms/step - loss: 2.7511 - accuracy: 0.2343
    End of training
    

    模型预测与评估

    模型的训练过程输出了大量的数据,但是使用起来却只需要几行代码。另外模型的预测与导出同样如此,在训练过程,训练过程已经进行了保存,但是想要输出训练好的最佳模型则需要使用export_model方法。

    print("----------------- Predict with the best model -----------------")
    # Predict with the best model.
    predicted_y = clf.predict(labeled_ds)
    # predicted_y = clf.predict(train_ds)
    # Evaluate the best model with testing data.
    print(clf.evaluate(labeled_ds))
    # print(clf.evaluate(train_ds))
    
    ----------------- Predict with the best model -----------------
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
    WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/guide/checkpoint#loading_mechanics for details.
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
    WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/guide/checkpoint#loading_mechanics for details.
    115/115 [==============================] - ETA: 0s - loss: 1.6073 - accuracy: 0.28 - ETA: 3s - loss: 1.6060 
    ......
    loss: 1.6052 - accuracy: 0.24 - 5s 42ms/step - loss: 1.6052 - accuracy: 0.2455
    [1.6052242517471313, 0.24550408124923706]
    

    模型的导出

    print("----------------- Export as a Keras Model -----------------" )
    # Export as a Keras Model.
    model = clf.export_model()
    
    print(type(model))  # <class 'tensorflow.python.keras.engine.training.Model'>
    
    try:
        model.save("model_autokeras", save_format="tf")
    except:
        model.save("model_autokeras.h5")
    
    print("-----------------End of the program -----------------")
    
    ----------------- Export as a Keras Model -----------------
    WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
    ......
    If using Keras pass *_constraint arguments to layers.
    INFO:tensorflow:Assets written to: model_autokeras/assets
    -----------------End of the program -----------------
    

    刚刚的代码就是代码的导出,由于该类库底层使用的仍然是tensorflow,因此保存模型其实调用的是Tensorflow中的模型导出方法。因此如果需要加载或者部署,采用tensorflow中的方法进行模型的保存和加载即可。至于整个文件夹则如下图所示,可以看到底层文件基本与TensorFlow无异。

    在这里插入图片描述

    展开全文
  • 利用WebBrowser控件实现百度自动搜索

    热门讨论 2014-05-20 16:04:04
    利用WebBrowser控件实现百度自动搜索,100%可以用的,如有问题,是因为百度进行了更新,可以看帖子中的说明。
  • 【摘要】 DeepLab等神经网络在语义分割上取得了显著的成果。...随着自动网络搜索(NAS)的发展,这种情况在逐渐改变。本文将会简单介绍NAS发展现状及基本架构,继而详细介绍NAS在语义分割上的应用。 翻译或...

    【摘要】 DeepLab等神经网络在语义分割上取得了显著的成果。虽然近年来神经网络的数量在不断增加,但取得重大突破者甚少且准确度上提升不多。其中一个原因是多数的网络结构都是人为设计,基于现有成熟的结构稍加修改,而这样设计出来的网络很可能不优化甚至无法收敛。随着自动网络搜索(NAS)的发展,这种情况在逐渐改变。本文将会简单介绍NAS发展现状及基本架构,继而详细介绍NAS在语义分割上的应用。

    翻译或有误差,请参考原文https://medium.com/@majingting2014/neural-architecture-search-on-semantic-segmentation-1801ee48d6c4

    自动网络搜索 

    多数神经网络结构都是基于一些成熟的backbone,如ResNet, MobileNet,稍作改进构建而成来完成不同任务。正因如此,深度神经网络总被诟病为black-box,因为hyparameter是基于实验求得而并非通过严谨的数学推导。所以,很多DNN研究人员将大量时间花在修改模型和实验“调参”上面,而忽略novelty本身。许多教授戏称这种现象为“graduate student descent”。近两年,学术界兴起了“自动网络搜索”取代人工设计网络结构。2016年,Google Brain公开了他们的研究成果NASNet【1】,这是第一个用自动网络搜索Neural Architecture Seach (NAS)完成的神经网络,为深度学习打开了新局面。NASNet是由一系列operation(如depth separable conv, max pooling等)叠加而成。至于怎样选择operation,作者用强化学习(RL)的方法,用一个controller网络随机组合operations生成模块,通过评估选择最优模块组成网络结构。Google提供的云上服务Cloud AutoML正是基于NAS方法,根据用户上传的数据自动搜索神经网络再将结果输出。迄今为止,国内外很多工业界和学术界的AI Lab都有NAS相关工作:Google Brain提出了NasNet, MNasNet和Nas-FPN,Google提出MobileNetv3,Auto-DeepLab和Dense Prediction Cell(DPC);MIT Han Song团队提出ProxylessNet;Facebook提出FbNet;Baidu提出SETN;腾讯提出FPNAS;小米提出FairNAS;京东AI提出CAS;华为诺亚有提出P-DARTS等。通过各大实验室对NAS的研究成果,似乎可以看出自动网络搜索将会成为趋势。

    接下来我们简单介绍一下NAS的流程,详细内容可参考【2】。NAS的架构主要包含三部分:搜索空间Search Space,搜索策略Search Strategy和评估机制Performance Estimation(如下图)。

    image.png

    • 首先搜索空间会定义一些模块(cell),operations(例如dilated conv 3x3),和宏观网络结构。cell是由若干个operation组合而成。通常来说,NAS会自动搜索出一些可以重复的cell,将cell按照设定的宏观网络结构堆叠起来形成network。Zoph et al.提出了两种cell,normal cell和reduction cell【3】。Reduction cell有改变spatial resolution的功能。这两种cell在现有的算法中最为常见。此外还有来自CAS网络【4】的multi-scale cell,作用和ASPP类似可用作decoder。至于对宏观网络结构的设定,早期的工作会采用chained-structured,或者带分支结构multi-branch例如ResNet和DenseNet带有skip和shortcut。

    • 搜索策略在NAS中至关重要,因为它决定了下一步要选择哪一个cell或者operation组成网络结构。搜索的目的就是让现有的网络结构在unseen data上得到最好的效果。如前文提到,第一篇工作NASNet中用到了强化学习作为搜索策略。虽然实验结果尚可,但强化学习耗时过长并且需要大量GPU资源。NASNet就是用几百个GPU搜索了几天才完成,这对于资源少的研究人员来说不可能完成。继NASNet之后早期的工作多是基于RL完成搜索。随着其他方法的研究,如random search, Bayesian optimization, Gradient-based, evolution algorithms,搜索时间在下降并且GPU使用量也在减少,使得NAS得以普及。感谢https://github.com/D-X-Y/Awesome-NAS 提供了搜索策略的调研。

    • 由于一个神经网络通常有几十甚至上百层,结构也很复杂,一个及时并有效的反馈对于减少搜索时间很有帮助。最简单的方法是把训练数据分成两部分,train data用来训练网络结构,validation data用来评估当前搜索到的网络结构。一般来说,一个好的评估机制要兼具速度和准确度,举个例子,train data少则网络结构训练不到位,train data多则搜索时间过长。来自Freiburg大学的Elsken团队发表了关于NAS的调研,里面对于评估方法讲的很详细,请挪步【2】。

    自动网络搜索在语义分割上的应用

    相比于目标检测,语义分割可以更好的解析图像,因为图像上的每一个pixel都会被分类。所以语义分割可以完成目标检测无法完成的任务,如自动驾驶的全景分割,医疗图像诊断,卫星图分割,背景抠图和AR换装等。过去的五年继FCN之后,很多神经网络在公开数据集上都有不错的成绩。随着AI产品落地,对神经网络性能的要求更为严格:在保证accuracy的前提下,在有限制的硬件资源运行并且提升inference速度。这为设计神经网络增加了很大难度。所以NAS是一个很好的选择,它可以避免通过大量调参实验来决定最优网络结构。在语义分割之前,NAS在图像分类和目标检测上均有成功的应用。我们总结了近两年比较流行的NAS在语义分割上的工作。多数的语义分割的网络都是encoder-decoder结构,在这里我们对比了实际搜索的部分,搜索性能耗时和方法。由于每一个work都在不同实验环境下进行,所以实验结果没有直接进行对比。

     

     

    (1)第一篇将NAS应用于语义分割的工作来自Google DeepLab团队,作者是Liang-Chieh Chen等一众大佬。DeepLabv3+的准确度已经达到一定高度,继而DeepLab团队将研究方向转移到了NAS上面。基于和DeepLab同样的encoder-decoder结构, 在【5】工作中,作者将encoder结构固定,试图搜索出一个更小的 ASPP,用到的搜索策略是random search。在Cityscapes达到82.7% mIoU,在PASCAL VOC 12上达到87.9%,结果尚可但搜索时间过慢,用370个GPU搜索一周才得到网络,这也限制了该方法的普及。

    (2)同样来自DeepLab团队,Auto-DeepLab【6】相比之前的工作在搜索效率上有显著的提升。这都归功于它gradient-based的搜索策略DARTS【9】。与上一篇相反,Auto-DeepLab的目标是搜索encoder,而decoder则采用ASPP。从实验结果来看,Auto-DeepLab的准确度和DeepLabv3+相差不多,但是FLOPs和参数数量却是DeepLabv3+的一半。后文我们会具体介绍DARTS和Auto-DeepLab。

    (3)Customizable Architecture Search (CAS)【4】是来自京东AI Lab的工作。在搜索空间定义了三种cell,分别是normal cell,reduction cell和新提出的multi-scale cell。其中multi-scale cell是ASPP 的功能类似,所以CAS的搜索区间是针对全部网络。在搜索策略上依然采用DARTS。值得一提的是,在搜索网络的时候,CAS不仅考虑accuracy,还考虑了每个模块的GPU time,CPU time,FLOPs和参数数量。这些属性对于实时任务至关重要。所以CAS在Cityscapes上的准确度是72.3%,虽然没有很高,但是在TitanXP GPU的速度fps达到108。

    (4)来自Adeleide大学的Vladimir Nekrasov团队在light weight模型上面做了大量工作,而最近也将研究重心转到了NAS上面。在【7】中,作者采用RL的搜索策略搜索decoder。众所周知RL非常耗时,所以作者采用知识蒸馏策略和Polyak Averaging方法结合提升搜索速度,而这正是本文的major contribution。

    (5)最后一篇来自商汤发布在Artix的文章,采用图神经网络GCN作为搜索策略,试图寻找cell之间最优的连接方式【8】。和CAS类似,在本文中每个模块的性能如latency也在搜索评估时考虑进去。在Cityscape上GAS达到73.3%mIoU,在TitanXP GPU的速度是102fps。 

    简单总结一下上述工作,我们可以发现NAS在语义分割上的应用还算成功,并且很多团队已经在NAS上进行研究探索。尤其在DARTS类似的高效搜索策略提出后,个人研究者和小团队也可以构建自己的NAS网络,而不受制于GPU资源。

    DARTS: Differentiable Architecture Search 

    通常来说搜索空间是一个离散的空间,在DARTS中【9】,作者将搜索空间定义成一个连续空间,这样一来搜索到的每一个cell都是可导的,可以用stochastic gradient descent来优化。所以DARTS相比RL并不需要大量GPU资源和搜索时间。在实验中,DARTS成功用在了CNN模型的图像分类和RNN模型的language modelling任务上。感恩作者提供了源代码 https://github.com/quark0/darts ,它可以为我们搭建自己NAS模型提供很好的基础。

    正如前文中提到,多数的NAS网络会搜索不同类型的可重复的cell,然后将cell连接起来构成神经网络。这个cell通常用directed acyclic graph(DAG)表示。一个DAG cell包含N个有顺序的node,每一个node可以看成在它前面所有node的结合(就像feature map一样是一个latent representation)。从node i 到node j的连接是某一种operation记作o(i,j). 每一个cell都有两个input node和一个output node。下图中是一个DARTS展示的reduction cell。我们可以看到cell k 有两个input nodes 分别是c_{k-1}和c_{k-2} (来自cell k-1和cell k-2的output node),cell k包含了4个immediate nodes和一个output node c_{k} 。o(i,j)是边缘上的max_pool_3x3,max_pool等。理论上从一个node到相邻的node可以有很多种operation,所以搜索最优网络结构也可以看成是选择每一个边上最佳的operation。

    image.png

    DARTS将每对node之间的每一个operation都赋予一个weight,最优解可以用softmax求得,也就是说有最大probability的path代表最优operation,这也是DARTS的核心部分。DARTS在搜索空间中定义了两种cell,reduction cell和normal cell。宏观网络结构是固定的,作者采用了简单的chained-structured,将reduction cell放在了网络结构的1/3和2/3处。所以说在搜索的过程中,cell内部不断更新而宏观结构没有变化。我们定义operation的参数为W,将cell中operation的weight记为Alpha。根据论文和source code,我们总结了DARTS的搜索流程如下图。

    image.png

    网络搜索的第一步是对模型结构,optimizer,loss进行初始化。文中定义了几种operation,代码中的定义在operation.OPS, 两种cell在代码中的定义是genotypes.PROMITIVES. 参数Alpha在代码中定义为arch_parameters()={alphas.normal, alphas.reduce}. 在搜索过程中,train data被分成两部分,train patch用来训练网络参数W而validation patch用来评估搜索到的网络结构。在代码中,搜索过程的核心部分在architect.step()。网络搜索的目标函数就是让validation在现有网络的loss最小,文章中公式(3)给出了objective: 

    image.png

    为了减少搜索时间,每一轮只用一个training patch去更新参数W计算train loss。在计算Alpha的时候涉及到二阶求导,稍微复杂一点,但是论文和代码都给了详细解释,这里不赘述,代码中architect._hession_vector_product是求二阶导的实现。在更新W和Alpha之后,最优operation通过softmax来计算。文中保留了top-k probability的operation。W和Alpha不断计算更新直到搜索过程结束。

    文中进行了大量实验,我们这里只介绍一下在CIFAR-10数据上面进行的图像分类任务。作者将DARTS与传统人工设计的网络DenseNet,和几个其他常见的NAS网络进行对比,如AmoeNet和ENet都是常被提及的。DARTS在准确度上优于其他所有算法,并且在搜索速度上明显比RL快很多。由于结构简单效果好,而且不需要大量GPU和搜索时间,DARTS已经被大量引用。

    Auto-DeepLab: Hierarchical Neural Architecture Search for Semantic Image Segmentation 

    基于DARTS的结构,Google DeepLab团队提出了Auto-DeepLab并发表在2019年CVPR上。在tensorflow deeplab官网上公布了nas backbone并且给出了可以训练的模型结构,但是搜索过程并没有公开。于是我们训练了给出的nas网络结构,在没有任何pre-training的情况下与deeplab v3+进行对比。代码参考 https://github.com/tensorflow/models/tree/master/research/deeplab 。

    在DARTS中,宏观网络结构是提前定义的,而在Auto-DeepLab中宏观网络结构也是搜索的一部分。继承自DeepLab v3+的encoder-decoder结构,Auto-DeepLab的目的是搜索Encoder代替现有的xception65,MobileNet等backbone,decoder采用ASPP。在搜索空间中定义了reduction cell,normal cell和一些operation。Reduction cell用来改变spatial resolution,使其变大两倍,或不变,或变小两倍。为了保证feature map的精度,Auto-DeepLab规定最多downsampling 32倍 (s=32)。下图定义了宏观网络结构(左)和cell内部的结构(右)。

    image.png

    Auto-DeepLab定义了12个cell,而上图(左)中前面两个白色的node是固定的两层为了缩小spatial resolution。如图左灰色箭头所示,正式搜索之后,每一个cell的位置都有多种cell类型可以选择:可以来自于当前cell相同的spatial resolution的cell,也可以是比当前cell的spatial resolution大一倍或小一倍的cell。作者将这些空间路径(灰色箭头表示的路径)也赋予一个weight,记作Beta。如图右,每一个cell的输出都是由相邻spatial resolution的cell结合而成,而Beta的值可以理解成不同路径的probability。为了更直观,我们把图右的三个cell分别用蓝色,黄色和绿色标注,对应图左的三个cell。与DARTS类似,我们将operation的parameters记作W,将cell内部operation的权重记作Alpha。所以搜索最优网络结构,即迭代计算并更新W,Alpha和Beta。文中给出每一个cell的实际输出为:

    image.png

    从上面公式可以看出,W和{Alpha,Beta}要分别计算和更新。所有的weight都是非负数。Alpha的计算方式依然是ArgMax,而计算Beta用了经典的贪心算法Viterbi算法。下图给出的宏观网络结构是基于Cityscapes搜索到的结果,对应代码中的backbone是[0,0,0,1,2,1,2,2,3,3,2,1], 数字代表downsample倍数。在模型中,每一个cell中的node由两个路径组成,如图右。 

    image.png image.png

    文中用了三组开源数据PASCAL VOC 12, Cityscapes和ADE20k做了对比实验。具体实验参数设置和对比算法在论文中有详细说明,这里只对比和Deeplab v3+。Cityscapes训练数据尺寸是[769x769],而PASCAL VOC 12和ADE20k训练数据尺寸是[513x513]。一般来说,Auto-DeepLab和DeepLabv3+准确度相差无几,但是速度上要快2.33倍,并且Auto-DeepLab可以从零开始训练。

    image.png

    image.png

    除了文中给出的实验结果以外,我们在PASCAL VOC 12数据上从零开始训练了Auto-DeepLab,用代码中给出的模型结构,并且与DeepLabv3+(xception65)进行结果对比。但是并不是所有结果都能复现,分析原因大概是这样:首先,上文中给出的模型结构是用Cityscapes数据集搜索得到,也许在PASCAL VOC 12上并不是最优解;其次没有用ImageNet做pre-training,训练环境也不同。我们在下面表格中对比了FLOPs, 参数数量, 在K80 GPU上面的fps和mIoU。

    image.png 下图中直观对比了ground truth(第二列),deeplabv3+(第三列)和Auto-DeepLab-S(第四列)的分割结果。与上面的mIoU一致,DeepLabv3+的分割结果要比Auto-DeepLab更精准一些,尤其是在边缘。对于简单的图像案例,两者分割结果相差无几,但是在较难的情况下,Auto-DeepLab会有很大误差(在第三个案例中,Auto-DeepLab将女孩识别成狗)。

    image.png

    总结

    本文简单介绍了NAS的发展现况和在语义分割中的应用,并且详细解读了两篇流行的work:DARTS和Auto-DeepLab。从整体实验结果来看,还不能看出NAS的方法比传统的模型有压倒性优势,尤其在准确度上。但是NAS给深度学习注入了新鲜的血液,为研究者提供了一种新的思路,并且还有很大的提升空间和待开发领域。也许人工设计网络结构将会被自动网络搜索取代。

    References 

    [1]   Zoph, Barret, and Quoc V. Le. "Neural architecture search with reinforcement learning." The International Conference on Learning Representations (ICLR) (2017)

    [2]   Elsken, Thomas, Jan Hendrik Metzen, and Frank Hutter. "Neural Architecture Search: A Survey." Journal of Machine Learning Research 20.55 (2019): 1-21.

    [3]   Zoph, Barret, et al. "Learning transferable architectures for scalable image recognition." Proceedings of the IEEE conference on computer vision and pattern recognition (CVPR). 2018.

    [4]   Zhang, Yiheng, et al. "Customizable Architecture Search for Semantic Segmentation." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2019.

    [5]   Chen, Liang-Chieh, et al. "Searching for efficient multi-scale architectures for dense image prediction." Advances in Neural Information Processing Systems (NIPS). 2018.

    [6]   Liu, Chenxi, et al. "Auto-deeplab: Hierarchical neural architecture search for semantic image segmentation." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2019.

    [7]   Nekrasov, Vladimir, et al. "Fast neural architecture search of compact semantic segmentation models via auxiliary cells." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2019.

    [8]   Lin, Peiwen, et al. "Graph-guided Architecture Search for Real-time Semantic Segmentation." arXiv preprint arXiv:1909.06793 (2019).

    [9]   Liu, Hanxiao, Karen Simonyan, and Yiming Yang. "Darts: Differentiable architecture search." The International Conference on Learning Representations (ICLR) (2019).

    作者:水煮懒羊羊

     

    展开全文
  • 自动设置网络批处理

    2013-08-22 10:48:32
    此批处理汇集了批处理技术...此批处理需要与“导出网络配置”批处理合作使用,前者负责生成“ini”格式的网卡配置信息,接着使用本软件即可全自动化配置包括主机名、IP、MAC、子掩码、网关、DNS等,且无需重启即可生效
  • 可以设置搜索关键字,程序自动使用百度搜索搜索关键字,查找到目标关键字后自动打开网页。 由于百度的竞价排名问题,请谨慎使用本软件,否则可能造成贵公司的费用被扣。 本软件仅用于对自己网站进行SEO优化,切勿...
  • SNMP教程及网络拓补图自动搜索和布局,SNMP教程节选自TCP/IP详解卷一,网络拓补图自动布局为一篇论文,提供采用SNMP协议获取网络拓补结构的解决方案
  • 网络架构(NAS),模型压缩(AMC),数据增强(AutoAugment),优化器设计(Neural Optimizer Search),平台相关优化(AutoTVM)等领域,我们都可以看到相应的研究成果表明机器学习可以达到比人肉调参更优的结果。自动化...
  • 此示例工程可以自动探测同一个网络内的海康IPC并显示出来,实现了ONVIF协议对接流程当中的设备搜索过程
  • 自动搜索在线设备IP地址

    热门讨论 2012-07-16 13:41:16
    可以搜索到在线设备IP地址软件,不管在不在一个网段都可以。适合用于某些不知道地址的设备。
  • 这章会讲解搜索中提升用户体验的另一项功能-自动补全。本章直接介绍ES中的实现方式以及真正的搜索引擎对自动补全功能的优化。 大家对上面的这个应该都不陌生,搜索引擎会根据你输入的关键字进行一些提示,这样...
  • 优化算法+神经网络:神经网络自动参数优化

    千次阅读 热门讨论 2021-11-08 20:03:01
    这里写自定义目录标题优化算法进行神经网络的参数寻优,解放深度调参1.已经实现的Genetic Algorithm优化Neural Network功能快捷键2.已经实现的PSO优化Neural Network如何改变文本的样式插入链接与图片如何插入一段...
  • 【摘要】 本文将介绍如何基于ProxylessNAS搜索semantic segmentation模型。...依据不同设备(GPU, CPU,芯片等),不同的模型需求(latency, 模型大小,FLOPs),使用NAS自动搜索最佳网络结构将会是一个很有潜..
  • 打开控制面板--管理工具--计算机管理--服务,打开服务,查询WLANAUTOCONFIG这个服务,看是不是禁用了,把它启用,设置成自动,然后重启电脑试试按下面设置开通无线网络服务,用Windows配置我的无线网络设置就可以...
  • HP网络打印机搜索

    2013-10-21 21:50:59
    快速搜索HP网络打印机,并自动搜索驱动程序
  • 一文详解神经网络结构搜索(NAS)

    千次阅读 多人点赞 2019-07-16 10:40:07
    本文作者为东北大学自然语言处理实验室 2018 级研究生胡驰,他的研究方向包括神经网络结构搜索、自然语言处理。雷锋网 AI 科技评论经作者授权发表本文章。 近年来,深度学习的繁荣,尤其是神经网络的发展,颠覆了...
  • Python学习之爬虫03-自动模拟HTTP请求与百度信息自动搜索 基础概念: 网页的请求分很多中,其中最常用的是post和get 。 get 请求 格式:网页链接中 xxx.html?字段名=值&amp;字段名=值 实例:爬取百度前5页的...
  • 可以设置搜索关键字,程序自动使用百度搜索搜索关键字,查找到目标关键字后自动打开网页。 由于百度的竞价排名问题,请谨慎使用本软件,否则可能造成贵公司的费用被扣。 本软件仅用于对自己网站进行SEO优化,切勿...
  • hello ,大家好,我是jordy;欢迎大家光临我的博客,我的联系方式有...(一)自动获取ip/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0HWADDR="18:66:da:4a:de:d4"ONBOOT=yesNM_CONTROLLED=noBO...
  • 【导读】AutoML-Freiburg在Github上发布了PyTorch机器学习自动化的资源,可以自动框架搜索,超参数优化。作者强调这是一个 very early pre-alpha版本,目前只支持特征化数据。不过这不妨碍我们搓手试试~   安装...
  • Windows Server 2012 R2的"网络发现"功能,用来控制局域网中计算机和设备的发现与隐藏。...不过,关闭"网络发现"功能时,其他计算机仍可以通过搜索或者指定计算机名、IP地址的方式访问到该计算机,但不会...
  • 本文作者:肖健 在读博士 作者学校:哈尔滨工程大学 研究方向:生成对抗网络,视频处理,目标检测。...这篇文章聚焦于将神经网络结构搜索(NAS)引入到生成对抗网络(GAN)中,以期自动搜索到一个较好的生成...
  • 大华录像机ip自动搜索工具

    热门讨论 2012-02-26 11:59:20
    大华录像机ip搜索工具,可以跨网段搜索,在不知道局域网内的录像机ip地址时的最佳工具
  • 无线网络信号增强搜索工具

    热门讨论 2010-05-30 11:05:19
    无线网络信号增强搜索工具,可以代替windows本身的wifi工具
  • 神经网络结构搜索*(*NAS)简介

    千次阅读 2021-09-19 10:01:02
    然而,高效神经网络的实现通常需要架构的知识和大量的时间,在不停的迭代过程中使用我们的知识的探索合理的解决方案。神经网络的形式和结构会根据具体需要而有所不同,所以针对不同的任务和不同需求需要设定特定的...
  • 因此,模型小型化技术成为最近几年学术界和工业界研究的热点,模型小型化技术也从最开始的网络剪枝、知识蒸馏、参数量化等发展为最新的神经网络架构搜索(NAS)和自动模型压缩等技术。 飞桨核心框架 Paddle Fluid v...
  • 网络工程师眼中的自动化运维

    千次阅读 2019-01-22 17:16:29
    本文从一名网工从业者的角度出发,探讨了在企业网运维过程中,网络工程师可以用什么样的工具让网络更加透明高效。 上篇文章回顾:Apache Ranger——Hadoop ACL控制工具  引言 “网络就像wifi,没有故障的时候,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 413,499
精华内容 165,399
关键字:

怎么设置自动搜索网络