Auto-Deeplab:从SOTA模型开始学习神经架构搜索

写在文章前面的一点小感想:

笔者是北京某高校的在读研究生。研一至今一直在从事着名为科研的本科实验报告撰写工作,深感自己与时代脱节严重。恰逢导师有意,遂将元学习与神经架构搜索作为自己的研究方向,但却一直没有迈出那个第一步。因为觉得自己如此虚度时光会最终废掉,因此在此立一个Flag:无论多忙,每天精读一篇相关领域文章并分享于此。从我个人而言,我的科研方法是侧重整体感知而忽视细节的。也即,在我的文章中会主要介绍我从文献中读出的思想,因此如有不足之处还请各位仔细参照原文。

最后,科研之路,一人走实在是缺少了些动力和方向。希望能借文章的契机结识五湖四海的朋友们,在这个领域共同取得成果!

 

啰嗦完了,下面开始进入正题!

Auto-Deeplab:神经架构搜索的又一里程碑

从NasNet,MetaQNN到Auto-Deeplab,神经架构搜索技术在短短两年内已经取得了如此丰硕的成果,使人不禁对AutoDL的未来心怀向往。

与前辈们相比,Auto-Deeplab受到如此多关注,其原因除了出自李飞飞实验室之手外,也得益于其惊人的效果:

可以看到,除了乱入的DARTS外,几乎所有神经架构搜索算法都需要成百上千的GPU小时,这种繁重的计算量直接限制了AutoDL针对客户任务进行私人订制的可能性。而Auto-Deeplab做到的,就是在Cityscapes数据集(原图2048x1024)缩放一倍后(缩放后1024x512)的321x321大小Crop上,只使用3天的GPU小时就实现了SOTA效果(CIFAR-10图片仅32x32),并且未使用其他一些方法中小图片搜索架构,使用到大图片的trick。更更重要的是,人家还开放代码!这对于想要入门这一领域的新童鞋是何种恩赐我就不细说了…

废话少说,开始撸文:

架构

从上面的表里可以看出,与前辈相比,Auto-DeepLab最大的贡献,就是引入了Network层级的搜索。

这里简要介绍下Cell与Network。我们对网络的设计思想通常都是从从微观到宏观的:先选取网络中的小块(Block)——各类卷积/池化/归一化层,再将小块以一定方式连接构成小团(Cell)——例如ResNet中的BottleNeck,最后再通过重复小团结构构建网络(Network)。从效果上看,Inception系列和ResNet系列都通过这种方式取得了很大的成功。

因此,虽然Google在提出NAS时最先使用的是Block级别的搜索,他们在NASNet中很快转变为了对Cell的搜索,因为这种方法既节约时间又高效。NASNet最终使用的固定Network,是这样的:

固定使用普通Cell-下采样Cell的循环架构,直接将搜索到的Cell无脑部署到每个格子里去。

Auto-DeepLab直接沿用了NASNet中的Cell搜索方法。而在此基础上,他们提出的Network级搜索方法,是这样的:

神经网络架构大部分最多下采样32倍,也即对于ImageNet这种224x224的图片,最终卷积获得的核心最小是224/32=7x7的特征向量。因此,我完全没必要规定走几步下采样一次嘛——我可以搜出来在第几个Cell后使用下采样!这就构成了上图的搜索方法,这种方法在原文中形象的被称为trellis-like,走格子方法。对于图像识别任务,我们只需要往下走,即从L层中选不多于3个添加下采样即可(原文方法中左上角1->4倍下采样是固定进行的)。而对于语义分割任务,只需要从左至右选择能走通的路径即可。

真的……很简单,相比起Cell搜索时“选谁连”-“和谁连”的nxn复杂度麻烦方法,这里的Network直接将搜索空间限定在了非常小的范围内。

现在比较火的搜索方法通常是基于强化学习或者基于遗传算法的。而Auto-DeepLab选择了师承自DARTS的可微分形式的NAS方法:Continuous Relaxation。概括而言,这种方法将离散的神经架构转换为了一个不同架构的Softmax概率分布,在每个节点参与计算的是其与前面节点相互连接的概率,从而使整个网络可以进行梯度下降。个人觉得Auto-DeepLab在这里讲解的不够清楚,推荐去看下DARTS的原文或者我写的介绍文

Cell内的张量长度相同可以直接相加,但由于Resolution不同,Cell间的向量不能如此操作。为此,Auto-DeepLab使用了另一个SoftMax表示网络间的连接:

并在优化阶段通过DARTS中的一阶近似,继续使用两步迭代法:

至此,一篇CVPR出炉。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章