雷锋网 AI 科技评论编者按:近期,Google 开源了轻量级 AutoML 框架—— AdaNet,该框架基于 TensorFlow,只需要少量的专家干预便能自动学习高质量模型,在提供学习保证(learning guarantee)的同时也能保持快速、灵活。值得一提的是,AdaNet 提供了一种通用框架,不仅能够学习神经网络架构,还能学习集成从而获得更佳的模型。雷锋网 AI 科技评论根据 Google AI 在博客上发布 AutoML 的文章进行编译如下。
整合了不同机器学习模型预测的模型集成,被广泛运用于神经网络来实现最优性能,它受益于悠久的历史和理论,从而在 Netflix Prize 和各项 Kaggle 竞赛等挑战赛中拔得头筹。然而由于训练耗时长,以及机器学习模型的选择机制需要自身具备领域专业知识,它们在实践中的应用并不多。不过随着算力和 TPU 等深度学习专用硬件变得更容易获得,我们可以允许更大的机器学习模型,模型集成方法也就成了一种能带来突出表现的选择。现在想象一下,一个工具可以自动搜索神经架构,并学习将最佳的神经架构集成到一个高质量的模型中。
现在,Google 对基于 TensorFlow 的轻量级框架 AdaNet 进行开源,这一框架只需要少量的专家干预便能自动学习高质量模型。AdaNet 在 Google 最近的强化学习和基于进化的 AutoML 成果的基础上构建,在提供学习保证的同时也能保持快速、灵活。重点是,AdaNet 提供了一种通用框架,不仅能够学习神经网络架构,还能学习集成从而获得更佳的模型。
AdaNet 使用方便,还能创建高质量模型,以节省机器学习从业者通常在选择最优神经网络架构上所耗费的时间,它会执行一个自适应学习算法,学习出一个由许多子网络集成得到的神经网络架构。AdaNet 能够通过不同深度和宽度的子网络来创建多种不同的集成,并在性能提升和参数数量二者之间进行权衡。
AdaNet 适应性地增加神经网络的集成。在每次迭代中,AdaNet 衡量每个候选神经网络的集成损失,并选择将最优的神经网络转入下一次迭代中。
AdaNet 采用了 TensorFlow Estimator 接口,通过封装训练、评估、预测和输出,极大简化了机器学习编程,并整合了 TensorFlow Hub modules、TensorFlow Model Analysis、Google Cloud』s Hyperparameter Tuner 这类开源工具。其对分布式训练的支持,极大缩短了训练时间,并且增加新的 CPU 和加速器(例如 GPU)之后性能可以获得线性提升。
AdaNet 在 CIFAR-100 上每个训练步(x 轴)对应的准确率(y 轴)。蓝线表示训练集上的准确率,红线表示测试集上的性能。一个新的子网络以每一百万步开始训练,最终提高整个集成模型的性能。灰色和绿色线表示新增的子网络之前的集成准确率。
作为最好的 TensorFlow 功能之一,TensorBoard 可以将训练过程中的模型指标可视化,因而 AdaNet 可与 TensorBoard 实现无缝整合,来监控子网络训练、集成合并和性能。AdaNet 完成训练后,会输出一个可使用 TensorFlow Serving 进行部署的 SavedMode。
构建神经网络集成面临一些挑战:要考量什么是最佳子网络架构?重复使用相同的架构最好,还是鼓励差异化最好?尽管具备更多参数的复杂子网络在训练集上倾向于表现更好,但是它们也由于更大的复杂性而可能难以泛化到未知的数据。这些挑战源自于对模型性能的评估,我们可以从训练集单独分出来一部分数据用于评估性能,不过这样的话可能会减少可用于训练神经网络的样本量。
不一样的是,AdaNet 的方法(该方法可参考 ICML 2017 的论文 AdaNet: Adaptive Structural Learning of Arti¡cial Neural Networks)是优化一个目标,在训练集的集成性能和未知数据的泛化能力间进行权衡。这里采用了一个符合人类直觉的设定:只有当一个候选的子网络对集成模型的训练损失的优化超过其对泛化能力的负面影响时,AdaNet 才会把这个子网络集成进来。这保证了:
第一,集成的泛化误差受其训练误差和复杂度的约束;
第二,通过优化这一目标,能够直接最小化该约束。
优化这一目标的实际收益是,它能消除选择加入集成的候选子网络时对于留出集的需求。如此带来的附加收益是,使得 AdaNet 能够使用更多的训练数据来训练子网络。
如需了解更多,可参考其 AdaNet 目标函数教程(https://github.com/tensorflow/adanet/blob/v0.1.0/adanet/examples/tutorials/adanet_objective.ipynb)。
Google 认为,创建应用于研究和产品的有用的 AutoML 框架的关键是,它不仅能够提供合理的默认值,还能让用户可以尝试定义自己的子网络/模型。最终,机器学习研究者、从业者以及爱好者都能够受邀使用 tf.layers 等高水平的 TensorFlow APIs,来定义他们自己的 AdaNet adanet.subnetwork.Builder。
对于已经在自己的系统中集成了 TensorFlow 模型的用户,可以轻易地将自己的 TensorFlow 代码转到 AdaNet 子网络中,并且能够在获得学习保证的同时,使用 adanet.Estimator 来提升模型性能。AdaNet 会探索他们定义的候选子网络搜索空间,同时学习对子网络进行集成。例如,Google 实现 NASNet-A CIFAR 架构的开源,将其迁移到了一个子网络中,并经过 8 次 AdaNet 迭代提高了它在 CIFAR-10 上的最优结果。除此之外,Google 的模型实现了用更少参数来获得以下结果:
在 CIFAR-10 数据集上,展示在 Zoph et al., 2018 中的 NASNet-A 模型的性能 VS 学习结合多个小型 NASNet-A 子网络的 AdaNet 的性能。
用户也可以通过固定或自定义的 tf.contrib.estimator.Heads,将自己定义的损失函数用作 AdaNet 目标的一部分来训练回归、分类以及多任务学习问题。
用户还可以通过扩展 adanet.subnetwork.Generator 类别,来充分定义要探索的候选子网络搜索空间。这使得他们能够基于可获得的硬件来扩大或者缩小其搜索空间。子网络的训练空间可以简单也可以复杂,简单的时候可以只是多次复制同样的子网络设置,只不过用了几个不同的随机种子,复杂的时候就可以是用不同的超参数组合训练几十个不同的子网络,然后由 AdaNet 选择其中的某一个包括到最终的集成模型中。
如果的大家对独立尝试 AdaNet 感兴趣,可以前往 Github repo(https://github.com/tensorflow/adanet),并查看相关教程(https://github.com/tensorflow/adanet/tree/v0.1.0/adanet/examples)。
via:Google AI Blog(Charles Weill,Introducing AdaNet: Fast and Flexible AutoML with Learning Guarantees),雷锋网 AI 科技评论编译