功放parameter是什么意思 parameter是什么意思

作者|第四范式先知平台架构师陈
编辑| |娜塔莉
本文经作者授权发布于AI前线,未经允许不得转载!
AI前沿介绍:ENAS被称为高效神经架构搜索(Efficient Neural Architecture Search),它来自于2018年Google Jeff Dean等人发表的论文《通过参数共享的高效神经架构搜索》(Efficient Neural Architecture Search Via Parameter Sharing) 。它可以在一天内自动训练出比人类更好的设计效果的模型 。那么,这个神奇的ENAS有什么奇妙之处呢?和最近风头正劲的AutoML有什么关系?本文将一步步介绍业界主流的自动生成神经网络模型的NAS算法,以及目前最流行的ENAS算法,带你一探ENAS究竟 。更多干货请参考微信官方账号“AI前线”(ID: AI-front)
简介
随着机器学习算法的突破,AutoML逐渐被业界所熟悉,并开始被应用 。最近,谷歌频繁发表与AutoML相关的论文,并在谷歌云平台上推出了AutoML Vision服务,允许用户通过上传少量标记的图像数据来重新训练一个专属的图像分类模型 。在我的微博里介绍了这个“AutoML”技术,其实可以通过微调等方式实现 。因此,本文的第一个观点是,对于AutoML的定义没有强制性的标准,只要一个好的模型能够被自动训练出来,就是一个有价值的AutoML 。
ENAS的全称是高效神经架构搜索(Efficient Neural Architecture Search),来源于Google在2018年发表的论文《通过paramr共享进行高效神经架构搜索》(论文链接:https://arxiv . org/pdf/1802.03268 . pdf),通过共享模型参数可以高效地探索神经网络模型的结构,也就是说,一天之内就可以自动训练出一个比人类设计效果更好的模型 。ENAS使用了强化学习、动态构建计算图等技术 。从宏观上看,它是一个搜索算法,输出是一个精心选择的NN模型,所以它是一种符合预期的AutoML 。此外,要实现完整的“自动机器学习(ML)”,需要自动特征提取和自动超参数调优的技术支持,但暂时不在本文讨论范围之内 。
关于ENAS的介绍,你可能看过媒体圈吹捧的文章,比如Google Brain发布神经架构搜索新方法:加速1000倍,Jeff Dean等人提出ENAS:通过参数共享实现高效的神经架构搜索等 。这里是本文的第二点 。看媒体翻译的技术文章没用 。想学技术的可以看原论文或者这篇文章 。在介绍ENAS算法的实现细节之前,我希望我们能一步一步地介绍一些基础知识的理解 。
NAS的原理
NAS又称神经架构搜索,旨在从一堆神经网络组件中找到一个好的神经网络模型 。我们知道神经网络模型是一种可以随意堆砌的模型结构 。基本组件包括FC(全连接层)、卷积层、轮询层、激活函数等 。后一个组件可以将前一个组件作为输入 。不同的组件连接方式和超级参数配置方式,在不同的应用场景下有不同的效果 。例如,下面是一个在图像分类场景中非常有效的初始模型结构 。
看不懂图中的复杂结构也没关系 。我们只需要知道这个神经网络结构是图像领域的专家花了很多精力设计出来的,是经过大量的实验和测试确定的(没有解释深度学习的原理) 。
那么计算机能自己学习并生成这种复杂的网络结构吗?目前还不能,包括各种NAS算法的变形和ENAS算法暂时无法生成这样的网络结构 。这里抛出本文的第三个观点 。机器学习大部分不是人工智能,计算机不会无缘无故获得超出既定目标的能力 。所以计算机不是自己学会编程或者建模的,我们也没有设计出自动建模的数据集和算法 。所谓“AI设计的神经网络模型”,其实只是在给定的搜索中寻找效果最好的模型结构空 。
例如,我们假设模型必须是三层全连接神经网络(输入层、隐含层和输出层),隐含层可以有不同的激活函数和节点数 。假设激活函数必须是relu或sigmoid中的一个,隐藏节点数必须是10、20、30中的一个,那么我们称这个网络结构的search 空区间为{rell}在search 空中可以组合六种可能的模型结构 。我们可以在可枚举搜索空中分别实现这六种可能的模型结构 。最终目标是输出效果最好的机型 。然后我们可以分别对这六个模型进行训练,并用AUC、准确率等指标对模型进行评估,然后返回或生成一个最优的神经网络模型结构 。
所以NAS算法是一个给定模型结构空的搜索算法 。当然,这个search 空不可能只有几个参数组合,ENAS的示例search 空中大概有1.6 * 10 ^ 29个备选结构,搜索算法也不是单独枚举模型结构就能解决的,而是需要多一个 。
使用超级参数自动调谐
前面说过,NAS是一种搜索算法,就是从一个超大规模的搜索空中找到一个模型效果好的模型结构 。这类问题也可以看作是一个优化问题,就是从一个搜索空中找到另一个模型效果更好的模型结构 。但是神经网络模型的结构和效果并不是线性的,没有一个函数可以描述这种关系 。如果存在这样一个函数,我们可以通过求导、SGD等方法在数学上找到最优解,所以这可以看作是一种黑箱优化问题或者多臂老虎机问题 。黑箱优化问题的解决方法,请参考专栏另一篇文章《贝叶斯优化:更好的超参数优化方法》(https://zhuan LAN . zhi Hu . com/p/29779000) 。
回到NAS场景,我们需要为算法定义一个search 空 room来选择更好的网络结构,而这个search 空 room无非就是网络层的数量,网络层的类型,网络层的激活函数的类型,网络层是否加入Dropout,网络层是否加入批量归一化,还有滤波器大小,条带,卷积层和轮询类型的填充,池层的内核大小等 。,这些都可以认为是神经网络的超参数 。
如果你用过我的开源tensor flow _ template _ application,你应该明白,为什么要模板应用?因为我们可以通过传入的参数选择更好的模型结构——model = { DNN,LR,wide _ and _ deep,CNN},也可以通过参数选择更好的优化算法——optimizer = { SGD,Adadelta,Adagrad,Adam,FTRL,RMSProp}等 。这里不赘述,可以在Github上感兴趣 。
https://github . com/tobegit 3 hub/tensor flow _ template _ application
实际上,NAS可以是常见的超参数调优问题,也可以是模型结构场景的调优问题 。例如,谷歌的开源NASnet模型和ENAS算法在通用超参数调优上走得更远 。当然并不是说后一种方法更好更先进,而是有些问题很难用超参数来描述,比如用超参数来表示每一层的输入在哪一层的前面 。在这里,我们不妨推荐一篇文章,介绍基于策略梯度的NAS的经典实现:
https://lab . wall arm . com/the-first-step-by-step-guide-for-implementing-neural-architecture-search-with-reinforcement-99 ade 71 B3 d 28
对于超参数容易描述和实现的模型结构,实现NAS并不那么困难 。我们不需要自己实现类似于策略梯度(后面会详细介绍)的启发式调优算法 。我们可以使用一些现有的超参数调优库,只要实现了机器学习模型的训练过程,并返回最终的索引结果 。
所以我尝试使用Google Vizier开源实现顾问上的NAS功能,发现不到100行代码就可以实现自动生成网络结构的完整功能,并且不需要服务器做任何修改 。我们可以用几十行Keras代码或者TensorFlow等有含义的框架 。我们只需要提前描述一下hyperreferenced search空room,我也向Github提交了示例代码 。
Github链接:
https://github . com/tobegit 3 hub/advisor/tree/master/examples/keras
网络接入系统的优化算法
如前所述,NAS算法是一种搜索算法 。除了定义搜索空区间外,还需要一个能收敛的启发式优化算法 。因为生成一个网络模型的search 空区间一般都很大,如果search 空区间不大,可以暴力枚举,需要训练评估生成一个模型的质量,成本也很大 。
这时候我们想到的优化算法有贝叶斯优化、粒子群优化、策略梯度、DQN等等,都可以用来优化NAS的内部模型 。是的,NAS内部也有一个模型,在论文或代码中一般称为控制器模型,它控制要生成的神经网络模型的结构,生成的神经网络模型会根据客户的使用场景(如图像分类)返回模型效果对应的指标,一般称为子模型 。
前面介绍了基于Advisor的NAS 。事实上,Advisor的内置调整模型被用作NAS的控制器模型 。默认是贝叶斯优化 。此外,只需要修改一个参数,就可以使用后端已经通过统一接口支持的随机搜索、网格搜索等调优算法 。
之前推荐的博客在强化学习中使用了策略梯度算法,包括后面提到的ENAS论文也使用了这种算法,而Google的其他论文介绍了进化算法和DQN的使用,AlphaZero在超参数整定中使用了贝叶斯优化,Deepmind最新的参数整定论文介绍了类似PSO的群优化算法 。
我们需要明白,这些算法本质上是一样的,都是黑盒优化算法,因为如果不知道优化目标和优化参数之间是否存在函数关系,无法从中获得梯度等信息,就只能根据超参数组合和最终的模型效果,从历史模型训练结果中选择超参数的变化值 。这些算法的区别在于算法的效率和复杂度,所以也会应用到不同的领域 。
我们经常看到玩围棋和游戏的人喜欢用DQN和A3C算法优化自己的模型,因为象棋和游戏都可以用软件模拟,可以很快收到奖励 。比如一分钟收集几十万个状态和奖励,就足够训练一个高度复杂的AlphaZero模型(基于ResNet) 。但是AlphaZero的超参数调优使用的是基于高斯过程的贝叶斯优化,因为重新训练模型来调整超参数的代价非常大,大概需要几个小时才能得到一个状态和奖励,不足以训练一个比ResNet弱很多的神经网络模型 。但是,可以在数学上假设所有超参数都符合联合高斯分布,然后通过高斯过程计算状态和回报的相关度的均值和方差,然后基于探索/剥削原理选择下一个更好的探索点,这就是贝叶斯优化的实现原理 。其实这也解释了为什么Google之前基于DQN和进化算法的NAS模型需要上百个GPU并发训练好几个月,因为评估一个模型结构的好坏真的很耗时,这也是为什么ENAS在解决了评估模型的问题后效率如此之高,后面会详细介绍 。
下面有一个更直观的示意图来解释为什么贝叶斯优化在数学上优于随机搜索算法 。首先,红点表示已经探索出超参数 。这里只需要调整一个超参数X,Y轴表示选择这个超参数X后模型的效果,可以认为Y是模型的正确率,即越大越好,以及蓝线的真超参数X和正确率Y的对应关系,因为我们不能遍历所有的X,所以我们对蓝线是未知的,我们的目标是通过知道几个红点找到蓝线的最高点 。上图中有虚线和浅蓝色区域,是贝叶斯优化中高斯过程返回的均值和方差 。均值和方差在X值范围内,分别代表这个X点的期望正确率和这个X点可能浮动的空 。
仔细看可以发现红点必然在虚线上,因为这个点已经被探索过了,也就是用这个X训练模型得到了正确率,所以这个点必然在蓝线上 。浅蓝色区域代表这一块可能的浮动空空间,所以浅蓝色区域虚线越大说明这一块值得去挖掘,可能会发现新的高点不一定,而虚线越高说明这一块的预期Y值也越大,同样值得去挖掘 。为了平衡探索和探索,我们有下面这个效用函数,也是算法 。我们可以简单的认为它是一条均值加时间的方差得到的曲线,然后取最高值作为下一个探索点,因为这个探索点代表了这个X位置的预期Y值,还有更多未知的可能性需要探索 。如果你觉得难以理解,建议先参考贝叶斯优化:更好的超参数优化方法(http://cj.9446.cn/wp-content/wp-uploads/2022/09/1749ppENAS也是NAS实现的一种,所以也需要人类先给基本网络结构search 空 room,这也是目前ENAS的一个局限(文中没有提到) 。ENAS要求人类给出生成的网络模型的节点数,也可以理解为层数,也就是说,人类要求ENAS设计一个复杂的神经网络结构,但如果人类说只有10层,ENAS不可能产生一个10层以上的网络结构,更不用说一个带有空的ResNet或incident了 。当然,我们可以把节点的数量设计成10000个或者1000000个,这样生成的网络结构会复杂很多 。那为什么会有这样的限制?原因在于ENAS的E(高效) 。
您可能知道为什么ENAS比其他NAS更高效,因为参数共享 。这里的参数共享是什么意思?你知道模型重量是共享的吗?然而,ENAS将生产和尝试各种模型结构 。不同型号的权重可以共享吗?其实这里我把参数共享翻译成了权重共享,也就是说这个参数就是模型权重的意义,如何在不同的模型结构之间共享参数是ENAS的关键 。ENAS定义了节点的概念,它类似于神经网络中的一层,但由于该层必须附着在前一层的后面,因此节点可以任意替换预先输入 。
下面有一个更直观的示意图 。对于普通的神经网络,我们通常取上一层的输入作为每一层的输出 。当然,我们也可以定义一些不一定是一条线的分支的组合关系,ENAS的每个节点都会有一个节点前索引属性 。在此图中,节点1指向节点0,节点2也指向节点0,节点3指向节点1 。
事实上,ENAS想要学习和选择的是节点之间的连接关系 。通过不同的连接会产生大量的神经网络模型结构,从中选择最佳连接相当于“设计”了一个新的神经网络模型 。如果你理解了,你可能会觉得这个生成的神经网络的结构有点低,因为生成的网络结构风格都差不多,节点数必须固定,甚至很难在里面创建一个像1x1轮询这样的新结构 。是的,所有这些论点都是对的 。目前ENAS能做的就是帮你改变连接,然后生成新的模型,但这是分担ENAS权重的基础,它能帮你调整模型结构,以极低的代码量生成更好的模型 。接下来,介绍了ENAS E(Efficient)的实现原理,这是本文的核心部分 。
我们知道,TensorFlow表示张量数据的流向,流向的蓝图是用户用Python代码定义的图形 。如果要实现上图中所有层连成一条直线的模型,需要在代码中指定多个层,然后用这个连接输入输出,这样就可以训练出一个模型的权重 。当我们把上图中所有层连成一条直线的模型换成右交叉连接的模型时,很明显两个模型是不同的图,前一个模型的权值从中导出的检查点不能导入到后一个模型中 。然而直观上,这些节点的位置并没有改变 。如果输入和输出张量的形状不变,那么这些节点的权重是相同的,也就是说,左边Node0、Node1、Node2和Node3的权重可以完全复制到右边对应的节点上 。
这是ENAS的重量分担原则 。首先会定义一个固定的节点数,然后每个节点所连接的前沿节点的指标会被一组参数所控制,这也是我们最终会挑选出来的,因为它可以代表一个固定的神经网络结构,所以我们只需要使用前述的贝叶斯优化、DQN等优化算法来优化选择最佳的一组参数即可 。
评价模型是否由多组参数组成,然后用新的网络结构训练模型得到AUC等指标?答案是否定的,如果是,那和常见的NAS算法没什么区别 。因为模型的训练后评估是一个非常高效的操作,这里的评估模型是指每组模型使用相同的一组权重,在未训练的验证集中产生影响,最终选择AUC或者精度最好的模型结构,实际上就是节点的连接方式或者表示连接方式的一组参数 。
总结一点,因为ENAS生成的所有模型中的节点数都是一样的,节点的输入输出也是一样的,所有模型中所有节点的权重都可以加载使用,所以我们只需要训练一次模型就可以得到权重,然后让每个模型验证集合来做一个估计,只要找到更好的模型 。其实这个过程会进行很多次,一段时间后这个组的共享权重会更新 。比如我找到了一个更好的模型结构,我就可以用这个接口来训练和更新权重,然后看看其他的模型结构在使用了这组权重之后,在验证机中是否能表现的更好 。
【功放parameter是什么意思 parameter是什么意思】回到之前TensorFlow实现ENAS的问题,我们知道TensorFlow要求开发者先定义Graph,然后加载权重运行,但是定义Graph的过程和模型训练的过程是分开的,ENAS要求我们在模型训练的过程中不断调整Graph的结构,尝试更好的Graph模型结构 。其实这在声明式编程接口的TensorFlow上实现并不容易,在命令式编程接口的PyTorch上实现更好 。当然,TensorFlow在这里可以改名,因为《ENAS》的作者提供了基于TensorFlow的ENAS源代码的实现,开源地址是https://github.com/melodyguan/enas.我们也深入查看了代码 。作者使用了很多tf.case、tf .等接口,而实际上最终训练好的子模型的图是根据TensorFlow的图中的参数生成的,所以所有子模型的图集并不是Python代码定义的,也不需要每次都重新构建图来影响模型训练的性能 。
除了节点之间的连接,ENAS论文中可以训练的超参数还包括上图所示的激活函数,每个节点使用的激活函数由控制器模型输出的一组参数决定,这些激活函数不需要重新训练,只需要直接加载共享权值然后做一个推理就可以参与模型评估 。
很多人可能觉得目前共享权比较简单,只能实现矩阵乘加,也就是全连接层的功能 。但是,在图像中会使用更多的卷积网络,还会有滤波器大小和轮询内核大小等参数可供选择 。事实上,ENAS已经考虑到这一点 。这些节点拥有的权重和使用权重的方法称为单元 。目前已经提供了乘法和卷积两种细胞,并在PTB和Cifar10数据集上进行了验证 。当然,将来可以添加RNN等细胞,甚至可以将多个细胞混合在一起 。当然,这在实现中需要更复杂的判断和实现,比如前置节点的连接 。
对于ENAS控制器模型的参数整定,本文采用了强化学习中的策略梯度 。当然,如前所述,使用贝叶斯优化、DQN和进化算法是没有问题的 。然而,目前ENAS的控制器模型和共享权重的实现是放在一起的,因此很难扩展新的控制器优化算法 。未来,我们希望在Advisor中集成更多的优化算法(贝叶斯优化、随机搜索、网格搜索、规划支持策略梯度、DQN、进化算法、粒子群优化等)),以便ENAS和其他NAS算法也可以使用这些更容易实现的调整算法 。
总的来说,ENAS为我们提供了自动超参数整定和自动生成神经网络结构的新思路 。通过共享权重,所有生成的模型都不需要重新训练 。我们只需要做一次推理就可以得到很多的状态和奖励,为后面的优化算法提供了很多真实的训练样本和优化数据 。这是一种成本非常低的调优尝试 。虽然我们可能找不到更好的模型结构,但是我们可以在这么大的搜索空中快速验证新的模型结构和调优生成模型结构的算法,至少我们在验证过的PTB和CIFAR-10数据集上有了很大的突破 。
当然,我们也不能忽视ENAS本身的缺陷(这也是未来优化ENAS的方向) 。首先,为了分担权重,节点的数量必须一致,这将限制生成模型的多样性;目前只考虑记录前一个节点的索引,后期可以考虑连接多个节点,创建更大的搜索空空间和更复杂的模型结构 。第三,目前会用某个模型训练的权重来复用所有模型进行评价,对其他模型可能不公平,可能导致效果并不比当前训练的模型好 。最后,基于会议的当前评价中可以调优的参数,必须在会议的过程中有所体现,比如学习率、辍学率等超参数是无法调优和选择的 。
摘要
最后,本文介绍了业界主流的自动生成神经网络模型的NAS算法和目前最流行的ENAS算法 。在整理这篇文章的时候,我发现NAS的原理其实很简单,在一定范围内搜索空就很好理解了 。但是,为了解决这个问题,在优化中使用了贝叶斯优化、强化学习等黑盒优化算法,在样本生成中使用了权重共享和多模型噪声,在编码实现中使用了写图动态生成图的高级技巧 。因此,要读好一篇论文,你需要一双欣赏的眼睛 。
本文感谢Hieu Pham,Melody Guan,Barret Zoph,Quoc V Le,Jeff Dean 。
作者简介
陈,第四范式先知平台架构师,曾在小米科技和UnitedStack担任基础设施工程师 。活跃于OpenStack、Kubernetes、TensorFlow等开源社区 。,并实现了云机器学习云深度学习平台 。
本文来自AI前线,经创业一族授权,略有编辑修改 。版权归作者所有,内容仅代表作者独立观点 。【下载企业家APP,阅读中国最赚钱的7000家企业】

    推荐阅读