fbnetv3中的predictor
- fbnetv3中的predictor
- 粗粒度搜索(Constrained Iterative Optimization)
- 早停机制
- predictor training
- 细粒度搜索
- 搜索空间
- 实验
- autotrain search
- joint search
- 粗粒度搜索(Constrained Iterative Optimization)
作者想做的是网络超参和网络结构的联合搜索,并且定义了如下的网络结构的候选值以及超参的候选值
给定搜索空间\(\Omega\),以及计算资源\(C\),超参和网络搜索的目标如下:
并且作者在正文中说到:
The search space \(\Omega\) is typically combinatorially large, making exhaustive evaluation an impossibility. To address this complexity, we design a two-stage search algorithm: (1) coarse-grained search, followed by (2) fine-grained search, as shown in Algorithm 1. We explain the details below
作者定义了两个搜索方式,一个是粗粒度的搜索,一个是细粒度的搜索。
粗粒度搜索(Constrained Iterative Optimization)
作者定义了一个predictor,如上图,这个predictor,由一个encoder和两个head组成
-
第一个head是proxy head,这个head用来预训练encoder(如上图),从网络结构表示(architecture representations)中预测网络的统计参数,比如flops和params。网络结构表示(architecture representations)用一系列的one-hot的类别变量和整数范围变量表示。
-
第二个head是accuracy predictor,它同时接受网络训练的超参(training recipes)和网络结构表示(architecture representation),并且在受限的iterative optimization上进行finetune
step1:预训练embedding layer
作者pre-train embedding layer,作者随意的产生一系列的网络结构,然后根据这个网络结构来预测网络的flops和params,之所以不直接统计就是因为作者想用这种数据来预训练embedding layer,一种后期用于更加精细网络精度预测方法。之后作者transfer pretrained embedding layer来初始化acc predictor。通过实验发现,这样能够提升预测的精度和可靠性(flops和params是可以统计出来的,所以精度比较高,acc可能并不是那么好统计)
step2:constrained iterative optimization
作者在搜索空间中采用quasi monte carlo 采样来产生一系列的arch-recipe构成一个采样池。然后作者迭代的构建网络索取函数,具体的步骤如下
- 根据预测的精度(已经训练好的了?),作者先选取一个比较好的candidates
- 训练和评估candidates(这里的意思是根据arc-hyper来在数据上训练,之后评估candidate精度如何?)
- 然后优化predictor(根据上面的acc来评估这个arch-hyper pair精度如何?)
上述这种迭代的shriking candidate space的方法可以避免不必要的评估和改善exploration的效率。
对于上述方法我有个问题
以及作者得到的ACC是在数据集合上的ACC吗?如果是的话,如何在给定recipe-arch pair的基础上来得到该网络和超参在数据集上的精度呢?是对于这个pool里面的sample都进行了完整的训练吗?根据作者的算法描述应该是的
早停机制
在constrained iterative optimization第一次迭代的时候,作者通过早停机制和最终的acc来rank sample;然后计算rank correlation,来找到一个合适的epoch使得其correlation超过某个阈值。找到这个阈值之后,作者对所有的\((A, h)\)都训练相同的epoch。这样可以减小迭代次数
predictor training
作者先固定pretrained的embedding,然后train predictor 50个epoch,然后entire model再train 50 epoch。用huber loss作为loss。
细粒度搜索
上述的arch-recipe pair是第一代(first generation)产生的结果。接下来作者对其进行变异,然后根据之前训练的predictor \(u\) 来重新预测这个选出来的一系列的children \(C\) 得到分数 \(s\)。作者计算每一代的最高分数的增益,当改善饱和的时候作者停止迭代产生新种群。
notice:
作者说acc predictor可以在不同的资源的限制下搜索网络。并且这个acc可以很快的对candidate进行评估,JointNAS需要fine-grained search,并且几乎不需要计算代价。
整体而言,作者的pipeline如下
搜索空间
作者定义的搜索空间包括hyper和arch。如上面的表格所示。总的来讲,网络结构搜索空间有\(10^{17}\),超参搜索空间包含\(10^7\)。
实验中,autotrain,只搜索超参。joint search,则超参和网络结构一起搜。
实验
作者在imagenet上做实验,随机选取200类来减少训练时间。然后从trainset随机保留1w张作为val set。
autotrain search
作者的sample pool有20k,在iterative optimization阶段,batch size和iteration分别为48和4。sample candidates训练150个epoch。
获取candidates的精度,不是已经有搜索到的lr的超参?如果是第二阶段变异的话,又为何涉及到超参数?
作者首先假设网络结构固定的话,搜索超参看一下表现如何
joint search
smple pool有2.5w个samples。
精度如下
比如最后一行,达到相同的精度用更少的参数。
并且作者发现,不同的模型需要不同的超参,置换两个模型搜到的超参会极大的掉点。