在给定的数据集上实现最先进的结果是十分困难的。这往往需要小心翼翼地选择正确的数据预处理方式,精心挑选算法、模型及架构,并装配最合适的一套参数。这种端到端的过程通常被称为机器学习流水线 / 工作流。这套流程中的每一步怎么走并没有一个经验上的固定方向。而且,因为新的模型不断被开发出来,就连选择合适的模型都成为了一个巨大挑战。超参数的调试通常需要对所有可能值进行遍历或抽样,也就是把所有参数都试一遍。然而,这也并不能保证找出来的东西就是有用的。在这种情况下,自动化选择参数和调试机器学习工作流的过程早就成为了机器学习社区的目标之一。这类任务通常被称为元学习——学习如何学习。
这似乎也是人类历史开始时我们祖先的目标。这是一个有趣的故事……
空空道人与石头记(译者瞎编的,其实是哈利·波特与死亡圣器)
很久很久以前,一位炼丹的道长擅长在某种框架下用某种语言训练模型,但这个框架其实早就废弃了,他用的编程语言也早就没人用了。有一天,一位长者让他在一个神秘的数据集上训练一个模型。
然而,道长在这个数据集上用成千上万的方法训练了无数次,也没得到想要的性能。他去自己的图书馆查阅相关资料,找到了一本书,里面讲了一种特殊的符咒。这个符咒可以送他去一方胜境,在那里所有秘密都被揭开,所有可能的模型都被尝试过,所有优化方法都被实现了。他念动符咒,疾唤一声“开”,只见一股青烟自平地兀自升起,道长便被送往那胜境(对不起译者胡扯太多了:p)。在那里,他了解到了如何得到一个更好的模型——于是他照做了。在回去之前,他难以抑制自己的冲动,要将这种神力全数带回。因此,他将此方胜境中的所见所闻刻于石上,题为自动化,携回那苦逼调参之邦。若有访道求仙者寻得这宝物,便可神力倍增,从此训练任何模型都可称心顺遂。
这故事很恐怖吧?我不知道这故事是否是真的,但在现代社会中,机器学习领域的巨头们很乐于将这种事变成真的(当然可能会进行一些微小的改变)。本文中,我会分享一些现在可用的设定,并帮助你建立起一种直觉,让你知道巨头们都在做什么(因为虽然它们的名字里都有“自动”这个词,却没有什么相同的地方)。
Azure 自动机器学习(预览版)
是否开源: 否
是否基于云: 是(仅测试,训练可在任何机器上进行)
支持任务: 分类,回归
所用技术: 概率矩阵分解 + 贝叶斯优化
训练框架: sklearn
该方法背后的思想是,如果两个数据集在几个机器学习工作流上都得到了相似的结果,那么它们很有可能在剩下的其他工作流上也得到这样的结果。这种说法可能对你来说很熟悉,尤其是如果你以前处理过推荐系统中的协同过滤问题,也就是如果两个用户在过去喜欢过同一件东西,那么他们在未来可能会喜欢相似的东西。
图:P 个工作流、D 个数据集的输入矩阵可视化。图中的数字代表数据集 d 在工作流 p 上获得的值的平均值。
解决这一问题需要考虑两个子问题:其一,学习出不同数据集和不同机器学习工作流之间的一种隐藏表示,以捕捉二者之间的关系,来预测某个工作流在某个数据集上能够获取的精度;其二,学习出一个函数,可以让你准确知道下一个要尝试的工作流。第一个任务可以通过创建一个矩阵来解决,该矩阵记录了不同数据集上不同工作流获取的平衡精度。该方法的相关论文(链接:https://arxiv.org/pdf/1705.05355.pdf)表示他们在大约 600 个数据集上试验了 42,000 种不同的机器学习工作流。现在我们在预览版 Azure 上看到的方法可能和这个不完全一样,但思想是一样的。作者表明,学习到的隐藏表示不仅成功地捕获到了模型信息,还学习到了超参数信息和数据集特点(注意这种学习过程是无监督的)。
到目前为止描述的模型可以被用于将每一个机器学习工作流的期望性能预测为已验证过的工作流的一个函数,但并没有告诉我们下一个要验证的工作流是什么。由于他们使用了矩阵分解的一种概率表示,该方法会给出预测工作流表现的后验概率分布,因此可以使用获得函数(即贝叶斯优化方法)来引导机器学习工作流空间的探索路径。基本上,该方法选择的下一个工作流能够最大化精度的期望增值。
然而,推荐系统往往会在一个问题上栽跟头——冷启动。基本思想是如果一个新的数据集进入了该系统,比如你的自定义数据集,那么模型会完全不知道这个新数据集和谁相似。为解决这一冷启动问题,需要从数据集中计算出一些元特征,用以捕获数据集的一些特点,如观察数量、类型数量、值的范围等。然后,通过使用这些度量标准,他们可以在已知数据集集合中找到一个相近数据集。他们将该方法在不同工作流上测试了五次,直到他们得到了获得函数,从而确定下一步要测试的数据集为止。注意,这个方法并不需要直接访问数据集,而只需要用到在数据集上离线计算出的元特征(这使得该方法资源消耗更少)。
谷歌 AutoML
是否开源: 否
是否基于云: 是(训练和测试均基于云)
支持任务: 用于分类的 CNN,RNN,LSTM
所用技术: 基于策略梯度更新的强化学习
训练框架: TensorFlow
谈到神经网络,当前最先进模型的成功离不开从特征设计到架构设计的策略转移。也就是说,最有效的策略是设计能从数据中无监督地学习到最优表示的架构,而非直接操作那些特征(直接操作特征更复杂,而且需要了解关于数据的诸多知识)。然而,设计架构也需要很多知识,而且耗时较长。谷歌的 AutoML 的想法是创建一个元模型,该模型可以从各数据集相关的子模型中学习到一种设计和生成架构的方法(好厉害)。
他们使用了用 RNN 实现的神经网络结构检索模型,该模型能够生成被编码为变量长度的表征序列(这样说比较复杂,其实就是被编码为一种“弦”)的架构。
图:使用上述方法生成的 CNN 的编码方式。每种颜色的框对应一个由 RNN 生成的上述方法的架构中的参数(或表征)。
一旦一个架构被生成出来,上述方法的模型就已被创建并训练,最终记录模型获得的精度。生成架构用的 RNN 是通过强化学习训练得来的,并用了特定规则更新其中参数,以使得该模型随着时间的推移能够生成越来越好的架构。
用于编码的表征序列可以被看作是一系列生成架构需要完成的动作。该模型最终会在数据集上获得一个精度 R。我们可以将 R 作为强化学习的一个奖励信号,用以训练 RNN。然而,这样的奖励是不可导的,这也就是为什么他们选用了 Williams 在 1992 年提出的策略梯度的方法来迭代更新参数——当然具体做法会有一些改动。由于训练过程可能会耗时非常长,他们使用了 Dean 等人在 2012 年提出的分布式训练和异步参数更新的方法,来加速学习过程。
该方法可以生成哪些模型?基于 Nair 和 Hinton 发表于 2010 年的一篇论文(链接:https://arxiv.org/pdf/1611.01578.pdf),他们使用了修正线性单元作为卷积架构的非线性项,并根据 Ioffe 和 Szegedy 2015 年的论文加入了批标准化,以及 Szegedy 等人(2015)和 He 等人(2016)论文中的各层之间的跳跃连接。对于每个卷积层,该架构可以从 [1, 3, 5, 7] 中选择一个卷积核高度和一个卷积核宽度,并从 [24, 36, 48] 中选择一个卷积核数量。至于步长,会从 [1, 2, 3] 中选出一个。对于 RNN 和 LSTM,该架构支持从 [identity, tanh, sigmoid, relu] 中选择一个激活函数。一个 RNN 元胞中包含的输入对的数量(即“基数”)默认设定为 8。
AutoKeras
是否开源: 是
是否基于云: 否
支持任务: 用于分类的 CNN,RNN,LSTM
所用技术: 基于网络态射的高效神经网络结构检索(论文链接:https://arxiv.org/abs/1806.10282)
训练框架: Keras
AutoKeras 的构建原理和谷歌的 AutoML 一样:它使用了一个 RNN 控制器,该 RNN 是通过遍历候选架构(即子模型的样本)训练得来的。然后,该模型被训练以评估其在目标任务上的性能。接着,该控制器用评估得来的性能指标作为指导信号,用于寻找更好的架构。然而,我们之前没有提到这个过程是多么消耗计算资源。神经网络结构检索十分计算密集和耗时。例如,Zoph 等人(2018)使用了 450 块 GPU,计算了约 40,000GPU 时。另一方面,使用更少的资源会造成更差的结果。为解决这一问题,AutoKeras 使用了高效神经网络结构检索(Efficient Neural Architecture Search,ENAS)。
ENAS 应用了一个和迁移学习相似的概念,即特定模型特定任务下学习出的参数可以应用于其他模型上的其他任务。因此,ENAS 强迫所有生成出的子模型共享权重,有意避免从头训练每个子模型。该论文的作者们表示,共享子模型参数不仅是可能的,而且能获得非常好的性能。
Auto-sklearn
是否开源: 是
是否基于云: 否
支持任务: 分类,回归
所用技术: 贝叶斯优化 + 自动集成构建
训练框架: sklearn
Auto-sklearn 的原理基于在 Auto-Weka(参见:https://www.automl.org/automl/autoweka/) 中用到的 CASH(Combined Algorithm Selection and Hyperparameter Optimization,组合算法选择和超参数优化)问题的定义。这与 Azure 自动化机器学习背后的原理相同:都是考虑同时选择学习算法及其超参数设定。二者之间主要的不同在于 Auto-sklearn 在主过程中多加了两个步骤:在最开始增加了一个元学习步骤,并在最后增加了一个自动化集成构建步骤(详见:https://papers.nips.cc/paper/5872-efficient-and-robust-automated-machine-learning)。
图:auto-sklearn AutoML 方法
该方法将数据集表示为共 38 个元特征,包括简单元特征、信息论元特征和统计元特征这几类,如数据点、特征、类别的数量,数据偏度,以及目标的熵等等。通过使用这种信息,他们选择了 k 个设置来初始化贝叶斯优化。注意,这种元学习方法和 Azure 自动机器学习一样,数据集越多越能发挥效力。
贝叶斯优化过程完成后,他们为所有测试过的模型构建了一个集成。这一步的思想是保存每个模型的训练过程中获得的所有信息。这一步会保存所有模型、构建一个集成模型,而不是直接扔掉差的模型、保留好的。这种自动集成构建避免了将自身变成一个单一的超参数,因此鲁棒性更强(而且更不容易过拟合)。这种集成是用集成选择的方法构建的(这是一个贪心过程,开始时集成为空,然后向其中迭代加入使集成测试性能最大化的模型)。
总结和评论
上面提到的每一种方法都有自己的优缺点,并有不同的作用空间。Azure 自动化机器学习和 auto-sklearn 是基于同一个原理构建的,可以用于回归和分类任务,对计算资源要求更低,因此更容易实现。它们不需要访问整个数据集(只要需要构建的模型在其他地方已经生成了),因此在数据隐私方面比较优秀。但是,这两种方法非常依赖于它们已经见过的数据集类型。它们无法测试新的东西,除非该机器学习工作流已经提前出现过。因此,我个人并不倾向于将这种类型的方法称为元学习。
另一方面,谷歌 AutoML 和 AutoKeras 使用的方法相同,均是试图去学习一种方法来从头构建模型。这种概念更为模糊,因此该方法仅局限于几种作用空间(如 CNN,RNN 和 LSTM)。然而,强化学习的方法使得他们可以寻找新的方法去构建模型(谷歌称他们的方法找到了一种比现有模型性能好 1.05 倍的模型)。这种方法听起来更像元学习。但是,强化学习方法会消耗大量计算资源,这也就是为什么他们的云服务需要收每小时 20 美元的租金。AutoKeras 性能优化可以用精度的稍微变差来换取价格的降低,在这种情况下不失为一种优选(而且它是开源的,对于注重隐私的人来说是又一个优势)。