AI 前线导读:
对于每一个机器学习研究者和开发者来说,调参总是一个让人头疼的问题。如何在大量的参数空间内找到一个问题的最优参数呢?如今,许多业内巨头们已经发布了自动调参框架,或许可以在一定程度上缓解调参难题。让我们一起来看看吧!
更多干货内容请关注微信公众号“AI 前线”(ID:ai-front)
动机:机器学习狗太苦逼了
在给定的数据集上实现最先进的结果是十分困难的。这往往需要小心翼翼地选择正确的数据预处理方式,精心挑选算法、模型及架构,并装配最合适的一套参数。这种端到端的过程通常被称为机器学习流水线/工作流。 这套流程中的每一步怎么走并没有一个经验上的固定方向。而且,因为新的模型不断被开发出来,就连选择合适的模型都成为了一个巨大挑战。超参数的调试通常需要对所有可能值进行遍历或抽样,也就是把所有参数都试一遍。然而,这也并不能保证找出来的东西就是有用的。在这种情况下,自动化选择参数和调试机器学习工作流的过程早就成为了机器学习社区的目标之一。这类任务通常被称为元学习——学习如何学习。
这似乎也是人类历史开始时我们祖先的目标。这是一个有趣的故事……
图:空空道人与石头记(译者瞎编的,其实是哈利·波特与死亡圣器)
很久很久以前,一位炼丹的道长擅长在某种框架下用某种语言训练模型,但这个框架其实早就废弃了,他用的编程语言也早就没人用了。有一天,一位长者让他在一个神秘的数据集上训练一个模型。
然而,道长在这个数据集上用成千上万的方法训练了无数次,也没得到想要的性能。他去自己的图书馆查阅相关资料,找到了一本书,里面讲了一种特殊的符咒。这个符咒可以送他去一方胜境,在那里所有秘密都被揭开,所有可能的模型都被尝试过,所有优化方法都被实现了。他念动符咒,疾唤一声“开”,只见一股青烟自平地兀自升起,道长便被送往那胜境(对不起译者胡扯太多了:p)。在那里,他了解到了如何得到一个更好的模型——于是他照做了。在回去之前,他难以抑制自己的冲动,要将这种神力全数带回。因此,他将此方胜境中的所见所闻刻于石上,题为自动化,携回那苦逼调参之邦。若有访道求仙者寻得这宝物,便可神力倍增,从此训练任何模型都可称心顺遂。
这故事很恐怖吧?我不知道这故事是否是真的,但在现代社会中,机器学习领域的巨头们很乐于将这种事变成真的(当然可能会进行一些微小的改变)。本文中,我会分享一些现在可用的设定,并帮助你建立起一种直觉,让你知道巨头们都在做什么(因为虽然它们的名字里都有“自动”这个词,却没有什么相同的地方)。
Azure 自动机器学习(预览版)
是否开源: 否
是否基于云: 是(仅测试,训练可在任何机器上进行)
支持任务: 分类,回归
所用技术: 概率矩阵分解 + 贝叶斯优化
训练框架: sklearn
该方法背后的思想是,如果两个数据集在几个机器学习工作流上都得到了相似的结果,那么它们很有可能在剩下的其他工作流上也得到这样的结果。这种说法可能对你来说很熟悉,尤其是如果你以前处理过推荐系统中的协同过滤问题,也就是如果两个用户在过去喜欢过同一件东西,那么他们在未来可能会喜欢相似的东西。
图:P 个工作流、D 个数据集的输入矩阵可视化。图中的数字代表数据集 d 在工作流 p 上获得的值的平均值。
到目前为止描述的模型可以被用于将每一个机器学习工作流的期望性能预测为已验证过的工作流的一个函数,但并没有告诉我们下一个要验证的工作流是什么。由于他们使用了矩阵分解的一种概率表示,该方法会给出预测工作流表现的后验概率分布,因此可以使用获得函数(即贝叶斯优化方法)来引导机器学习工作流空间的探索路径。基本上,该方法选择的下一个工作流能够最大化精度的期望增值。
然而,推荐系统往往会在一个问题上栽跟头——冷启动。基本思想是如果一个新的数据集进入了该系统,比如你的自定义数据集,那么模型会完全不知道这个新数据集和谁相似。为解决这一冷启动问题,需要从数据集中计算出一些元特征,用以捕获数据集的一些特点,如观察数量、类型数量、值的范围等。然后,通过使用这些度量标准,他们可以在已知数据集集合中找到一个相近数据集。他们将该方法在不同工作流上测试了五次,直到他们得到了获得函数,从而确定下一步要测试的数据集为止。注意,这个方法并不需要直接访问数据集,而只需要用到在数据集上离线计算出的元特征(这使得该方法资源消耗更少)。
谷歌 AutoML
是否开源: 否
是否基于云: 是(训练和测试均基于云)
支持任务: 用于分类的 CNN,RNN,LSTM
所用技术: 基于策略梯度更新的强化学习
训练框架: TensorFlow
谈到神经网络,当前最先进模型的成功离不开从特征设计到架构设计的策略转移。也就是说,最有效的策略是设计能从数据中无监督地学习到最优表示的架构,而非直接操作那些特征(直接操作特征更复杂,而且需要了解关于数据的诸多知识)。然而,设计架构也需要很多知识,而且耗时较长。谷歌的 AutoML 的想法是创建一个元模型,该模型可以从各数据集相关的子模型中学习到一种设计和生成架构的方法(好厉害)。
他们使用了用 RNN 实现的神经网络结构检索模型,该模型能够生成被编码为变量长度的表征序列(这样说比较复杂,其实就是被编码为一种“弦”)的架构。
图:使用上述方法生成的 CNN 的编码方式。每种颜色的框对应一个由 RNN 生成的上述方法的架构中的参数(或表征)。
该方法可以生成哪些模型? 基于 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 方法
贝叶斯优化过程完成后,他们为所有测试过的模型构建了一个集成。这一步的思想是保存每个模型的训练过程中获得的所有信息。这一步会保存所有模型、构建一个集成模型,而不是直接扔掉差的模型、保留好的。这种自动集成构建避免了将自身变成一个单一的超参数,因此鲁棒性更强(而且更不容易过拟合)。这种集成是用集成选择的方法构建的(这是一个贪心过程,开始时集成为空,然后向其中迭代加入使集成测试性能最大化的模型)。
总结和评论
上面提到的每一种方法都有自己的优缺点,并有不同的作用空间。Azure 自动化机器学习和 auto-sklearn 是基于同一个原理构建的,可以用于回归和分类任务,对计算资源要求更低,因此更容易实现。它们不需要访问整个数据集(只要需要构建的模型在其他地方已经生成了),因此在数据隐私方面比较优秀。但是,这两种方法非常依赖于它们已经见过的数据集类型。它们无法测试新的东西,除非该机器学习工作流已经提前出现过。因此,我个人并不倾向于将这种类型的方法称为元学习。
另一方面,谷歌 AutoML 和 AutoKeras 使用的方法相同,均是试图去学习一种方法来从头构建模型。这种概念更为模糊,因此该方法仅局限于几种作用空间(如 CNN,RNN 和 LSTM)。然而,强化学习的方法使得他们可以寻找新的方法去构建模型(谷歌称他们的方法找到了一种比现有模型性能好 1.05 倍的模型)。这种方法听起来更像元学习。但是,强化学习方法会消耗大量计算资源,这也就是为什么他们的云服务需要收每小时 20 美元的租金。AutoKeras 性能优化可以用精度的稍微变差来换取价格的降低,在这种情况下不失为一种优选(而且它是开源的,对于注重隐私的人来说是又一个优势)。
本文首发于 Medium Data Science,英文原文链接:
评论 1 条评论