机器之心从800个GPU训练几十天到单个GPU几小时,看神经架构搜索如何进化( 二 )


【机器之心从800个GPU训练几十天到单个GPU几小时,看神经架构搜索如何进化】此架构设计中隐含的假设是 , 可以通过迭代地堆叠结构良好的构建块 , 来创建高性能的更大型网络 , 这种做法完全适合 NAS 。 在 NAS 的语境下 , 这意味着先训练和评估小模型 , 然后扩展该神经网络 。 例如 , 先在 ResNet18 上执行 NAS , 然后通过重复得到的构建块来构建 ResNet50 。
用搜索构建块替代搜索整个架构 , 以及训练和评估较小的模型 , 可以极大地提高速度 , 研究者实现了在 450 块 GPU 上仅耗费 3-4 天的搜索时间 [5] 。 此外 , 即使只搜索构建块 , 该技术也能够找到 SOTA 架构 。
然而 , 尽管这是一项巨大改进 , 但整个过程仍然相当缓慢 , 并且要想投入实际应用 , 训练所需的 GPU 数量必须减少 。 无论模型大小如何 , 从零开始训练神经网络始终是一个耗时的过程 。 有没有一种方法可以重用以前训练好的网络中的权重呢?
权重继承
如何避免从头开始训练神经网络?答案是使用权重继承 , 即从另一个已经训练过的网络中借用权重 。 在 NAS 中 , 搜索是在特定的目标数据集上进行的 , 并且有多个架构同时训练 。 为什么不重用权重 , 只更改架构呢?毕竟 , 搜索过程的目的是寻找架构而不是权重 。 为了实现重用权重 , 我们需要用更严格的结构定义来限制搜索空间 。
机器之心从800个GPU训练几十天到单个GPU几小时,看神经架构搜索如何进化
本文插图
图 3:NAS 单元被建模为有向无环图(Directed Acyclic Graph) , 其中边表示操作 , 节点表示计算单元 , 计算单元转换并组合先前节点来创建新的隐藏状态 。
通过定义允许在搜索构建块中存在的隐藏状态的数量 , 搜索空间变得非常有限 。 换句话说 , 构建块内操作的可能组合数量较大 , 但并非无限 。 如果将隐藏状态排序 , 并将它们的拓扑预定义为有向无环图 (DAG) , 则搜索空间如图 3 所示 。
使用这个搜索空间 , 我们可以把控制器建议的架构看作是来自更大网络的子网络 , 其中较大的网络和子网络共享相同的隐藏状态(节点) 。
当控制器建议使用某个网络架构时 , 这意味着选择一组连接(边)的子集 , 并为隐藏状态(节点)分配新的操作 。 这种形式意味着很容易以编码方式保存节点上操作的权重 , 从而实现权重继承 。 在 NAS 设置中 , 这意味着以前架构的权重可以用作下一个采样网络的初始化 [6] 。 众所周知 , 初始化可以很好地独立于任务或操作 [7] 运行 , 且由于没有从头开始训练模型 , 因此可以进行更快的训练 。
既然现在已经不再需要从零开始训练每个模型了 , 那么网络的训练和评估就会快得多 。 在单个 GPU 上 NAS 只需要 0.45 天的训练时间 , 相比之前实现了约 1000 倍的提速 [6] 。 优化技术的结合大大提高了基于强化学习的 NAS 的速度 。
这些改进都集中在更快地评估单个架构上 。 然而 , 强化学习方法并不是最快的学习方法 。 是否存在一个替代性搜索过程 , 可以更高效地遍历搜索空间?
在基于强化学习的 NAS 过程中 , 需要训练多个模型以便从中找到最佳模型 。 那么有没有办法避免训练所有的模型 , 而只训练一个模型呢?
可微性
在搜索空间的 DAG 形式中 , 训练的网络是较大网络的子网络 。 那么是否可以直接训练这个更大的网络 , 并以某种方式了解哪些操作贡献最大呢?答案是肯定的 。
机器之心从800个GPU训练几十天到单个GPU几小时,看神经架构搜索如何进化
本文插图
图 4:a) 边上的操作最初是未知的 。 b) 通过在每个边上放置候选操作的混合来连续释放搜索空间 。 c) 在双层优化过程(bilevel optimization)中 , 有些权重增加 , 而有些下降 。 d) 最终的架构通过在两个节点之间具备最大权重的边来构建 [8] 。