AutoML又一利器来了,谷歌宣布开源AdaNet(附教程)

模拟技术

2412人已加入

描述

关键词: AutoML , AdaNet , 集成学习 , 机器学习 , 神经网络

来源:新智元

今天,谷歌宣布开源AdaNet,这是一个轻量级的基于TensorFlow的框架,可以在最少的专家干预下自动学习高质量的模型。
这个项目基于Cortes等人2017年提出的AdaNet算法,用于学习作为子网络集合的神经网络的结构。

谷歌AI负责人Jeff Dean表示,这是谷歌AutoML整体工作的一部分,并且,谷歌同时提供了AdaNet的开源版本和教程notebook。

7 小时前 上传

下载附件 (30.21 KB)



该团队在介绍博客中表示:“AdaNet以我们最近的强化学习和基于进化的AutoML研究为基础,在提供学习保证的同时实现了快速、灵活。重要的是,AdaNet提供了一个通用框架,不仅可以学习神经网络架构,还可以学习集成,以获得更好的模型。”
AdaNet提供以下特征:

Estimator API,可轻松训练、评估和服务AdaNet模型。
学习在TensorFlow中集成用户定义的子网。
用于在单个 train() 调用中搜索子网架构和参数的接口。
关于CPU和GPU的分布式训练(我们正在开发TPU支持)。
一流的TensorBoard integration。
提供理论学习。
基于集成学习的自动搜索工具

集成学习(Ensemble learning)是将不同机器学习(ML)模型预测结合起来的技术,广泛用于神经网络,以实现最先进的性能。得益于丰富的经验和理论保证,集成学习在许多Kaggle竞赛中取得了成功,例如Netflix Prize。

由于训练时间长,集成学习在实践中使用不多,而且选择哪个ML模型需要根据其领域专业知识来。

但随着计算能力和专用深度学习硬件(如TPU)变得更容易获得,机器学习模型的一个趋势是变得更大,集成(ensemble)也就变得更加重要。

现在,AdaNet就是这样一个工具,可以自动搜索神经网络架构,并学会将最好的架构组合成一个高质量的模型。
AdaNet易于使用,并能创建高质量的模型,为ML实践者节省了用于选择最佳神经网络架构的时间,实现了一种将学习神经架构作为子网络集合的自适应算法。

AdaNet能够添加不同深度和宽度的子网络,以创建多样化的集合,并通过参数数量来改进性能。

7 小时前 上传

下载附件 (437.5 KB)



AdaNet自适应地产生了神经网络的集成。在每次迭代中,它测量每个候选对象的集成损失,并选择最佳的一个,然后进入下一次迭代。

快速且易于使用

AdaNet实现了TensorFlow Estimator接口,通过封装训练、评估、预测和服务导出,大大简化了机器学习编程。它集成了开源工具,如TensorFlow Hub模块,TensorFlow Model Analysis和Google Cloud的Hyperparameter Tuner。分布式训练支持可显着缩短训练时间,并可与可用的CPU和加速器(例如GPU)进行线性扩展。

7 小时前 上传

下载附件 (24.66 KB)



AdaNet在CIFAR-100上每个训练步骤(X轴)的精度(y轴)。蓝线是训练集上的性能,红线是测试集上的性能。每一百万步开始训练一个新的子网络,并最终提高整体的性能。在添加新子网之前,灰线和绿线是集合的准确度。

由于TensorBoard是用于在训练期间可视化模型性鞥的最佳TensorFlow功能之一,AdaNet可与其无缝集成,以监控子网络训练,集合组合和性能。当AdaNet完成训练后,它会导出一个可以使用TensorFlow Serving部署的SavedModel。

学习保证

构建神经网络集合面临这么几个挑战:要考虑的最佳子网架构是什么?再此使用相同的架构或鼓励多样性是不是最佳选择?虽然具有更多参数的复杂子网将在训练集上表现更好,但由于其存在更强的复杂性,它们可能不会适用于未知数据。这些挑战来自评估模型性能的过程。我们可以评估一个训练集子集的性能,但这样做会减少可用于训练神经网络的示例数量。

相反,AdaNet的方法(在ICML 2017的“ AdaNet:人工神经网络的自适应结构学习 ”一文中提出)是为了优化一个对象,以平衡集合在训练集上的表现与其适用于未知数据的能力之间的权衡。集合这样选择子网络:只有当候选子网络改进了总体的训练损失,而不是影响了整体的泛化能力时,才包含这个候选子网络。这保证了:

1.集合的泛化误差受到训练误差和复杂性的限制。
2.通过优化对象,我们可以直接将限制最小化。

优化对象的一个实际好处是:它不需要保留集来选择要添加到集合中的候选子网。这还将带来另一个好处:我们可以使用更多的训练数据来训练子网。

可扩展性

我们认为,为满足研究和生产制作AutoML框架的关键在于不仅要提供合理的默认值,还要允许用户尝试自己子网及模型的定义。因此,机器学习研究人员、从业人员和爱好者均可报名定义自己的AdaNet adanet.subnetwork.Builder,通过使用高级别的TensorFlow API,如tf.layers。

已经在其系统中集成TensorFlow模型的用户可以轻松地将他们的TensorFlow代码转换为AdaNet子网,并使用adanet.Estimator提高模型性能,同时获得学习保证。AdaNet将探测他们定义的候选子网的搜索空间,并学习整合子网。例如,我们采用了NASNet-A CIFAR架构的开源实现方式,将其转换为子网,并在八次AdaNet迭代后对CIFAR-10最先进的结果进行改进。此外,我们的模型使用更少的参数实现了这一结果:

