论文阅读:《Efficient Neural Architecture Search via Parameter Sharing》

pdf

《Efficient Neural Architecture Search via Parameter Sharing》
Hieu Pham · Melody Y. Guan · Barret Zoph · Quoc V. Le · Jeff Dean
2018-02-12

ICML 2021有关NAS的论文

在paperdigest网站上显示,这篇文章的影响因子高达9!

必看论文!

注意到这篇论文正是Zoph大神写的。



简介

本文要着重解决的问题是标准NAS时间过长的问题。
标准NAS就是一板一眼地生成新架构、从头训练评估这个架构,然后将评估结果返回给架构生成器,以便生成出新架构。最初的研究中,一次完整的NAS需要450个GPU跑3~4天,约合3~4万GPU hours(来自2018年Zoph等人的工作)。
本文作者敏锐地注意到,这种原始的NAS每训练好一个网络,在评估完架构的准确度后就直接把训练好的权重扔掉了。而这其实是可以利用的地方。如果能对这些权重善加利用,就能够节省许多训练时间。

本文的主要贡献是,让所有child model强制共享权重,从而规避了从头训练每个child的问题。
并且实践下来我们发现,参数共享的方法不仅是可行的,而且还能够带来更强的性能。

本文的工作ENAS只需在Nvidia GTX 1080Ti GPU上跑不超过16小时即可完成。这一效果比NAS好了1000倍!(大概两千倍)。由于它实在是非常“有效”,这一技术被命名为ENAS(Efficient Neural Architecture Search)。

我读这篇文章的主要目的就是学习它的权重共享思路。


正文

NA架构-搜索空间

先说ENAS的网络架构模型。网络架构:Neural Architecture,后文简称NA。NA\(\in\)搜索空间。
ENAS用DAG表示神经网络的结构,其中节点表示本地运算(local computation),而节点之间的连线表示数据的流通。(其他工作中有时用另一种表示方式,即节点表示特征图,这两者不要搞混。)

ENAS的Controller

controller是NAS的重要组成部件,负责生成NA。
ENAS的Controller是一个RNN,决定了1)哪些edge要激活;2)在每个节点上要进行什么种类的运算。
本文的controller使用的是一个100个隐含单元的LSTM。
controller的policy可以用\(\pi(m;\theta)\)表示。其中m表示model,即一个NA。

为什么要在这里填入一个NA?不能是\(m=\pi(\theta)\)吗?
我推测这里是表示一种分布,而非一个函数。假如试图写成函数的形式\(m=\pi(\theta)\),那这个函数每次返回的结果不一样,这并不符合数学中对函数的定义。这种每次返回结果不一样的“函数”倒是蛮符合计算机领域的直觉,我可能是代码写太多变得不熟悉数学语言了吧。

Recurrent cell

特别地,我们关心如何设计一个recurrent cell。本文对recurrent cell的设计和Zoph&Le在2017年所做的工作不同,他们当时将网络的拓扑结构固定成一个binary tree,只学习树中每个节点执行的操作。而本文的设计则两者都可以改,因此更加灵活。

这是原文中用来阐述创建recurrent cell的图。
一个recurrent cell有两个输入和一个输出,两个输入分别是正儿八经的外界输入x[t],和上一time step的遗留信息h[t-1]
一个recurrent cell搜索出来可能就像上图这样。其中左图红色的edge表示,这些数据通路是激活的。
不难发现,左图如果算上红黑线,其表示的有向图的基本图是一个无向完全图。也就是说这个搜索空间是这样构建的:先规定需要N个节点,然后给节点标上序号1~N,序号1接收x[t]和h[t-1],后面的序号有机会接收所有序号比它小的节点的输出,因此对这些节点进行两两连线,并按照序号大小决定箭头方向,序号小的为箭尾,序号大的为箭头。
有时搜索出的图是不收束的,即出度为0的节点不止一个,例如上图例子中的节点3和节点4,这时它们的输出会取平均后成为输出(正如上图右半边那样)。
上图对应的计算式可以写成:

\[res_1=tanh(x[t]\cdot W_x+h[t-1]\cdot W_{0\rightarrow 1}) \]

\[res_2=ReLU(res_1\cdot W_{1\rightarrow 2}) \]

\[res_3=ReLU(res_2\cdot W_{2\rightarrow 3}) \]

\[res_4=tanh(res_1\cdot W_{1\rightarrow 4}) \]

\[h[t]=\cfrac{res_3+res_4}{2} \]

(公式与原文表示有差异,本质是一样的)
按我的想法,有时搜索出的图是支离破碎的,即中间存在不连通的子图,这种情况可以筛去,又或者原文可能有独特的处理方式。

