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

有了 AutoML,特征工程、神经架构和超参搜索这些炼金基本功再也不用担心了。作为科技巨头,微软也在 AutoML 上开源了自己的 NNI 库,这个库在 GitHub 上非常流行,长期盘踞在每日项目 Trending 榜。

根据 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 的体系结构:

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

这样的搜索三步走可以展示为:

NNI 库的广泛支持

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

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

完整的支持功能列表如下:

正确的使用姿势

在 NNI 的整个架构中,自动模型压缩、自动特征工程都非常吸引人,但下面我们主要展示如何三步走搜索模型超参与架构。

超参搜索

超参搜索是 NNI 最核心、基本的功能,其中提供了许多流行的自动调优算法(Tuner)以及提前终止算法(Assessor)。这里我们可以通过 MNIST 展示如何使用 NNI 搜索最优超参。

首先对于一般的 MNIST 建模,它的主要过程可以描述为:

def run_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
    with tf.Session() as sess:
        # 训练网络
        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 最终结果。

+ import nni

  def run_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()

      with tf.Session() as sess:
          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: python3 mnist.py
  codeDir: .
  gpuNum: 0

现在,完成了三步修改后,再执行运行命令就能自动搜索了,整个过程也就完成了。

神经架构搜索

除了超参搜索外,NNI 也支持了神经架构搜索。这里以 ENAS 为例。

在 ENAS 中,Contoller 学习在大的计算图中搜索最优子图的方式来发现神经网络。它通过在子模型间共享参数来实现加速,并获得好的性能。

NNI 中的 ENAS 算法目前支持 CIFAR10 上的 Macro/Micro 搜索空间搜索。具体使用方法如下:

# 进入ENAS的代码目录
cd examples/nas/enas
# 在 Macro 搜索空间中搜索
python3 search.py --search-for macro
# 在 Micro 搜索空间中搜索
python3 search.py --search-for micro
# 查看更多选项
python3 search.py -h

NNI 项目中使用的是论文 Efficient Neural Architecture Search via Parameter Sharing 中的实现。使用的 py 文件可以在相关文件夹中找到。

目前项目仍在进一步开发的过程中,项目作者表示,希望有更多的志愿者加入到 NNI 的开源工作中,贡献新的代码和模型。

工程微软NNI项目
3
相关数据
Microsoft机构

微软是美国一家跨国计算机科技公司,以研发、制造、授权和提供广泛的计算机软件服务为主。总部位于美国华盛顿州的雷德蒙德,最为著名和畅销的产品为Microsoft Windows操作系统和Microsoft Office办公室软件,以及Xbox的游戏业务。微软是美国《财富》杂志2015年评选的世界500强企业排行榜中的第95名。

https://www.microsoft.com/en-us/about
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

云计算技术

云计算(英语:cloud computing),是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给计算机各种终端和其他设备。

推荐文章
暂无评论
暂无评论~