5熊猫网

 找回密码
 免费注册

QQ登录

只需一步,快速开始

开启左侧
查看: 170|回复: 0
 胡全 发表于: 2019-12-31 13:29:03|显示全部楼层|阅读模式

[2019年] 长期盘踞热榜,微软官方AutoML库教你三步学会20+炼金基本功

 [复制链接]
源自:机器之心
  机器之心报道
  项目作者:微软NNI团队
  参与:思源、一鸣
  有了 AutoML,特征工程、神经架构和超参搜索这些炼金基本功再也不用担心了。作为科技巨头,微软也在 AutoML 上开源了自己的 NNI 库,这个库在 GitHub 上非常流行,长期盘踞在每日项目 Trending 榜。

f3c6-imkzenq1358882.png
  根据 GitHub 项目上的介绍,NNI(Neural Network Intelligence)意图帮助用户使用自动机器学习算法、帮助进行算法加速、实现更好的超参数、神经架构和模型压缩,以及进行平台部署。大约一周前,这一开源项目更新到了 1.2 版本,并有了一个中文的官方文档。
  项目地址:https://github.com/microsoft/nni
  从观察来看,NNI 是相当全面的 AutoML 库了,支持很多模型、部署环境、框架和库,也提供了很多工具和数据集。不仅如此,除了使用 CLI 进行操作之外,还提供了可视化界面。
  NNI 库特性有什么
  根据微软 NNI 项目文档页面,我们可以了解到该项目希望自动设计并调优神经网络架构、复杂系统的参数等。NNI 拥有如下非常优秀的特性。
  NNI(Neural Network Intelligence)是一个工具包,可有效的帮助用户设计并调优机器学习模型的神经网络架构,复杂系统的参数(如超参)等。NNI 的特性包括:易于使用,可扩展,灵活,高效。
  易于使用:NNI 可通过 pip 安装,只需要在代码中添加几行,就可以利用 NNI 来调优超参数与模型架构。
  可扩展:调优超参或网络结构通常需要大量的计算资源。NNI 在设计时就支持了多种不同的计算资源,如远程服务器组、OpenPAI 和 KUbernetes 等训练平台。
  灵活:除了内置的算法,NNI 中还可以轻松集成自定义的超参调优算法、神经网络架构搜索算法、提前终止算法等等。还可以将 NNI 连接到更多的训练平台上,如云计算虚拟机集群、Kubernetes 服务等等。
  高效:NNI 在系统及算法级别上不停地优化,例如可通过 Trial 早期的反馈来加速调优过程。
  下图显示了 NNI 的体系结构:

d7ce-imkzenq1358881.png
  在 NNI 中,Experiment 指搜索最优超参组合的任务,它的运行过程可以分为:Tuner 接收搜索空间并生成配置;配置被提交到训练平台;执行结果返回 Tuner。在每次执行超参搜索时,我们只需要定义搜索空间,就能利用 NNI 内置的 Tuner/Assessor 以及训练平台搜索最好的超参组合。
  这样的搜索三步走可以展示为:

2372-imkzenq1358997.jpg
  NNI 库的广泛支持
  从功能上,NNI 库具有命令行(NNICTL)和可视化界面(NNI Board)两个部分,用户可以使用它们进行管理。在 NNI 中,它内置了自动机器学习算法,并为流行的训练平台提供了很多支持。

0247-imkzenq1361369.png
  具体而言,NNI 支持各种深度学习框架、机器学习库、很多机器学习算法(如超参调优搜索、神经架构搜索、模型剪枝和压缩、特征工程等)。除了这些之外,NNI 库还对部署环境进行了支持,不论是本地、远程还是基于 Kubernetes 平台都可以使用。
  完整的支持功能列表如下:

0b3d-imkzenq1359418.jpg
a820-imkzenq1359412.jpg
  正确的使用姿势
  在 NNI 的整个架构中,自动模型压缩、自动特征工程都非常吸引人,但下面我们主要展示如何三步走搜索模型超参与架构。
  超参搜索
  超参搜索是 NNI 最核心、基本的功能,其中提供了许多流行的自动调优算法(Tuner)以及提前终止算法(Assessor)。这里我们可以通过 MNIST 展示如何使用 NNI 搜索最优超参。
  首先对于一般的 MNIST 建模,它的主要过程可以描述为:
  defrun_trial(params):
  #输入数据
  mnist=input_data.read_data_sets(params[data_dir],one_hot=True)
  #构建网络
  mnist_network=MnistNetwork(channel_1_num=params[channel_1_num],channel_2_num=params[channel_2_num],conv_size=params[conv_size],hidden_size=params[hidden_size],pool_size=params[pool_size],learning_rate=params[learning_rate])
  mnist_network.build_network
  test_acc=0.0
  withtf.Sessionassess:
  #训练网络
  mnist_network.train(sess,mnist)
  #评估网络
  test_acc=mnist_network.evaluate(mnist)
  if__name__==__main__:
  params={data_dir:/tmp/tensorflow/mnist/input_data,dropout_rate:0.5,channel_1_num:32,channel_2_num:64,conv_size:5,pool_size:2,hidden_size:1024,learning_rate:1e-4,batch_num:2000,batch_size:32}
  run_trial(params)
  这段代码是没有搜索超参的,每次模型只能运行一组特定的超参数 params。一般来说,NNI 的输入是搜索空间、训练代码和配置文件三部分,我们可以定义一个循环,每次向训练代码传入一组超参数,并记录这组超参的结果。等循环结束后,我们就能从记录的结果中找到最优超参数。
  下面让我们三步走搜索一组漂亮的超参,注意其中「-」表示原来标准代码该删除的内容,「+」表示采用 NNI 搜索超参该新加的代码。
  1.定义 JSON 格式的搜索空间文件,包括所有需要搜索的超参的名称和分布(离散和连续值均可)。
  - params={data_dir:/tmp/tensorflow/mnist/input_data,dropout_rate:0.5,channel_1_num:32,channel_2_num:64
  - conv_size:5,pool_size:2,hidden_size:1024,learning_rate:1e-4,batch_num:2000,batch_size:32}
  +{
  +dropout_rate:{_type:uniform,_value:[0.5,0.9]}
  +conv_size:{_type:choice,_value:[2,3,5,7]}
  +hidden_size:{_type:choice,_value:[124,512,1024]}
  +batch_size:{_type:choice,_value:[1,4,8,16,32]}
  +learning_rate:{_type:choice,_value:[0.0001,0.001,0.01,0.1]}
  +}
  2.修改训练代码来从 NNI 获取超参,并返回 NNI 最终结果。
  +importnni
  defrun_trial(params):
  mnist=input_data.read_data_sets(params[data_dir],one_hot=True)
  mnist_network=MnistNetwork(channel_1_num=params[channel_1_num],channel_2_num=params[channel_2_num],conv_size=params[conv_size],hidden_size=params[hidden_size],pool_size=params[pool_size],learning_rate=params[learning_rate])
  mnist_network.build_network
  withtf.Sessionassess:
  mnist_network.train(sess,mnist)
  test_acc=mnist_network.evaluate(mnist)
  +nni.report_final_result(test_acc)
  if__name__==__main__:
  - params={data_dir:/tmp/tensorflow/mnist/input_data,dropout_rate:0.5,channel_1_num:32,channel_2_num:64
  - conv_size:5,pool_size:2,hidden_size:1024,learning_rate:1e-4,batch_num:2000,batch_size:32}
  +params=nni.get_next_parameter
  run_trial(params)
  3.定义 YAML 格式的配置文件,其中声明了搜索空间和训练代码文件的路径,以及调优算法、最大尝试次数、最大运行时间等信息。
  authorName:default
  experimentName:example_mnist
  trialConcurrency:1
  maxExecDuration:1h
  maxTrialNum:10
  trainingServicePlatform:local
  #搜索空间文件
  searchSpacePath:search_space.json
  useAnnotation:false
  tuner:
  builtinTunerName:TPE
  #运行的命令,以及Trial代码的路径
  trial:
  command:python3mnist.py
  codeDir:。
  gpuNum:0
  现在,完成了三步修改后,再执行运行命令就能自动搜索了,整个过程也就完成了。
  神经架构搜索
  除了超参搜索外,NNI 也支持了神经架构搜索。这里以 ENAS 为例。
  在 ENAS 中,Contoller 学习在大的计算图中搜索最优子图的方式来发现神经网络。它通过在子模型间共享参数来实现加速,并获得好的性能。
  NNI 中的 ENAS 算法目前支持 CIFAR10 上的 Macro/Micro 搜索空间搜索。具体使用方法如下:
  #进入ENAS的代码目录
  cdexamples/nas/enas
  #在Macro搜索空间中搜索
  python3search.py--search-formacro
  #在Micro搜索空间中搜索
  python3search.py--search-formicro
  #查看更多选项
  python3search.py-h
  NNI 项目中使用的是论文 Efficient Neural Architecture Search via Parameter Sharing 中的实现。使用的 py 文件可以在相关文件夹中找到。
  目前项目仍在进一步开发的过程中,项目作者表示,希望有更多的志愿者加入到 NNI 的开源工作中,贡献新的代码和模型。
『 5熊猫网 』提醒,在使用本论坛之前您必须仔细阅读并同意下列条款:
  1. 遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规,并遵守您在会员注册时已同意的《『 5熊猫网 』管理办法》;
  2. 严禁发表危害国家安全、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容;
  3. 本帖子由 胡全 发表,享有版权和著作权(转帖除外),如需转载或引用本帖子中的图片和文字等内容时,必须事前征得 胡全 的书面同意;
  4. 本帖子由 胡全 发表,仅代表用户本人所为和观点,与『 5熊猫网 』的立场无关,胡全 承担一切因您的行为而直接或间接导致的民事或刑事法律责任。
  5. 本帖子由 胡全 发表,帖子内容(可能)转载自其它媒体,但并不代表『 5熊猫网 』赞同其观点和对其真实性负责。
  6. 本帖子由 胡全 发表,如违规、或侵犯到任何版权问题,请立即举报,本论坛将及时删除并致歉。
  7. 『 5熊猫网 』管理员和版主有权不事先通知发帖者而删除其所发的帖子。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

© 2002-2025, 蜀ICP备12031014号, Powered by 5Panda
GMT+8, 2025-5-6 17:44, Processed in 0.078000 second(s), 8 queries, Gzip On, MemCache On
快速回复 返回顶部 返回列表