Hyperparameter调优

    概述

    本文介绍超参数调优,它是云机器学习引擎提供的自动模型增强器。在训练模型时,超参数调优利用谷歌云平台的处理基础设施来测试不同的超参数配置。它可以为超参数提供优化值,从而最大化模型的预测精度。

    hyperparameter是什么?

    如果你是机器学习的新手,你可能从未遇到过这个术语hyperparameters之前。在训练模型时,您的训练器将处理三类数据:

    • 您的输入数据(也称为训练数据)是单个记录(实例)的集合,其中包含对机器学习问题重要的特征。在训练期间使用这些数据来配置您的模型,以便准确地预测类似数据的新实例。但是,输入数据中的实际值从来不会直接成为模型的一部分。

    • 你的模型的参数是你选择的机器学习技术用来调整你的数据的变量。例如,深度神经网络(DNN)由处理节点(神经元)组成,每个节点在数据通过网络时对其执行一个操作。当训练DNN时,每个节点都有一个权重值,告诉模型它对最终预测的影响有多大。这些权重是模型参数的一个例子。在许多方面,您的模型的参数就是模型—它们将您的特定模型与处理类似数据的相同类型的其他模型区别开来。

    • 如果模型参数是通过使用现有数据进行训练来调整的变量,那么超参数就是关于训练过程本身的变量。例如,建立一个深度神经网络的一部分是决定在输入层和输出层之间使用多少“隐藏”层的节点,以及每层应该使用多少节点。这些变量与训练数据完全没有直接关系。它们是配置变量。另一个区别是参数在训练过程中会改变,而超参数在工作过程中通常是不变的。

    您的模型参数通过训练过程进行了优化(可以说是“调优”):您通过模型的操作运行数据,将结果预测与每个数据实例的实际值进行比较,评估准确性,并进行调整,直到找到最佳值。类似地,通过运行整个训练工作、查看总体精度并进行调整,也可以对超参数进行调整。在这两种情况下,您都在修改模型的组合,以找到处理问题的最佳组合。

    如果没有像Cloud ML Engine超参数调优这样的自动化技术,您需要在多次训练过程中对超参数进行手动调整,以达到最佳值。超参数调优使确定最佳超参数设置的过程变得更容易、更少繁琐。

    它是如何工作的

    超参数调优通过运行多个来工作试用在一份培训工作中。每次试验都是训练应用程序的完整执行,在指定的范围内设置所选超参数的值。Cloud ML Engine培训服务会跟踪每次试验的结果,并为后续试验做出调整。当工作完成时,您可以获得所有试验的摘要,以及根据您指定的标准的最有效的值配置。

    超参数调优需要在Cloud ML Engine培训服务和您的培训应用程序之间进行更明确的通信。您可以在培训应用程序中定义模型所需的所有信息。考虑这种交互的最佳方法是定义想要调整的超参数(变量),并定义一个目标值。

    要了解更多关于贝叶斯优化如何用于云ML引擎的超参数调优,请阅读2017年8月谷歌云大数据和机器学习博客的文章,命名为基于贝叶斯优化的云机器学习引擎超参数优化

    它的优化

    超参数调优优化指定的单个目标变量(也称为超参数指标)。模型的准确性(通过评估过程计算)是一个常见的度量标准。度量必须是一个数值,您可以指定是否要调优模型以最大化或最小化度量。

    开始使用超参数调优的作业时,需要建立超参数指标的名称。适当的名称将取决于您是否使用kerastfestimators,或者是核心TensorFlow API。这将在下面的[超参数调优配置]一节中讨论。

    云ML引擎如何获得你的指标

    您可能会注意到,本文档中没有关于将超参数指标传递给Cloud ML Engine培训服务的说明。这是因为该服务自动监控培训师生成的TensorFlow摘要事件并检索指标。

    超参数值的流

    没有超参数调整,您可以通过您喜欢的任何方式在您的训练器中设置超参数。例如,您可以根据主应用程序模块的命令行参数配置它们,或者在配置文件中将它们提供给应用程序。使用超参数调优时,必须设置用于特定过程调优的超参数的值:

    • 定义一个培训的旗帜在每个调优超参数的训练脚本中。

    • 使用传递给这些参数的值在训练代码中设置相应的超参数。

    在配置具有超参数调优的训练作业时,需要定义要调优的每个超参数、其类型和要尝试的值的范围。您可以使用与在主模块中定义的对应参数完全相同的名称来标识每个超参数。训练服务在运行您的训练器时包括使用这些名称的命令行参数,这些参数又被传播到旗帜在你的脚本。

    选择hyperparameters

    对于如何选择应该调优的超参数,几乎没有通用的建议。如果您对正在使用的机器学习技术有经验,您可能会了解其超参数的行为方式。你也可以从机器学习社区找到建议。

    无论您如何选择它们,理解其中的含义是很重要的。选择进行调优的每个超参数都有可能成倍地增加成功调优工作所需的试验次数。当您在Cloud ML Engine上训练时,您将根据任务的持续时间收取费用,因此不小心分配超参数进行调优会大大增加训练模型的成本。

    准备你的脚本

    为了准备调优训练脚本,您应该定义一个培训的旗帜在脚本中针对每个调优的超参数。例如:

    图书馆(keras)旗帜< -旗帜flag_integer“dense_units1”128),flag_numeric“dropout1”0.4),flag_integer“dense_units2”128),flag_numeric“dropout2”0.3

    这些标志将在脚本中使用如下:

    模型< -keras_model_sequential()% > %layer_dense单位=旗帜dense_units1,激活=“relu”input_shape =c784))% > %layer_dropout率=旗帜dropout1)% > %layer_dense单位=旗帜dense_units2,激活=“relu”% > %layer_dropout率=旗帜dropout2)% > %layer_dense单位=10激活=“softmax”

    注意,我们现在引用的不是要改变的各种形参的文字值,而是旗帜返回的旗帜()函数。

    优化配置

    在提交培训脚本之前,您需要创建一个配置文件,该文件确定要优化的指标的名称以及用于优化的培训标志和相应值。指定度量的确切语义取决于您使用的接口,这里我们将使用Keras示例(请参阅关于优化指标其他接口的详细信息)。

    使用Keras,任何命名的度量(由指标参数传递给编译()函数)可作为优化目标。例如,如果这是对编译()

    模型% > %编译损失=“categorical_crossentropy”优化器=optimizer_rmsprop(),指标=c“准确性”

    然后,您可以使用以下文件作为CloudML培训配置文件,用于您想要探索不同辍学率的影响:

    tuning.yml

    trainingInputscaleTier自定义masterTypestandard_gpuhyperparameters目标最大化hyperparameterMetricTagaccmaxTrials10maxParallelTrials2参数个数-parameterNamedropout1类型minValue0.2maxValue0.6scaleTypeUNIT_LINEAR_SCALE-parameterNamedropout2类型minValue0.1maxValue0.5scaleTypeUNIT_LINEAR_SCALE

    我们指定的hyperparameterMetricTag: acc作为优化的指标。请注意,每当试图优化精度与Keras指定acc而不是精度因为这是Keras用于这个度量的标准缩写。

    类型Field可以是:

    • 整数
    • 分类
    • 离散

    scaleType数值类型的字段可以是:

    • UNIT_LINEAR_SCALE
    • UNIT_LOG_SCALE
    • UNIT_REVERSE_LOG_SCALE

    如果你正在使用分类离散类型,您需要将可能的值传递给categoricalValuesdiscreteValues参数。例如,你可以像这样定义超参数:

    —parameterName:激活类型:CATEGORICAL categoricalValues: [relu, tanh, sigmoid]

    还要注意的是,用于作业的计算资源配置也可以在配置文件中提供(例如masterType字段)。

    关于可用选项的完整细节可以在HyperparameterSpec文档。

    提交调优作业

    要提交超参数调优作业,请将包含超参数的CloudML配置文件的名称传递给cloudml_train ()

    cloudml_train“mnist_mlp。R”配置=“tuning.yml”

    作业将正常进行,您可以在RStudio终端或通过英格兰vs伊朗让球job_status ()而且job_stream_logs ()功能。

    收集试验

    完成作业后,您可以使用job_trials ()函数。例如:

    job_trials“cloudml_2018_01_08_142717956”
    finalMetric。objectiveValue finalMetric。trainingStep hyperparameters。dropout1 hyperparameters。dropout2trialId 1 0.973854 19 0.2011326172916916 0.32774705750441724 10 2 0.973458 19 0.20090378506439671 0.10079321757280404 3 3 0.973354 19 0.5476299090261757 0.49998941144858033 6 4 0.972875 19 0.597820322273044 0.4074512354566201 7 5 0.972729 19 0.25969787952729828 0.42851076497180118 1 6 0.972417 19 0.20045494784980847 0.15927383711937335 4 7 0.972188 19 0.33367593781223304 0.10077055587860367 5 8 0.972188 19 0.59880072314674071 0.10476853415572558 9 9 0.972021 19 0.40078175292512 0.49982245025905447 8 10 0.971792 19 0.46984175786143262 0.25901078861553267 2

    您可以使用' job_collect() '函数收集作为超参数调优运行的一部分执行的作业:

    job_collect“cloudml_2018_01_08_142717956”

    默认情况下,这将只收集具有最佳度量的工作试验(试验=“最好”).你可以通过试验= "所有"下载所有试用版。例如:

    job_collect“cloudml_2018_01_08_142717956”试验=“所有”

    您还可以通过试验id向量来下载特定的试验。例如,这段代码将下载前5名执行试验:

    试验< -job_trials“cloudml_2018_01_08_142717956”job_collect“cloudml_2018_01_08_142717956”试验=试用trialId [15])

    优化指标

    hyperparameterMetricTag是TensorFlow摘要标签名称,用于优化试验。对于当前版本的TensorFlow,这个标签名应该完全匹配在TensorBoard中显示的内容,包括所有作用域。

    你可以通过运行打开Tensorboardtensorboard ()在一个完整的运行和检查可用的度量上。

    标签不同的模型,但一些常见的如下:

    标签
    keras acc
    keras 损失
    keras val_acc
    keras val_loss
    tfestimators average_loss
    tfestimators global_step
    tfestimators 损失

    当使用核心TensorFlow API时,可以如下显式地添加摘要标签:

    摘要< -特遣部队总结()总结价值添加标签=“准确性”simple_value =准确性)summary_writeradd_summary(总结iteration_number)

    您可以看到示例培训脚本和相应的tuning.yml各种TensorFlow api的文件如下: