当前位置: 首页 > 科技观察

从几十天的800个GPU训练到几个小时的单个GPU训练,看看神经架构搜索是如何进化的

时间:2023-03-19 22:04:28 科技观察

神经架构搜索(NAS)取代了人类的“二阶”调优工作,使我们能够使用两层寻找最佳神经网络的黑盒方法。如果这种模式能够物美价廉地得到应用,自然是非常有吸引力的。要知道“28天800个GPU训练”基本不是个人负担得起的。在这篇文章中,作者向我们介绍了NAS的进化史,即如何通过多种改进方法将训练成本压缩到“人人都能上手”的程度。神经架构搜索(NAS)改变了构建新神经网络架构的过程。该技术会自动为特定问题找到最佳神经网络架构。“最佳”的定义可以看作是对多个特征之间的权衡过程进行建模,例如网络的大小和准确性[1]。更令人印象深刻的是,NAS现在在单个GPU上执行只需4小时,而过去在800个GPU上需要28天。实现这一飞跃只用了两年时间,现在我们不需要成为Google员工就可以使用NAS。但研究人员是如何实现这种性能飞跃的呢?本文将介绍NAS的发展历程。CatalystNAS的历史可以追溯到1988年提出的自组织网络思想[2],但直到2017年NAS才取得第一次重大突破。那就是训练循环神经网络(RNN)来生成神经网络架构的想法出现的时候。图1:训练NAS控制器的迭代过程图:训练控制器(RNN),以概率p采样架构A,训练架构A的子网络得到准确率R,计算p的梯度并相乘它通过R来更新控制设备。简单地说,这个过程类似于人类手动寻找最佳架构的过程。基于最佳操作和超参数的预定义搜索空间,控制器将测试不同的神经网络配置。在这种情况下,测试配置意味着组装、训练和评估神经网络以观察其性能。经过多次迭代后,控制器会了解哪些配置构成了搜索空间内的最佳神经网络。不幸的是,在搜索空间中找到最优架构所需的迭代次数非常多,因此过程很慢。这部分是由于搜索空间遭受组合爆炸的事实,由此搜索空间中可能的网络数量随着添加到搜索空间的组件数量而显着增加。然而,这种方法确实找到了最先进的(SOTA)网络,现在称为NASnet[3],但它需要28天才能在800个GPU上进行训练。如此高的计算成本使得搜索算法对大多数人来说不切实际。那么如何改进这个想法使其更易于使用呢?在NAS训练过程中,大部分时间消耗来自训练和评估控制器提出的网络。可以使用多个GPU并行训练模型,但它们各自的训练过程仍然需要相当长的时间。降低训练和评估神经网络的计算成本将对NAS的总搜索时间产生很大影响。这就引出了一个问题:如何在不对NAS算法产生负面影响的情况下降低训练和评估神经网络的计算成本?降低保真度估计已知较小的神经网络比较大的神经网络训练得更快。原因很简单,较小的网络计算成本较低。然而,就准确性而言,较小的神经网络通常比较大的神经网络表现更差。NAS的目标是找到一个SOTA的网络架构,那么有没有办法在不牺牲最终性能的情况下,在搜索算法中使用更小的模型呢?图2:ResNet架构示例,其中残差块表示为“ResNetBlock”。答案可以在最著名的计算机视觉架构ResNet[4]中找到。在ResNet架构中,我们可以观察到同一组操作被一遍又一遍地重复。这些操作形成一个残差块,即ResNet的构建块。这种设计模式允许研究人员通过改变堆叠残差块的数量来创建同一模型的更深或更浅的变体。此架构设计中隐含的假设是,可以迭代堆叠结构良好的构建块以创建具有高性能的更大网络,这是一种非常适合NAS的方法。在NAS的上下文中,这意味着训练和评估一个小模型,然后扩展该神经网络。例如,首先在ResNet18上执行NAS,然后通过重复生成的构建块来构建ResNet50。用搜索构建块代替搜索整个架构,训练和评估更小的模型,可以大大提高速度,研究人员在450个GPU上实现了仅3-4天的搜索时间[5]。此外,即使仅搜索构建块,该技术也能够找到SOTA架构。然而,虽然这是一个巨大的改进,但整个过程仍然相当缓慢,而且为了实用,必须减少训练所需的GPU数量。无论模型大小如何,从头开始训练神经网络始终是一个耗时的过程。有没有办法重用以前训练过的网络的权重?权重继承如何避免从头开始训练神经网络?答案是使用权重继承,即从另一个已经训练好的网络中借用权重。在NAS中,搜索是在特定的目标数据集上进行的,同时训练多个架构。为什么不重用权重而只更改架构?毕竟,搜索过程的目的是找到架构,而不是权重。为了实现权重重用,我们需要用更严格的结构定义来限制搜索空间。图3:NAS单元被建模为有向无环图,其中边代表操作,节点代表计算单元,这些计算单元转换和组合先前的节点以创建新的隐藏状态。通过定义允许存在于搜索构建块中的隐藏状态的数量,搜索空间变得非常有限。换句话说,一个构建块中可能的操作组合数量很大,但不是无限的。如果对隐藏状态进行排序并将它们的拓扑结构预定义为有向无环图(DAG),则搜索空间如图3所示。使用此搜索空间,我们可以将控制器提出的架构视为来自更大的子网网络,其中较大的网络和子网络共享相同的隐藏状态(节点)。当控制器建议某种网络架构时,这意味着选择一组连接(边)的子集并将新操作分配给隐藏状态(节点)。这种形式意味着很容易对节点上的操作权重进行编码,从而实现权重继承。在NAS设置中,这意味着先前架构的权重可以用作下一个采样网络的初始化[6]。众所周知,初始化运行良好,独立于任务或操作[7],并且允许更快的训练,因为模型不是从头开始训练的。现在不再需要从头开始训练每个模型,网络的训练和评估将快得多。NAS在单个GPU上只需要0.45天的训练时间,比以前快了大约1000倍[6]。优化技术的结合大大提高了基于RL的NAS的速度。这些改进都集中在更快地评估单个架构。然而,强化学习方法并不是最快的学习方法。是否有更有效地遍历搜索空间的替代搜索过程?在基于强化学习的NAS过程中,需要对多个模型进行训练,以便在其中找到最好的模型。那么有没有一种方法可以避免训练所有模型而只训练一个呢?可微性在搜索空间的DAG形式中,经过训练的网络是更大网络的子网络。那么是否有可能直接训练这个更大的网络并以某种方式了解哪些操作贡献最大?答案是肯定的。图4:a)边上的操作最初是未知的。b)通过在每条边上放置候选操作的混合来不断释放搜索空间。c)在双层优化过程中,一些权重增加而另一些权重减少。d)最终架构由两个节点之间权重最大的边构成[8]。如果移除控制器并且更改边以表示所有可能的动作,则搜索空间是可微分的。在这个密集的架构中,所有可能的操作都在每个节点处组合成一个加权和。加权和是一个可学习的参数,它使网络能够扩展不同的操作。这意味着可以缩小对性能不利的操作,而可以扩大“好的”操作。训练出更大的网络后,剩下要做的就是查看权重,选择较大权重对应的操作。通过区分搜索空间和训练更大的网络(通常称为“超网”),我们不再需要训练多个架构并且可以使用标准的梯度下降优化器。NAS的可区分性为未来的发展打开了许多可能性。这方面的一个例子是NAS[9]中的可微分采样,由于每次前向和反向传递在搜索中需要更少的操作,它可以将搜索时间缩短至4小时。结语NAS训练时间如何从几天缩短到几个小时的故事就此打住。在这篇文章中,我试图概述推动NAS发展的最重要的想法。现在NAS技术已经足够高效,任何拥有GPU的人都可以使用它,您还在等什么?