首发于论文笔记
CVPR2020NAS论文解读(1)

CVPR2020NAS论文解读(1)

好久没更新这个专栏了,这次来解读自己的文章Rethinking Performance Estimation in Neural Architecture Search

本来想直接把论文代码都放出来,结果和老师沟通后说论文不能放要申请专利,好在代码完全OK,所以目前就进行了开源,然后解读一下自己的文章了。

我们知道,一般而言,神经网络检索分为三个部分,搜索空间,搜索算法,以及精度估计[1],搜索策略从搜索空间中采样,产生网络,然后进度精度估计算法当中,进行精度估计,得到的结果返回,更新搜索策略,然后依次循环。

从上面的流程中,我们可以思考一个问题,到底是什么过程让NAS如此耗费时间呢?搜索空间抛开不谈,搜索策略吗?明显不是,且不说传统的RL,进化计算,网格搜索,贝叶斯优化并不消耗时间,就最近的DRL而言,也往往是很少的消耗时间,真正消耗时间的反而是精度估计部分,NAS之所以慢,因为我们采样之后,都要进行很长时间的训练,测试,才知道这个网络到底好不好,那么是不是说明,想一个办法减少精度估计时间,那么整体的NAS就可以提速。这就是这篇文章的初衷。

首先就搜索空间而言,其实18年左右的时候,大家都跟着google一系列NAS文章的产出,大家都认为搜索空间可能是cell/block 的结构更好,比如resnet,就是一堆resblock 堆叠而成,再比如densenet 也是一样,就是说,我只要搜索基础的网络结构,然后不断的堆叠就可以了,这就是cell based 搜索空间。当然,最近也有很多文章,比如FBnet proxylessNAS,在mobile setting下,反而是链式结构更好,但是这篇文章当中我们不做讨论。

首先要定义一个,什么是精度估计呢?一般的NAS搜索算法分为两个部分,我先用很小的网络结构上面搜索,比如DARTS的搜索网络的层数仅仅有8层,粗糙的训练完(epoch仅仅为50)之后,我得到最优的cell/block,然后堆叠20层,训练很久来获得最终的网络结构(epoch 为 600)。

那么第一个问题就是,有人保证了我在8层的网络结构上搜索出来的最好的cell在20层的情况下也很好吗?没有。这是这篇文章要解决的第一个问题。

第二个问题,什么是精度估计呢?在这里我们定义为 一堆除了网络结构的超参数,比如在 cell的结构里面,是不管channel数量,训练次数,层数等超参数,我们定义这些为精度估计,包含有:Epoch/Batch size/ Learning rate/ N Layers/ Float point/ Channels/ Cutout/ Image Size。不同的组合,我们认为是一个精度估计的“样本”。

第三个问题,如何定义一个好的精度估计呢?为了解决这个问题,我们首先要知道,什么是我们需要达到的目标:希望我们的样本训练出来的网络的排序和最终验证阶段的保持一致。最理想的状况下就是对于搜索空间,我直接采样所有的网络,按照DARTS里面验证的方式,“堆叠20层,训练600epoch,cutout等”获得所有网络的排序,然后我再用我自己采样出来的训练方式,重新训练一次,只要排序尽可能的接近,那么我们就认为,这个是一个好的精度估计,在这里,我们直接用皮尔曼相关系数来进行计算,直接把两个rank丢进去计算相关系数。

如何解决呢?首先,采样所有的网络基本上不可能,所以我们这次采样100个网络结构,然后用darts里面验证的方式,来进行这100个网络的训练。这个相当消耗时间,我们计算了一下,需要在一个Tesla V100上,训练108天。获得100个网络之后,我们可以愉快的采样,然后对比,这个样本点的好坏,其实本质上更像是搜索NAS的超参数。那么问题又来了,每一次进行采样,都要训练100个网络,太消耗时间了。所以在这篇文章当中,我们想了一个比较讨巧简单的办法。

  1. 采样时间开销比较小的样本点,比如10个(也就是说要训练1000个网络)。
  2. 对于得到的结构,联合之前所有的采样样本,构建一个回归随机森林。
  3. 利用回归随机森林计算每一个样本点的重要性,剔除掉最不重要的超参数(比如cutout)
  4. 回到1,直到样本中只剩下最后一个超参数,搜索结束。
  5. 回溯整个搜索流程,选里面尽可能又快又好的,搜索结束。

通过这种方式,我们其实也搜索了很长时间...差不多也要100+GPU/days吧,但是只要搜索结束,是可以服务大众的,可以让大家在自己家单张显卡上快速验证NAS算法。首先,我们找到的超参数组合:

相比于DARTS,我们找到了一组速度更快,但是时间消耗更短的组合(BPE-2)还有一个速度超级快的BPE-1。那么直接哪来在cifar10上搜索效果如何呢?

可以看到的是,基本上打败了所有的NAS算法,并且在随机搜索上,效果也很好。并且速度还更快。最后,为了给大家一个迁移的指导,我们画出了每一组超参数的趋势,好让大家迁移到自己数据集的时候,作为指导,知道什么超参数不太重要,什么比较重要:

最后,因为之前很多文章一直都在抨击one shot的方法,在这里,因为我们找到很快的精度估计方法,我们可以知道,one shot NAS中每一次采样,到底精度如何,一次来探究这种方法的机理:

我们可以发现,其实one shot 方法,局部的rank是比全局的高很多..当然有些时候也会很差,这就解释了为什么one shot方法为什么work,以及随机性很大的原因,work的原因是可以真正的通过采样获得排序,随机性很大的原因是仅仅只局部有效,在全局的角度而言,根本不相关...

以上!

NAS搜索代码已经开源:

zhengxiawu/rethinking_performance_estimation_in_NASgithub.com图标

论文也已经放出来:

https://arxiv.org/pdf/2005.09917.pdfarxiv.org

[1]Elsken T, Metzen J H, Hutter F. Neural architecture search: A survey[J]. arXiv preprint arXiv:1808.05377, 2018.

编辑于 05-21

文章被以下专栏收录

    主要看一些paper的随意笔记,主要记录paper的主要思想,而不是详细的文章。