AdaNet 简介:快速灵活的 AutoML,提供学习保证
文 / Charles Weill,Google AI 软件工程师
集成学习是对不同的机器学习 (ML) 模型预测加以整合的技术,它广泛应用于神经网络,用以实现最优性能。集成学习得益于丰富的经验和理论保证,在许多挑战赛中都取得过成功,例如 Netflix Prize 和各种 Kaggle 竞赛。然而,由于训练时间长,再加上选择候选 ML 模型时需要用到自身专业领域的知识,因此集成学习在实践中并不常用。但是,随着计算能力和深度学习专用硬件(如 TPU)变得更加唾手可得,机器学习模型将越来越大,集成技术也将变得更加重要。现在,请您想象有这样一款工具,它可以自动搜索神经架构,并学会将最优架构整合到高质量模型中。
今天,我们非常高兴地向您分享一款基于 TensorFlow 的轻量型框架 — AdaNet(https://github.com/tensorflow/adanet),它可以使用最少的专家干预来自动学习高质量模型。AdaNet 的构建以我们最近的强化学习和基于进化的 AutoML 研究成果为基础,能够在实现快速灵活运行的同时提供学习保证。重要的是,AdaNet 提供的通用框架不仅可以用于学习神经网络架构,还可以学习集成,从而获得更好的模型。
AdaNet 易于使用,能够创建高质量的模型,节省 ML 从业者通常花在选择最优神经网络架构上的时间,还能实现将神经架构作为子网集成学习的自适应算法。AdaNet 能够添加不同深度和宽度的子网,以创建多样化的集成,并在性能改进与参数数量之间取得平衡。
AdaNet 能够以自适应的方式扩大神经网络集成的规模。在每次迭代中,它可以测量每个候选神经网络的集成损失,然后选择最好的神经网络进行下一次迭代
快速易用
AdaNet 实现了 TensorFlow Estimator 接口,能够通过封装训练、评估、预测和服务导出极大地简化机器学习编程。它可以与众多开源工具集成,例如 TensorFlow Hub 模块、TensorFlow Model Analysis 和 Google Cloud 的 Hyperparameter Tuner。它支持分布式训练,可以显著缩减训练时间,还可以使用现有 CPU 和加速器(例如 GPU)进行线性扩展。
AdaNet 在 CIFAR-100 上每个训练步(x 轴)的准确率(y 轴)。蓝线是在训练集上的准确率,红线是在测试集上的性能。每完成一百万步,便有一个新的子网开始训练,最终提升集成的性能。灰线和绿线是添加新子网之前的集成准确率
作为 TensorFlow 最好的功能之一,TensorBoard 能够在训练期间将模型指标可视化,因此 AdaNet 可以与其无缝整合,以监控子网训练、集成组合和性能。完成训练后,AdaNet 会导出一个可以使用 TensorFlow Serving 部署的 SavedModel。
学习保证
构建神经网络集成时面临多项挑战:要考虑的最佳子网架构有哪些?重复使用相同的架构和鼓励架构多样化,哪一个是最佳选择?虽然具有更多参数的复杂子网可能在训练集上表现更好,但由于复杂程度较高,它们可能无法泛化到未知数据。这些挑战源于对模型性能的评估。我们可以在从训练集中拆分出来的留出集上评估性能,但这样做会减少可用于训练神经网络的示例数量。
相反,AdaNet 的方法(在发表于 ICML 2017 上的《AdaNet:人工神经网络的自适应结构学习》 ( AdaNet: Adaptive Structural Learning of Artificial Neural Networks ) 一文中提出)是对目标函数进行优化,该目标函数可以平衡该集成在训练集上的性能与其泛化未知数据的能力之间的取舍。直觉是,只有当候选子网在减少集成训练损失方面的成效超过其对泛化能力的影响时,才在集成中添加候选子网。这保证了:
集成的泛化误差受到其训练误差和复杂性的限制。
通过优化此目标函数,我们可以直接将此限制最小化。
优化此目标函数的一个切实好处是,优化后的函数在选择添加到集成的候选子网时不需要留出集。由此可以带来另一个好处,即我们可以使用更多训练数据来训练子网。如需了解更多信息,请查看我们的 AdaNet 目标函数教程(https://github.com/tensorflow/adanet/blob/v0.1.0/adanet/examples/tutorials/adanet_objective.ipynb)。
可扩展
我们认为,要创建适合研究和生产用途的实用 AutoML 框架,关键在于不仅要提供合理的默认值,还要让用户能够尝试使用自己的子网/模型定义。这样就可以邀请机器学习研究者、从业者和爱好者使用类似 tf.layers 的高级 TensorFlow API 来定义自己的 AdaNet adanet.subnetwork.Builder。
已经在系统中整合 TensorFlow 模型的用户可以轻松将其 TensorFlow 代码转换为 AdaNet 子网,并可以在获得学习保证的同时使用 adanet.Estimator 来提升模型性能。AdaNet 会探索他们定义的候选子网搜索空间,并学习集成子网。例如,我们选择了 NASNet-A CIFAR 架构的一个开源实现,将其转换为子网,然后在八次 AdaNet 迭代后改进 CIFAR-10 的最优结果。而且,我们的模型使用更少的参数实现了这一结果:
Zoph 等研究者在 2018 年提出的 NASNet-A 模型与 AdaNet 经过学习将小型 NASNet-A 子网结合后形成的模型在 CIFAR-10 上的性能比较
用户也可以受邀通过固定或自定义 tf.contrib.estimator.Heads,将自己的自定义损失函数用作 AdaNet 目标函数的一部分,以训练回归、分类和同时处理多个学习问题。
用户还可以通过扩展 adanet.subnetwork.Generator 类来完整定义要探索的候选子网搜索空间。这让用户可以根据可用硬件扩大或减少搜索空间。子网的搜索空间可以简单到复制具备不同随机种子的同一子网配置,从而训练数十种具有不同超参数组合的子网,并让 AdaNet 选出一个要添加到最终集成中的子网。
如果您有兴趣亲自试用 AdaNet,请查看我们的 Github 仓库协议,并浏览 教程笔记本。我们添加了一些使用密集层和卷积的 工作示例 来帮助您入门。AdaNet 是一个正在进行的研究项目,我们欢迎各位建言献策。让我们拭目以待,看看 AdaNet 能够如何为研究社区提供帮助。
注:Github 仓库协议 链接
https://github.com/tensorflow/adanet
教程笔记本 链接
https://github.com/tensorflow/adanet/tree/v0.1.0/adanet/examples/tutorials
工作示例 链接
https://github.com/tensorflow/adanet/tree/v0.1.0/adanet/examples
致谢
这个项目的成功离不开我们核心团队成员的努力,他们是 Corinna Cortes、Mehryar Mohri、Xavi Gonzalvo、Charles Weill、Vitaly Kuznetsov、Scott Yak 和 Hanna Mazzawi。另外要特别感谢我们的协作者、学员和实习生,他们是 Gus Kristiansen、Galen Chuang、Ghassen Jerfel、Vladimir Macko、Ben Adlam、Scott Yang,还要感谢许多帮助我们测试的其他 Google 员工。
更多 AI 相关阅读: