早期的NAS算法大都是针对某一个具体的硬件平台做模型搜索。换句话说,对于新的平台则需要重新搜索,这样既耗时又耗资源。所以这篇文章(简称OFA)的主要目的是只需要搜索一次就能为不同的平台找到合适的模型结构,所以论文名字取为 Once for All。
OFA采用的也是权重共享的搜索策略,Supernet结构基于MobileNet的设计。
整个搜索空间(如Figure 2)主要包含三大块:
OFA中的Supernet由5个block组成,而每个block的搜索空间大小是
,所以整个搜索空间大小为
再强调一遍,OFA的目的希望是只做一次搜索,之后就可以根据这个搜索的结果自动去找适合于指定平台的模型结构。
形式化的数学表达如下:
\[\min _{W_{o}} \sum_{a r c h_{i}} \mathcal{L}_{\text {val }}\left(C\left(W_{o}, \operatorname{arch}_{i}\right)\right) \]
说人话就是 让所有候选架构在验证集上的结果都尽可能的好,即最小化所有架构的期望损失函数之和。
但是搜索空间非常大,不可能遍历所有模型,所以一个很naive的思路是是通过随机采样的方式来近似优化。但是如何采样确实很有门道的,OFA就提出了 渐进式收缩 (progressive shrinking, PS)的采样策略.
其实,PS 这个策略其实也很符合直觉,我们看Figure 2,它把整个训练过程划分成多个phases:
卷积核大小搜索范围是 [3,5,7],在算法实现层面其实是共用一个7X7的卷积核,而要得到5X5的卷积核,OFA的做法是先截取中间的5X5的矩阵,然后把这个矩阵展开成一维向量,长度为25,然后再通过一个25X25的可学习的矩阵得到新的5X5的卷积核。3X3的卷积核的处理办法类似,不过是基于变换后的5X5卷积再做变换得到的。
上图中的Unit可以理解成Supernet中的一个Block,所有Block初始化都是由4个layer组成。
在搜索depth的时候,假如搜索的结果是3,那么最后一个layer就不会参与计算。(如上图第二个unit所示)
宽度的搜索其实就是通道数的搜索,OFA提出的策略是根据L1norm计算每个通道的重要性,然后对这些通道排序,最重要的排前面。比如总共有10个通道,某一时刻搜索的结果是只需要5个通道,那么就会对这个10个通道做排序,只用前5个通道做计算。我有试过这种策略,一旦对通道权重重新排序后,模型性能就会崩掉了,不过具体是我复现的代码有问题还是其他问题就没有细究了。