[NAS论文]AttentiveNAS: Improving Neural Architecture Search via ..

苏道 发表于 2021/04/30 11:16:53 2021/04/30
【摘要】 性能超越BigNas、Once-for-all。对于two-stages的NAS来说,搜索阶段关注的是位于准确性和推理效率的帕累托前沿的网络集合,而训练阶段并不是为了改进帕累托前沿而进行的,对每个网络候选对象都同等重要,fair的,希望搜索的帕累托前沿是被训练到的帕累托前沿,不然会有相关性系数导致的误差

AttentiveNAS: Improving Neural Architecture Search via Attentive Sampling】

作者:Facebook 大佬们

论文地址:https://arxiv.org/abs/2011.09011

论文源码:https://github.com/facebookresearch/AttentiveNAS

注:以下图片都来自论文原文、文字基于原文翻译和个人主观理解,作者水平很差,大家手下留情,如有错误欢迎大家指正,拜谢

【总结、太长不看系列

1、性能超越BigNas、Once-for-all,目前2021.4.13的top1,看下图1就知道有多强。

2、从2个角度改善supernet训练,第一个是搜索空间的设置,提供了搜索更depth和narrower子架构的机会,看图2的表画红圈的部分,第二个,关注sample到架构,和fairnas、spos、或者其他采样方式不同,本文关注的是帕累托前沿的架构,关注、帕累托最佳的前沿,或者帕累托最差的前沿,狂采样前者,是一种直觉,提高上限,起到带头作用,一人得道鸡犬升天,狂训后者是提高下限,把差的acc拉高,有利用整体的训练效果。

3、要狂训帕累托相关的架构,抽一丢架构跑前向,看谁是帕累托那太慢了,所以需要一个预测器,本文训练了一个预测器来预测架构精度来筛选谁是帕累托前沿的架构。

4、其他设置基本遵循BigNas,包括三明治法则训练和in-place 蒸馏

f998c47b826bed4a89fb2801b57de523_584x428.png@900-0-90-f.png

图1

98fd907582c445355190848f4ed930bd_1317x373.png@900-0-90-f.png

图2

【以下是细品】


【搜索空间带来的增益】

       本文的搜索空间是从FBNetV3改编而来的。与BigNAS[39]中使用的搜索空间相比,搜索空间包含了更深更窄的子网络,那是不是有用呢?看下图可以发现,差不多提升了1个点,搜索空间带来的增益其实很客观,如何设计一个好的搜索空间是个课题。

c1fbdd627586a648a514a960b71b073a_713x515.png@900-0-90-f.png



【为什么关注帕累托前沿的架构】

        对于two-stages的NAS来说,搜索阶段关注的是位于准确性和推理效率的帕累托前沿的网络集合,而训练阶段并不是为了改进帕累托前沿而进行的,对每个网络候选对象都同等重要,fair的,希望搜索的帕累托前沿是被训练到的帕累托前沿,不然会有相关性系数导致的误差。所以本文做了对比试验狂训帕累托最差/最好的架构(不是固定的),可以形象的看成是下图边界的子架构:

cc22e10eede49d4458cd1d8c215f153e_651x450.png@900-0-90-f.png


【架构怎么抽?】

    抽样FLOPs-constrained架构:对FLOPs目标为τ0的约束下,从π(τ)这个list中从k个架构,π(τ)是训练前先从超网络抽m ≥ 10^6个架构,也就是说为了抽到符合FLOPs约束的架构,需要从整个空间抽一堆,然后剔除不符合约束要求的架构,知道选到够了k个,然后acc最好的,就是best,最差的就是worst,然后抽下一个FLOPs数的k再选出最好最差,如此反复就把帕累托前沿的架构选出来了,但是这样效率很慢,因为从整个空间抽,符合约束的就没几个,作者用了近似的方法缩减了抽取的空间,使得中的概率大大提高。:

    

【预测器】

       但是上面抽架构还存在一个问题,是需要选出最好和最差的acc,不可避免的要对着k个架构用验证集刷一把,看看acc如何,但是这样很浪费时间,所以本文采用估计器的方法来估计这个性能指标。方法方便对照,用了2个估计器


  1.        Minibatch-loss作为性能估计器:对于每个架构,使用当前小批量训练数据上的训练损失作为度量;
  2.      在验证集训练一个预测器,用预测器来估计性能。那这个具体怎么玩呢,先把训练集90%用来训练,10%用来test,然后无约束情况下随机采样训练30epochs,然后随机抽1024个架构,用test测acc,这样就有1024个pair【architecture、accuracy】,然后用随机森林训出一个预测器。
   那这个预测器表现怎么样呢?这个预测器预测的acc和架构真实acc【stand-alone训练30epochs】相关系对比如下图:

8b70ffac307066ec7f2c73522d7d72f4_387x338.png@900-0-90-f.png

可以看到相关系kendall很高0.89了,所以预测还是很赞的,但是作者觉得supernet在训练过程中可能不稳定,毕竟这个只是30epoch 的时候训练出来的,会不会和stand-alone训练360epochs下的真实精度相关系差很多,所以作者又做了另一个对比。看下图

41fc11109e34a6f0e6e4149e6e2e6eb6_386x346.png@900-0-90-f.png

         上图可以看到,30epoch下训练处来预测器预测360epochs下stand-alone的精度一样准啊,哇,这,说实话我不是很信,这个图就暗示了stand-alone训练的acc精度排序就可以很好的暗示每个架构最终精度排序如何,那其实这个短期训练表征长期训练,其实是差很多的,那如果说,30epochs的预测器无法很好预测360epochs真实情况,那么这个得到架构之间的排序其实很值得质疑,也就是说,本文用这个方法得到的帕累托架构很有问题,一直训这样又问题的架构不能够反映表征一直训帕累托是不是好这个命题【我猜的】


【result】

方法看的差不多了,直接看结果吧,有几组对比数据,WorstUp-50(acc)【就是训最差帕累托,k=50】,Bestup-50(acc)【训最好的帕累托架构,k=50】、WorstUp-1M (acc)【离线抽了1百万的架构,所有预测一遍得到帕累托架构的最差集合狂训,可以理解为k很大】、Bestup-1M (acc)、Uniform【uniform采样】、WorstUp-3 (loss)【就是抽3个架构根据loss大小,选出最差的】、BestUp-3(loss)。下图是以Uniform采样作为基准:

3c13087dd0f06a1da9cbd4713b6a684e_662x467.png@900-0-90-f.png

比较有趣的是可以看到,
1、采用预测器,训好的帕累托,在FLOPs<500MFLOPs根本起不到正向的作用、而一直训预测出来是差的帕累托呢,一直都是正向作用
2、采用loss,训练好的帕累托前沿一直都很不错,无论在哪个量级【所以我觉得那个预测器其实真的不准
具体数据分布看下图:

73cb5a45306b1042d906a3439facbfc3_1327x391.png@900-0-90-f.png




可以看到:
1、预测器,训差的,能提高下界,训好的居然不能提高上界,这是什么理?
2、loss的,只能说表现一直很稳定,我怀疑loss和架构真实的acc会不会相关系数更高?loss得到的帕累托才是比较帕累托的帕累托?而预测器预测出来的只是拿来贻笑大方?



【总结】

NAS领域百家争鸣,但是总的来说,关注更好的搜索空间的构建和sample哪些架构,就对了

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。