7 小时前 上传

下载附件 (18.02 KB)



Zoph等人2018年提出的NASNet-A模型的性能,以及AdaNet学习在CIFAR-10上将小型NASNet-A子网结合起来的性能比较。
用户还可以通过扩展adanet.subnetwork.Generator类来完全定义候选子网络的搜索空间。这允许他们根据可用硬件增大或减小搜索空间。子网络的搜索空间可以很简单,只需使用不同的随机种子复制相同的子网络配置,就能训练具有不同超参数组合的数十个子网络,并让AdaNet选择要包含在最终集合中的子网络。

谷歌的研究团队提供了GitHub repo和tutorial notebook,并且包含了一些使用dense layers和卷积的示例帮助大家入门。

AdaNet的数据集、工作原理和应用范围

今天,该项目的成员也在Reddit和ycombinator上回答读者提问,我们精选了一些回答:

1、请问你使用该算法尝试了哪些数据集?它是否只适用于图像分类,比如Google的AutoML产品?

我们在图像识别之外的几个大型数据集上使用了AdaNet,包括结构化数据(参见原始论文)和一些NLP数据集。在大多数情况下,AdaNet的性能优于独立训练的任何单个子网络(这些子网络可能使用非常复杂的架构,如NASNet-A)。

当然,如何定义一个优化搜索空间,并使用合理的搜索启发方式/算法对于获得最佳的最终模型非常重要,而且一般最佳的模型是使用强大的先验,就像最先进的模型,并让AdaNet学习将这些模型的不同变化结合起来。

但是,如果你希望AdaNet能够通用于任意数据集,可以尝试定义合理的搜索空间,比如搜索日益复杂的完全连接的神经网络,并允许AdaNet学习将其组合到最佳模型中。

最终,这就是我们设计的AdaNet具备高度灵活性的原因:我们希望任何人尝试建立对自己的数据集有意义的子网络搜索空间,以便获得最佳性能的最终模型。

2、官方资源库中的示例是个更好的例子,说明了AdaNet的工作原理:

https://github.com/tensorflow/ad ... net_objective.ipynb

尽管名字叫“AutoML”,但实际上似乎仍需要做很多工作才能实现模型的优化。 (第二个示例在这方面的表现相对更好一些:
https://github.com/tensorflow/ad ... mizing_adanet.ipynb)

确实,虽然AdaNet项目目前还不包含最先进的架构搜索策略/搜索空间,但它确实为研究人员提供了一个抽象对象(adanet.subnetwork.Generator)来实现神经架构搜索算法,同时提供了适合用户的生产友好型的TF Estimator界面,让算法开发更容易集成到生产过程中,而且,已经使用TF Estimator生态系统的用户也可以更快地从这些开发成果中受益。

我想指出的是,尽管AdaNet的某些方面并不那么先进,但我们已经看到AdaNet在各种各样的任务上取得了良好的效果。大家都来试试看吧!

当然,我们不会停下脚步!我们很高兴自己也在这个领域工作,我们今后将继续更新这个项目。

3、我还没有细读,但抱歉问一句;:AdaNet可以处理具有可变长度skip connections的块吗?(比如DenseNet),甚至能够提供AmoebaNet风格的模型吗?指导超参数/架构选择过程的元策略(网格搜索/贝叶斯等)有哪些呢?谢谢!

这是个好问题!在最简单的情况下,AdaNet允许用户将独立子网从线性模型集成到用户定义的DenseNet / AmoebaNet式网络上。但更有趣的是在迭代之间共享信息(这些信息可以是张量输出,或是哪些超参数表现最好),以便AdaNet进行神经架构搜索。用户可以定义自己的adanet子网生成器,指定如何跨迭代过程调整训练方式。

开箱即用的元策略其实和用户简单定义的启发式算法差不多。但是,AdaNet框架足够灵活,可以支持更智能的策略,并抽象出分布式训练(Estimator),评估(TensorBoard)和服务(tf.SavedModel)的复杂度。

4、机器学习和深度学习取得了如此大的进步。可以估计一下我需要多少CPU 和成本才能获得一些结果吗?我的数据训练量大约是20M的样本(每个样本1K数据点)。

这取决于你搜索的子网数量以及每个子网的训练成本。你可以使用单个DNN定义搜索空间,并为其提供一次迭代,这与固定DNN Estimator的操作相同。

比如说,假设搜索空间包含5个DNN,每个DNN完成一次迭代训练需要的成本为X,训练10次迭代,你的训练成本就是X x 5 x 10 = 50X。

但是,考虑到你使用AdaNet,可以考虑整合50个DNN进行探索、训练和选择等流程,此外,由于AdaNet是作为TensorFlow Estimator实现的,如果这就是你想要的,可以很容易地增加机器数量,以加快训练速度。

参考链接:
https://ai.googleblog.com/2018/1 ... t-and-flexible.html
https://www.reddit.com/r/Machine ... nsorflow_framework/

教程:
https://github.com/tensorflow/ad ... /examples/tutorials

【加入社群】
新智元 AI 技术 + 产业社群招募中,欢迎对 AI 技术 + 产业落地感兴趣的同学,加小助手微信号:aiera2015_3入群;通过审核后我们将邀请进群,加入社群后务必修改群备注(姓名 - 公司 - 职位;专业群审核较严,敬请谅解)。  

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分