AutoML、AutoKeras......这四个「Auto」的自动机器学习方法你分得清吗?

让我们先来看一个简短的童话故事…

从前,有一个魔法师,他使用一种无人再使用的编程语言,在一种无人再使用的框架下训练模型。一天,一位老人找到他,让他为一个神秘的数据集训练一个模型。

这位魔法师孜孜不倦,尝试了数千种不同的方式训练这个模型,但很不幸,都没有成功。于是,他走进了他的魔法图书馆寻找解决办法。突然,他发现了一本关于一种神奇法术的书。这种法术可以把他送到一个隐藏的空间,在那里,他无所不知,他可以尝试每一种可能的模型,能完成每一种优化技术。他毫不犹豫地施展了这个法术,被送到了那个神秘的空间。自那以后,他明白了如何才能得到更好的模型,并采用了那种做法。在回来之前,他无法抗拒将所有这些力量带走的诱惑,所以他把这个空间的所有智慧都赐予了一块名为「Auto」的石头,这才踏上了返程的旅途。

从前,有个拥有「Auto」魔石的魔法师。传说,谁掌握了这块魔法石的力量,谁就能训练出任何想要的模型。

AutoML、AutoKeras......这四个「Auto」的自动机器学习方法你分得清吗?

哈利波特与死亡圣器

这样的故事太可怕了,不是吗?我不知道这个故事是不是真的,但在现代,机器学习领域的头号玩家们似乎很有兴趣将这样的故事变成现实(可能会略有改动)。在这篇文章中,我将分享哪些设想是可以实现的,并帮助你直观地理解它们的设计理念(尽管所有工具的名字中都有「auto」这个词,但它们之间似乎并没有共同之处)。

动机——人生艰难

在给定的数据集中实现当前最佳模型性能通常要求使用者认真选择合适的数据预处理任务,挑选恰当的算法、模型和架构,并将其与合适的参数集匹配。这个端到端的过程通常被称为机器学习工作流(Machine Learning Pipeline)。没有经验法则会告诉我们该往哪个方向前进,随着越来越多的模型不断被开发出来,即使是选择正确的模型这样的工作也变得越来越困难。超参数调优通常需要遍历所有可能的值或对其进行抽样、尝试。然而,这样做也不能保证一定能找到有用的东西。在这种情况下,自动选择和优化机器学习工作流一直是机器学习研究社区的目标之一。这种任务通常被称为「元学习」,它指的是学习关于学习的知识。

AZURE 的自动化机器学习(试用版)

  • 开源与否:否
  • 是否基于云平台:是(可以完成任何计算目标的模型的评价和训练)
  • 支持的模型类别:分类、回归
  • 使用的技术:概率矩阵分解+贝叶斯优化
  • 训练框架: sklearn

这种方法的理念是,如果两个数据集在一些工作流中能得到类似的(即相关的)结果,那么它们在其它的工作流中可能也会产生类似的结果。这听起来可能似曾相识。如果你以前处理过推荐系统的协同过滤问题,你就知道「如果两个用户过去喜欢相同的项目,那么将来他们喜欢相似项目的可能性就会更大」。

AutoML、AutoKeras......这四个「Auto」的自动机器学习方法你分得清吗?

由工作流 P 和数据集 D 组成的输入矩阵的可视化。数字对应于数据集 D 在工作流 P 上得到的平衡均值。

要解决这个问题意味着两件事:学习一种隐藏的表示方法来捕获不同数据集和不同机器学习工作流之间的关系,以预测某工作流在给定数据集上能够获得的准确率;学习一种函数,能够成功地告诉你下一步应该尝试哪个工作流。第一个任务是通过创建一个平衡后的准确率组成的矩阵来完成的,不同的工作流可以应对不同的数据集。论文《Probabilistic Matrix Factorization for Automated Machine Learning》描述了该方法,详细说明了他们在超过 600 个数据集上尝试的 42,000 个不同的机器学习工作流。也许这与你今天在 Azure 的试用版中看到的是不同的,但它可以为你提供一种思路。作者指出,隐藏表征不仅成功地捕获了关于模型的信息,而且成功地捕获了关于超参数和数据集特征的信息(注意,这个学习过程是以无监督的方式进行的)。