我们来计算一下搜索空间的空间复杂度。仅限上述讨论的一个recurrent cell,假定允许N个节点和L种节点类型,共有多少种可能的图?
我是这样算的:共有N个节点,每个节点有Rt种可能;共有\(\cfrac{N\cdot(N-1)}{2}\)条边,每个边有激活和不激活两种可能。这样算下来,不考虑病态图(非连通图以及其他可能的病态图)的剔除,共有\(Rt^N\times 2^{\frac{N\cdot (N-1)}{2}}\)种可能的图。实际上剔除掉病态图后应该更少。
原文计算得到的是\(Rt^N\times N!\),我觉得不太对,没有这么多。

Convolutional Cell

本文的Convolutional Cell(后简称Ccell)和我想象中vanilla的版本不太一样,比较奇怪。
本文的Ccell必定接受另外两个cell的输入。与其叫它Ccell,我个人其实更愿意叫它Merge Cell。
并且,Ccell有两处都出现了merge,一开始把我搞蒙了。
一个Ccell本身内部有若干节点,其中node1 node2是输入,也就是有两个输入。因此在Convolutional Network的搜索中,需要为这个Ccell指定两个输入。这是一个merge。
Ccell本身内部的节点,排除掉两个输入节点,剩下的节点也分别接受2个来自其他节点的输入,分别处理后相加得出节点结果。

如图所示。
image

确定好了结构,我们就容易分析出,要生成这样一个Ccell,需要给定node3 node4的各个参量。
放在一般情况下,假设有B个内部Node,那么剔除掉两个输入节点,就有B-2个可变node。每个可变node都需要指定2个前驱节点和2个操作类型参量。本文为node支持的操作类型有5种,分别是identity(不变),sep_conv 3x3, sep_conv 5x5, avg_pool 3x3, max_pool 3x3。前驱节点必须是序号更小的节点,否则会成环。
(sep_conv: seperable convolution)

Convolutional Network

疑惑。
我认为本文的论述前后矛盾。
本文原文将Design Convolutional Networks放在了Design Convolutional Cell之前。
在Design Convolutional Networks一节中,使用了这张图:

image

图中没有任何节点接收2个前驱节点,也没有任何节点标有“自定义cell”的字样。
concat不算正式的节点。即便concat算作正式的节点,那它也不该接受3个输入,应该是2个。

训练过程

在ENAS中有两部分可学习的参量:LSTM controller的参数\(\theta\),和child模型相互共享的参数\(\omega\)

训练模型参数\(\omega\)

\(\omega\)的训练目标可用数学语言表示成:

\[\nabla_\omega\mathbb{E}_{m\sim\pi(m;\theta)}[\mathcal{L}(m;\omega)] \]

解释起来是这样的:首先m表示模型,是一个符合\(\pi(m;\theta)\)分布(也就是controller policy)的值。然后,\(\mathcal{L}(m;\omega)\)表示这个模型m和模型对应的权重\(\omega\)伙同起来得出的Loss,注意到此处\(\omega\)是所有模型共享的参数,所以不需要让每个模型都拥有一个独占的\(\omega_m\)。又因为m是一个随机变量,因此这个计算出的Loss实际上也是一个受控的随机变量,\(\mathbb{E}(...)\)正是要做Loss的无偏估计。综上所述,可简记

\[E(\theta,\omega)=\mathbb{E}_{m\sim\pi(m;\theta)}[\mathcal{L}(m;\omega)] \]

这样看起来比原式更简洁,并且更容易看出m只是一个“中间变量”,真正主导这个值的还是\(\theta\)\(\omega\)
进一步,我们需要求的值是上面这个无偏估计关于\(\omega\)的偏导数,即

\[\nabla_\omega E(\theta,\omega) \]

基于蒙特卡洛(Monte Carlo)估计,有

\[\nabla_\omega E(\theta,\omega)= \nabla_\omega \mathbb{E}_{m\sim\pi(m;\theta)}[\mathcal{L}(m;\omega)] \\ \approx\cfrac{1}{M}\sum_{M}^{i=1}\nabla_\omega\mathcal{L}(m_i,\omega) \]

也就是说明了取M个点,分别计算\(\nabla_\omega Loss\)再取平均即可得到大概的值。这个公式没什么高深的。

作者表示,令人惊讶的是,这个M取1就可以工作得很顺利了。

我推测是因为SGD这种梯度下降算法本身由于会迭代很多次,相当于把重复取很多次i的工作完成了,所以这里并不需要取一个较大的M。

训练控制器参数\(\theta\)

\(\theta\)的训练目标可表示成:

\[max(\mathbb{E}_{m\sim\pi(m;\theta)}[\mathcal{R}(m;\omega)]) \]

\(\mathcal{R}(m;\omega)\)表示模型m和参数\(\omega\)对应的reward,这个反馈在validation set上取得。

但是根据\(m\sim\pi(m;\theta)\),m应该是一个随机变量。因此\(\mathcal{R}\)也是一个随机变量,它仍然需要经过无偏估计算符\(\mathbb{E}\)才能变成一个确定变量。(姑且就把\(\mathbb{E}\)当成算符吧)

