神经网络架构搜索(NAS)——前言
那么问题来了,神经网络架构搜索(NAS)究竟是什么?为什么我们要了解NAS呢?(这一部分是为了去年完全没有跟进领域内进展的人准备的)
NAS的核心思想是使用搜索算法来发现用于解决我们的问题所需要的神经网络结构。回到“博士生下降”的话题:假设你是个希望解决问题A的导师,你会让你的学生来想一种该问题的最优架构——那么,你的学生就是你的搜索算法(听起来似乎更像奴隶?)。
如果你并不是那种泯灭人性的导师(当然也可能你就是那个学生),你可能会首先定义一种搜索空间,这种搜索空间包含定义神经网络架构的基本构建模块(block)。通常地,每一种配置字符串(configuration string)描述一种架构——比如说,给定三个层(分别用0、1、2表示)和两种block(分别为A:1x1卷积和B:3x3卷积),那么字符串“0A1A2B”表示“x->1x1卷积->1x1卷积->3x3卷积”的网络结构。你可以天马行空地凭想象定义这个搜索空间,但别忘了,搜索空间越大,你的搜索算法需要运行的迭代次数就越多,用到的GPU算力也就越多。
搜索算法有哪些可供我们选择呢?早期的一种算法是进化搜索——网络架构的种群(population,比如可以是随机初始化的一些架构)基于适应度(或“收益”,通常即给定架构在特定问题上的验证指标)不断地被训练和突变(mutate,比如对架构的某些部分进行混合)以达到好的验证指标。另一种方案是基于强化学习,让智能体(有时候称作“控制器”)去发现网络架构的最优配置。这种智能体通常是用循环神经网络实现的,它的目标是寻找能够获得更高收益的神经架构。其他的搜索算法还包括基于梯度的优化(所有可能的架构组成一个巨大的图,每条边有一个可学习的实值,代表每个block被使用的概率)、贝叶斯优化(搜索空间由某种启发函数贯穿,这种启发函数可以是用于预测采样模型准度的代理损失函数)等等。
图注:NAS的高层表示。图片来源:Elsken et. al
如果你对上述算法感兴趣,我推荐阅读Elsken等人的这篇综述。他们还建立维护了一个网站,你可以在这里找到最近的相关文章。
CVPR 2019上的NAS
下面本文将目光转向在CVPR 2019会议上登场的NAS相关工作。如果你只想看大体的总结,下表包含了这些工作的论文和代码地址(前提是它开源)、它们使用的搜索算法、领域和需要的资源。如果这里没有涉及您的文章,可能是我的疏忽导致它被忽略了——请您及时指正。CVPR 2019的所有论文都可以在这里找到。
宏观总结
Auto-DeepLab:语义分割的分层神经架构搜索
熟悉语义分割领域的研究者应该对DeepLab团队都不陌生吧?他们不断提出新的思路、新的模型,不断推进语义分割模型的性能提升。这次,作者使用NAS来寻找语义分割问题的最佳模型。Auto-DeepLab:语义分割的分层神经架构搜索
本质上讲,这篇工作是对DARTS的一种适应性改进。如果你不了解DARTS,下面是对它的一点简单说明:DARTS(可微架构搜索,Differentiable Architecture Search)是一种基于梯度的随机优化方法,它将所有可能的架构一次性初始化,并且在优化网络权重参数的同时还优化混合概率(即模型选择每一条边的概率)。Auto-DeepLab的作者则更进一步:为了搜索适合语义分割的模型,作者还让NAS算法去优化