目前所描述的模型可以作为已经评估的工作流的函数来预测每个机器学习工作流的预期性能,但是还没有对下一步应该尝试哪个工作流给出任何指导。由于他们使用的是矩阵分解的概率版本,该方法可以生成关于工作流性能的预测后验分布,从而允许我们使用采集函数(贝叶斯优化)来指导对机器学习工作流空间的探索。基本上,该方法可以选择出下一个可以最大化预期的准确率提升的工作流。

然而,推荐系统饱受一个非常特殊的问题的困扰:冷启动。如果一个新的数据集出现在系统中(也就是你的数据集),那么模型无从知晓这个新的数据集与什么相似。为了解决冷启动问题,我们可以从数据集中计算出一些元特征,以捕获观测次数、分类的类别数、值的范围等特征。然后通过这些指标在已知数据集的空间中确定出一个封闭的数据集。他们在不同的工作流上尝试了 5次,直到开始使用采集函数来通知自动机器学习系统接下来要尝试的数据集。注意,这个方法不需要访问实际的数据集,只需要访问本地计算出的元特性(这大大减小了开销)。

谷歌的 AUTOML(测试版)

  • 开源与否:否
  • 是否基于云平台:是(训练和评价)
  • 支持的模型类别:用于分类的卷积神经网络(CNN)、循环神经网络(RNN)、长短期记忆网络(LSTM)
  • 使用的技术:带梯度策略更新的强化学习
  • 训练框架:TensorFlow

说到神经网络,最近最先进的模型的成功离不开从功能设计到架构设计的范式转换。也就是说,构建能够以无监督的方式从数据中学习最佳表征的机器学习架构,而不是直接设计这样的特性(这是复杂的,需要大量关于数据的先验知识)。然而,设计架构仍然需要大量的知识和时间。谷歌 AutoML 的解决思路是创建一个元模型,该模型能够学习一种方法,为子模型设计和生成能够在感兴趣的数据集上取得良好性能的架构。

他们使用实现为 RNN 的神经架构搜索,生成编码为长度可变token序列(「字符串」的一种精妙表达方式)的架构。

AutoML、AutoKeras......这四个「Auto」的自动机器学习方法你分得清吗?

使用该方法生成的 CNN 的编码。每个颜色框对应于RNN生成的建议体系架构的一个参数(或token)。

一旦生成了一个架构,就会构建并训练所提出的模型,最终记录所获得的精度。RNN经过训练,使用了强化学习策略,该策略更新了RNN的参数,以便随着时间的推移生成更好的架构。

生成的token序列可以看作是生成架构时应该执行的动作(action)序列。该模型最终会得到一个数据集上的准确率 R,我们可以考虑将 R 作为奖励信号与强化学习算法一起训练 RNN。然而,这样的奖励是不可微的,这就是为什么他们建议通过一些改进措施,使用策略梯度方法迭代更新参数(如Williams 等人在 1992 所提出的方法)。由于训练过程非常耗时,他们使用分布式训练和异步参数更新来加速学习过程,如 Dean 等人在 2012 发表的论文中提出的方法。

它能生成什么样的模型?根据谷歌大脑发表的相关论文《NEURALARCHITECTURE SEARCH WITH REINFORCEMENT LEARNING》,在卷积架构方面,他们将修正过的线性单元用于非线性模型(Nair & Hinton, 2010)、批量归一化(Ioffe &Szegedy, 2015)和跳跃连接(Szegedy et al., 2015 and He et al.,2016a)。对于每个卷积层,它可以在 [1,3,5,7] 中选择一个滤波器高度,在 [1,3,5,7] 中选择一个滤波器宽度,在 [24,36,48] 中选择多个滤波器。在步长方面,它必须预测 [1,2,3] 中的步长。对于 RNN 和 LSTM,该架构支持在[identity,tanh, sigmoid, relu] 中选择激活函数。RNN 神经元的输入对的数量(「基数」)设置为 8。

AUTOKERAS

  • 开源与否:是
  • 是否基于云平台:否
  • 支持的模型类别:用于分类的卷积神经网路(CNN)、循环神经网络(RNN)、长短期记忆网络(LSTM)
  • 使用的技术:高效神经架构搜索(参见《Efficient NeuralArchitecture Search via Parameter Sharing》)
  • 训练框架:Keras