作者提到,在这一步骤中,ENAS取样若干个m,并直接在validation set上验证,取其中reward最高的一个m,对它进行从头开始的训练。“对所有取样的m都进行从头训练,然后再取效果最好的一个的话,可能对最终的搜索结果有好处。但是只取一个的做法已经可以达到类似的性能,同时非常地经济(非常节省)。”

实验

本文做了两部分实验,一部分是在Penn Treebank上进行的NLP NAS,另一部分是在Cifar10上进行的Classification NAS。
效果当然是很好。

参数共享去哪了?

通篇似乎都没有详细讲参数共享,只提了一嘴,说参数共享是受到Real等人在2017年~2018年的工作的启发。

Real等人的工作:

《Large-scale evolution of image classifiers》in ICML, 2017
《Peephole: Predicting network performance before training》2018


一点吐槽

原文的篇章有些部分的顺序读起来不太舒服,比如没有单独介绍controller(虽然只需要一句话),比如硬要把train和Design Convolutional Network塞在Rcell(Recurrent cell)和Ccell(Convolutional cell)中间。总之,我按照自己的理解对原文进行了一定的重排,疑虑较大的地方我已经注明了。


被引分析

来自readpaper的被引文献列表
共 514 条,按被引数排序,仅看前二十
[1] SNAS: Stochastic Neural Architecture Search
[2] Transformers in Vision: A Survey
[3] Single-Path NAS: Device-Aware Efficient ConvNet Design
[4] AutoLoss: Learning Discrete Schedules for Alternate Optimization
[5] FasterSeg: Searching for Faster Real-time Semantic Segmentation
[6] Computation Reallocation for Object Detection
[7] BATS: Binary ArchitecTure Search
[8] Blending Diverse Physical Priors with Neural Networks
[9] Do Normalization Layers in a Deep ConvNet Really Need to Be Distinct
[10] Teacher Guided Architecture Search
[11] Do Normalization Layers in a Deep ConvNet Really Need to Be Distinct (重复)
[12] Exploring Shared Structures and Hierarchies for Multiple NLP Tasks.
[13] Teacher Guided Architecture Search(重复)
[14] FasterSeg: Searching for Faster Real-time Semantic Segmentation(重复)
[15] Progressive Differentiable Architecture Search: Bridging the Depth Gap between Search and Evaluation
[16] Evaluating The Search Phase of Neural Architecture Search
[17] DCNAS: Densely Connected Neural Architecture Search for Semantic Image Segmentation
[18] Angle-based Search Space Shrinking for Neural Architecture Search
[19] Detection and visualization of abnormality in chest radiographs using modality-specific convolutional neural network ensembles
[20] Exploring the Loss Landscape in Neural Architecture Search

来自谷歌学术的被引文献列表
共 1644 条,按相关性排序,仅看前二十
[1] (9619) Squeeze-and-excitation networks (2018)
[2] (2069) Darts: Differentiable architecture search (2018)
[3] (1529) Transformer-xl: Attentive language models beyond a fixed-length context (2019)
[4] (1470) Mnasnet: Platform-aware neural architecture search for mobile (2019)
[5] (1295) Progressive neural architecture search (2018)
[6] (1382) Searching for mobilenetv3 (2019)
[7] (1203) Neural architecture search: A survey (2019)
[8] (987) Proxylessnas: Direct neural architecture search on target task and hardware (2018)
[9] (1108) Advances and open problems in federated learning (2019)
[10] (788) Autoaugment: Learning augmentation policies from data (2018)
[11] (821) Autoaugment: Learning augmentation strategies from data (2019)
[12] (701) Rethinking the value of network pruning (2018)
[13] (657) Fbnet: Hardware-aware efficient convnet design via differentiable neural architecture search (2019)
[14] (606) Auto-deeplab: Hierarchical neural architecture search for semantic image segmentation (2019)
[15] (565) SNAS: stochastic neural architecture search (2018)
[16] (450) A genetic programming approach to designing convolutional neural network architectures (2017)
[17] (413) Demystifying parallel and distributed deep learning: An in-depth concurrency analysis (2019)
[18] (410) Neural architecture optimization (2018)
[19] (402) Haq: Hardware-aware automated quantization with mixed precision (2019)
[20] (532) Randaugment: Practical automated data augmentation with a reduced search space (2020)


相关其他链接:
专栏写起来要随意一些,不像论文那样正式、惜字如金,国内的很多分析性的专栏写得真的很不错。
知乎ENAS: 更有效地设计神经网络模型(AutoML)(仔细看下来后发现里面的论述有点问题)
David 9你想要的神经网络自动设计,谷歌大脑帮你实现了:用参数共享高效地搜索神经网络架构(ENAS)(仔细看下来后发现并没有详述ENAS的权重共享方法)

posted @ 2021-11-23 13:53  小玄不要说话  阅读(240)  评论(0)    收藏  举报