人们提出神经架构搜索(Neural architecture search, NAS) 来自动进行神经网络的调优,但是现在的搜索算法(NASNet, PNAS) 对算力要求很高。采用 Network Morphism 技术,可以在保持神经网络的功能的同时调整其神经架构,可以极大提高搜索的效率。本文提出一种使用贝叶斯优化的全新架构来进行网络架构搜索。本框架使用一个神经网络核(neural network kernel)以及一个生成树结构的优化算法来高效探索搜索空间。
更新历史
- 2019.06.17: 完成初稿
1 介绍
AutoML 现在越来越受关注,目标是让普通人也能轻松使用机器学习模型。主要的工作方向有:自动规模性选择、自动超参数调整等等。在深度学习领域,网络架构搜索(NAS)是非常重要的 AutoML 工具。遗憾的是,最初的 NAS 算法对算力的要求非常高,时间复杂度为 $O(n\overline t)$,这里 n 是要搜索的网络架构个数(一般来说很大),$\overline t$ 是平均的网络训练时间,每个网络都需要从头开始训练,很耗时。之后,人们利用 network morphism 技术对 NAS 进行优化,我们可以修改一个已经训练过的神经网络(比如添加一层或添加一个 skip-connection)得到新的网络,在此基础上只需要做几轮简单的训练,就可以让新网络得到较好的表现,也就是说,我们缩减了 $\overline t$。
NAS 中最重要的操作就是选择对现有网络需要进行的 morphism 操作(也就是决定网络结构要如何变化)。现在的方法需要依赖大量的训练样本,与此同时还要再一个很大的搜索空间进行效率较低的搜索,所以如何基于 network morphism 进行高效的搜索仍然是一个很有挑战的问题。
对于黑箱函数的全局优化,当获取观测结果的成本比较高时(比如要等很久,或者花费很多钱),贝叶斯优化是非常常用且高效的方法。例如,我们可以用于调整机器学习模型的超参数,贝叶斯优化会在不同的超参数组合中进行搜索,每一次尝试都需要大量时间和大量计算,和 NAS 问题很类似。因此,我们可以利用贝叶斯优化的特性,来尽量减少所需要尝试的网络结构数量,以此来提高搜索的效率。
因为如下的原因,设计一个基于 morphism 的 NAS 贝叶斯优化方法并不简单:
- underlying 高斯过程(Gaussian process, GP) 通常用来学习在欧拉空间函数的概率分布。为了根据观测来更新贝叶斯优化模型,我们需要给 underlying GP 提供神经网络架构和对应的效果。但是神经网络架构并不在欧拉空间,也很难参数化为定长的向量。
- 对于贝叶斯优化来说,需要优化 acquisition 函数来生产下一个需要去观测的网络架构。然而,在 network morphism 这个场景下,我们不是要在欧拉空间中找到一个函数的最大值,而是在一个树状的搜索空间中找到一个节点,这里每个节点表示一个神经网络架构,每一条边表示一个 morph 操作(也就是对该架构的一个变形操作)。因此没有办法使用传统的梯度下降方法。
- 由 morphism 操作导致的的网络改变是很复杂的。对于某一层的 morphism 操作可能会改变相关的输出张量形状,继而不满足下一层的输入的形状要求。如何去保证改变之后的网络依旧可用也是一个很有挑战性的问题。
本文提出一种高效的使用 network morphism 进行神经网络架构的方法,采用贝叶斯优化的方法在搜索空间中寻找最好的 morphism 操作。为了解决前面提到的问题,我们构建了一个 edit-distance 神经网络核,并以此来衡量从一个网络转化到另一个网络需要多少个 morphism 操作。我们还设计了新的 acuisition 函数优化器,用来寻找下一步需要做的 morphism 操作。在 MNIST, CIFAR10 和 FASHION-MNIST 数据集上取得了超过现有 NAS 方法所取得的效果。总结一下,本文的贡献在于:
- 一个高效的基于 network morphism 的神经网络架构搜索算法,通过贝叶斯优化来进行下一步操作
- 在各种数据集上进行了大量尝试,证明本文算法比已有的基准要好
2 问题定义
问题定义:给定一个神经网络架构的搜索空间 $\mathscr{F}$,数据集 $D$ 被划分为 $D{train}$ 和 $D{val}$,Cost 函数为 $Cost(·)$,我们的目标是找到 $f^* \in \mathscr{F}$,可以在数据集 $D$ 上取得最低的 cost,用公式来表达就是:
这里 $Cost(·)$ 是用来衡量的指标函数,比如准确率,mean squared error。$\theta^*$ 是学习出来的 $f$ 的参数。
3 基于贝叶斯优化的 Network Morphism
传统的贝叶斯优化包含三个步骤:更新update、生成generation和观测observation。在 NAS 的过程中,这三步做的事情是:
- Update:用现有的架构和对应的效果来训练 underlying Gaussian process 模型
- Generation:通过一个 acquisition 函数来生成下一个需要观测的网络架构
- Observation:通过实际的训练,获取网络架构的效果
3.1 Edit-Distance Neural Network Kernel for Gaussian Process
简单来说,就是用一个核函数来做网络结构的映射,主要的映射依据是两个网络架构的编辑距离
具体的公式不看了,主要说一下这里的思想:我们要把 $f_a$ 转化成 $f_b$,可以通过特定的 morph 操作来进行,比如第一步先是 5 和 7 的两层变宽(变成 6 和 8),然后再插入一层(就是 20),这样就是两步操作,编辑距离为 2。当然,这里只是一个简单的例子,实际是有复杂公式的,但是我们只要知道可以通过这种方式来描述网络和网络之间架构的差异即可。
3.2 Optimization for Tree Structured Space
第二个挑战是贝叶斯优化如何在树状结构空间中(而不是欧拉空间)优化 acquisition function。文中又再次来了一波复杂的公式,简单来说就是会根据我们的优化目标(比如说更高的准确率),来生成不同的网络结构。但是这里要注意,使用 network morphism 的话,只会让网络架构变得越来越复杂,而不会缩减其大小,所以最后可能得到一个非常复杂的网络结构。在树状结构空间搜索中,除了添加边之外,也会更多扩展每个节点,也就是说小的网络结构也会经过多次尝试。最终的算法是类似 A*
的树检索算法。这里我们只要知道这个 acquisition function 不会一味生成复杂的结构,而是会启发式的搜索各种架构可能即可。
3.3 Graph-Level Network Morphism
先回顾下前面的两点:第一点解决了如何评估网络相似性的问题,我们在做网络架构变化的时候,有了一个衡量的标准;有了这个标准,我们可以通过第二点中的启发式搜索更有效率地找到下一个需要实验的网络架构。于是我们还剩下最后一个问题,如何在保证神经网络功能的前提下,对网络架构做调整。这里提到的 Graph-Level Network Morphism 就是要做这个事情。
对网络架构的操作有如下四种,这里 G 表示 Graph:
- 插入一层使网络更深 $deep(G,u)$
- 使一个节点更宽(可以是增加全连接的数量,也可以是增加上一层的 filter 数量) $wide(G,u)$
- 添加从节点 n 到节点 v 的连接 $add(G,u,v)$
- 拼接节点 n 和节点 v,$concat(G,u,v)$
除此之外没有其他的操作方式
4 AutoKeras
具体的执行流程如下:
简单翻译下步骤:
- 用户调用 APi
- Searcher 在 CPU 上生成神经网络架构
- Graph 在内存中构建实际的神经网络
- 将神经网络复制到内存中进行训练
- 保存训练好的模型到磁盘中
另一个流程图
其他的都是介绍框架的性能优化等内容,可以不看,只要知道为了避免 GPU 内存不够的问题,框架会设置一个内存上限,并且根据实际情况来调整来避免系统挂掉。
5 实验
主要是介绍如何做实验验证的,用 GTX1080Ti,每个方法跑 12 小时,然后就是结果的各种分析,这里不赘述
6 总结与未来工作
- 打算支持 RNN 的搜索
- 同时优化神经网络架构和超参数
- 设计面向任务的 NAS 方法,比如针对图像分割、物体检测等