AutoKeras 和谷歌AutoML 的构建思路相同:它使用一个通过循环训练的 RNN 控制器,对候选架构(即子模型)进行采样,然后对其进行训练,以测量其在期望任务中的性能。接着,控制器使用性能作为指导信号,以找到更有前景的架构。然而,我们之前没有提到计算过程的代价有多高。实际上,神经架构搜索在计算上非常昂贵、耗时,例如 Zoph 等人在 2018 年发表的论文使用 450 个 GPU 运行了大约 4 万个 GPU 小时。另一方面,使用更少的资源往往产生倾倒的结果。为了解决这个问题,AutoKeras使用了高效神经架构搜索(ENAS)。

ENAS 应用了一个类似于迁移学习的概念,其思想是:在特定任务上为特定模型学习的参数可以用于其他任务上的其他模型。因此,ENAS 迫使所有生成的子模型共享权值,从而刻意防止从头开始训练每一个子模型。这篇论文的作者表明,ENAS 不仅可以在子模型之间共享参数,还能够获得非常强的性能。

Auto-sklearn

  • 开源与否:是
  • 是否基于云平台:否
  • 支持的模型类别:分类、回归
  • 使用的技术:贝叶斯优化+自动集成构造
  • 训练框架:sklearn

Auto-sklean 是基于Auto-Weka(https://www.automl.org/automl/autoweka/)使用的 CASH(组合算法选择和超参数优化)问题的定义以及和 AzureAutomated ML 相同的思路构建的:他们考虑同时选择一个学习算法和设置其超参数的问题。他们提出的主要区别是将两个额外的步骤合并到主进程中:一开始是元学习步骤,最后是自动化集成构造步骤,详情请参阅论文《Efficient and Robust Automated Machine Learning》。

AutoML、AutoKeras......这四个「Auto」的自动机器学习方法你分得清吗?

auto-sklearnAutoML 方法

该方法使用了全部 38 个元特征来描述数据集,包括简单的、信息论的和统计的元特征,如数据点的数量、特征和分类,以及数据偏度和目标的熵。利用这些信息,他们会选择 k 个采样点作为贝叶斯优化的初始采样点(seed)。注意,这种元学习方法通过使用数据集存储库来获得强大的功能(就像 Azure Automated ML 那样)。

在完成贝叶斯优化之后,它们会构建一个由所有尝试过的模型组成的集成模型。这一步的思路是将训练每个模型所做的努力都存储下来。他们没有抛弃这些模型而选择更好的模型,而是将它们存储起来,最终构建出一个它们的集成模型。这种自动集成构造方法避免了让自己陷入单个超参数的设置中,因此鲁棒性更强(并且不容易过拟合)。他们使用集成选择(这个贪婪过程从空集成开始,迭代地添加能够最大化集成验证性能的模型)来构建集成模型。

结语和点评

每一种方法都有各自的优缺点,也有其各自的赛道。Azure Automatic ML 和 auto-sklearn 是基于相同的思想构建的,它们被用于回归和分类任务,计算量较少,因此实现成本较低。他们不需要整个数据集可见(只要构造的模型能够生成的),如果对数据隐私有要求的话,那么使用这两种框架是很合适的。然而,他们严重依赖于已经获取到的数据集。除了事先处理过的机器学习工作流外,他们不能尝试任何新的东西。我个人十分怀疑能否把这样的方法称为元学习。

另一方面,谷歌 AutoML 和 AutoKeras 也使用了相同的方法,它们试图学习一种从头开始构建模型的方法。这是一个更有野心的做法,这也是为什么它在动作空间上更有限(CNN、RNN、LSTM)。然而,他们使用的强化学习方法使他们能够探索构建模型的新方法(谷歌声称他们的方法发现了一个比他们已有的模型好 1.05 倍的模型)。这听起来更像是元学习。然而,强化学习方法需要消耗大量的计算能力,这也就是它们每小时收费 20 美元的原因。而这种情况下,AutoKeras 为了提高准确率进行的性能优化是很有吸引力的(另外它是开源的,如果你关心隐私的话,这也是一个好消息)。

相关推荐