论文阅读:《Neural Architecture Search without Training》


pdf

说明
论文阅读以理解转述为主,不进行大段的翻译工作。


摘要

手工设计deep neural network耗时耗力。
NAS(Neural Architecture Search,神经架构搜索)技术应运而生。
然而,NAS也很慢很贵(贵指时间、算力上的贵)。主要原因是,每当NAS搜索出一个架构时,都要设法评估这个架构的性能。这通常需要从头训练整个网络。
如果我们可以仅凭架构本身就判断它的性能,就能够省去很多时间和算力。

简介

这篇文章的有关NAS本身的介绍还算不错,比起很多其他领域里连脉络都梳理不清的文章好多了。
简言之,深度学习领域手工设计神经网络架构非常麻烦,神经架构搜索方法在2017年应运而生(Zoph & Le)。在最初的版本中,Zoph和Le采用强化学习的方法反复生成网络架构并进行评估。
初版NAS消耗非常巨大,约合800GPU工作28天。
新出现的“细胞搜索(而非搜索全图)”和“权重共享”等技术逐渐让NAS的cost缩减到在单块GPU上工作半天(Pham等人)。

但即便这样,NAS在一些场景下仍然很慢。如果能够在不训练网络的情况下进行NAS,那么事情就会有很大改观。
(NAS的基本操作就是【搜索器】在【搜索空间】中搜出网络架构,【评估】后决定下一次要给出什么样的网络架构,而评估阶段的古早方法是对网络架构进行从头训练。)

本文综合探索了NAS-Bench-101,NAS-Bench-201,NATS-Bench和Network Design Spaces (NDS)这四个数据集(目前我还不知道是数据集还是项目,姑且就当是数据集吧)。
本文为这些数据集中的架构给出了一种identification矩阵。这样一来,只要事先建立起id矩阵-性能的【评估器】,在自己部署的NAS过程中就无需训练网络架构,只需将网络架构的id矩阵丢进评估器即可得到性能的估计值了。
这种矩阵大概长这样:

运用本文的方法,加上NAS-Bench-201的搜索空间,可在30s内,搜索出准确度为92.81%的网络架构。

【个人见解】
相当于是说,将NAS的计算任务负荷分成两块,一块是架构的【生成器】,另一块是架构的【评估器】。传统方法中,评估部分占比巨大,而通过本文的方式,网络架构性能评估的消耗被大大降低。
但是,是否可以说,这篇论文的工作实际上只是对NAS-Bench系列数据集的一次测试?只是否定了“NAS-Bench这类型的数据集并不能让NAS脱离训练进行搜索”的命题?
读到这里,这篇文章的局限性还是很大,分为这几个方面:
1,NAS-Bench对应的场景较为单一。它搜索的架构,只能对付cifar数据集的分类任务。面对不同的数据集,我们可能仍需像构建NAS-Bench数据集一样从头构建一个新的数据集,这就又回到老方法上了。
2,与上一点类似,本文搜索的架构,只能对付cifar数据集的分类任务。如果在cifar数据集上进行其他任务,比如自监督学习中施加一定的mask并还原全图的任务,或者图像超分辨率的任务,则束手无策。
不过有局限就有研究的余地。对应的研究思路也有好几个:
1,迁移。本文的naswot负责搜索出各种能在cifar数据集上达到不错效果的架构,然后我们再拿着这些架构,看看能否在其他数据集/任务上完成迁移。任务迁移倒还是有可能,这一点是迁移学习本身的能力,但是数据集迁移就不好说了,只能依靠数据集之间本身的共通性。


源码

作者提供了开源项目:https://github.com/BayesWatch/nas-without-training
现理解一下他的代码。

环境安装:
在项目目录下的env.yml的最后一行

                # - "--editable=git+https://github.com/google-research/nasbench#egg=nasbench-master" # 安装时会发生名称不一致的错误
                - "--editable=git+https://github.com/google-research/nasbench#egg=nasbench"

另外还需要去掉tensorflow-gpu==1.15.0的版本限制,只留tensorflow-gpu因为必须安装的nasbench已经更新到支持tensorflow2.7,如不去掉这个限制会导致包版本不匹配,进而无法配置正确环境。版本升级带来的问题需要后续解决。
修改后再按Readme执行conda env create -f env.yml即可。

数据下载

根据开源项目的Readme文件,此项目需要做四件事:
1,安装nasbench
2,下载nds data
3,下载nasbench101
4,下载nasbench201
暂且跳过,以后有空的时候再看看要不要写一个一体化的安装脚本。

试运行

先将score_networks.py中的路径进行修改。
./scorehook.sh里面的代码太多,暂时取了第一行python score_networks.py --trainval --augtype none --repeat 1 --score hook_logdet --sigma 0.05 --nasspace nasbench201 --batch_size 128 --GPU 3 --dataset cifar10