机器学习领域一般有两类参数,一类是模型内部参数,依靠训练数据来对模型参数进行调参,还有一类则是模型外部的设置参数,需要人工配置,这类参数被称为“超参数”。不同的超参数会对模型效果有不小的影响,因此超参在训练任务中的重要性较高。传统的方式都需要人工去调试和配置,这种方式消耗时间和精力。MindInsight调参功能可以用于搜索超参,基于用户给的调参配置信息,可以自动搜索参数并且执行模型训练。
MindInsight提供的mindoptimizer
调参命令可以根据用户配置,从训练日志中提取以往训练记录,再对以往训练记录进行分析,推荐超参,最后自动执行训练脚本。用户在使用时需要按照yaml格式来配置超参的范围等信息,再参考本教程替换训练脚本中的超参,旨在将自动推荐的超参同步到训练脚本里面。当前仅支持高斯过程调参方法,其他方法敬请期待。
此工具为MindInsight的子模块,安装MindInsight后,即可使用MindInsight调参命令,安装MindInsight请参考该安装文档。
MindInsight提供调参命令,命令行(Command-line interface, CLI)的使用方式如下:
usage: mindoptimizer [-h] [--version] [--config CONFIG]
[--iter ITER]
optional arguments:
-h, --help Shows the help message and exits.
--version Shows the program version and exits.
--config CONFIG Specifies the configuration file for parameter tuning.
The file format is yaml.
--iter ITER Specifies the times of automatic training.
Automatically recommended parameters are used every time
before the training is performed.
The default value of ITER is 1.
调参配置文件的格式是yaml,需配置运行命令、训练日志根目录、调参方法、优化目标和超参数信息。其中超参数需要配置取值范围,类型和来源等。MindInsight会根据配置的超参数和优化目标从训练日志中取训练记录,如学习率和正确率,可以供推荐算法分析它们之间的关系,更好地推荐超参数。
配置运行命令
通过command
来配置运行命令,如command: python train.py
。在调参程序推荐出超参数后,运行命令会被直接执行。
配置训练日志根目录
summary_base_dir
是训练日志根目录,它用于训练记录的提取,这样可以更好地推荐超参。同时,建议用户在训练脚本中加SummaryColletor
来收集训练信息,可查看Summmary收集教程。调参命令会根据配置的summary_base_dir
来生成子目录路径,可配置在SummaryColletor
记录该次训练记录。自动执行训练后,会在训练日志根目录的子目录记录当次训练信息,产生的训练信息可以作为训练记录来推荐下一次需要的超参。配置summary_base_dir
如summary_base_dir: /home/summaries
。
配置调参方法
通过name
配置调参方法的名字,通过args
字段来配置这个调参方法的参数。
当前采用的算法是高斯过程回归器(Gaussian process regressor, GP),这个算法可配置采集方法(Acquisition Function),可选,范围是[ucb
, pi
,ei
],默认值为ucb
。
示例:
tuner:
name: gp
args:
method: ucb
配置调参目标
用户可以选择loss或者自定义的评估指标作为调参的目标。
配置说明:
system_defined
和metric
,默认system_defined
。使用group
来配置优化目标所在的组,如loss是系统自定义收集字段,则是system_defined
组;而其他在Model()
中使用的评估指标,如model = Model(net, loss_fn=loss, optimizer=None, metrics={'Accuracy'})
,Accuracy
属于评估指标(metrics),因此组别是metric
。minimize
、maximize
,默认minimize
。使用goal
来表示该目标的优化方向,如正确率越高越好,即goal
需要配置为maximize
。配置loss:
target:
name:loss
配置评估指标中的Accuracy:
target:
group: metric
name: Accuracy
goal: maximize
配置超参信息
超参的配置字段:bounds
、choice
、type
和source
。这里配置的超参字段,会用于训练记录的提取和超参推荐。其中,bounds
、choice
和type
会影响超参推荐,bounds
配置了参数的上下界,choice
表示推荐值从中选取,type
则是配置了该参数的类型。
目前系统自定义收集的可调字段包括learning_rate
、batch_size
和epoch
。其余参数都为用户自定义参数,可配置为user_defined
,将在训练时被自动收集在训练日志中。
numpy.random.uniform()
。int
或float
。system_defined
或user_defined
。如果是自动收集的字段,默认为system_defined
;否则,默认为user_defined
。
bounds
和choice
有且仅有一个,必填。如果配置了choice
,仅会从choice
的列表中选取值;如果同时配置了choice
和type
,则type
不生效。
若用户要优化learning_rate
、batch_size
和momentum
这几个超参数,且优化目标是Accuracy
,则应按照如下示例配置yaml文件。
配置config.yaml
command: sh /home/example/run_alexnet_ascend.sh
summary_base_dir: /home/summaries
tuner:
name: gp
target:
group: metric
name: Accuracy
goal: maximize
parameters:
learning_rate:
bounds: [0.00001, 0.001]
type: float
batch_size:
choice: [32, 64, 128, 256]
type: int
momentum:
source: user_defined
choice: [0.8, 0.9]
type: float
momentum
和系统定义的变量不存在重名问题,可不设置source这个字段。
yaml配置同名字段会选取最后一个,请避免以下使用方式。
parameters:
learning_rate:
bounds: [0.0005, 0.001]
type: float
learning_rate:
source: user_defined
bounds: [0.00002, 0.0001]
type: float
在训练脚本实例化HyperConfig
对象
(1) 用户需要实例化HyperConfig
,并使用HyperConfig
实例的参数变量作为训练脚本中对应参数的取值。
(2) 加上SummaryCollector
来收集训练信息,包括超参和评估指标值等。
如Model Zoo中的训练脚本:
ds_train = create_dataset_cifar10(args.data_path, batch_size)
lr = Tensor(get_lr_cifar10(0, cfg.learning_rate, cfg.epoch_size, step_per_epoch))
opt = nn.Momentum(network.trainable_params(), lr, cfg.momentum)
model.train(cfg.epoch_size, ds_train, callbacks=[time_cb, ckpoint_cb, LossMonitor()]
修改后:
from mindinsight.optimizer import HyperConfig
config = HyperConfig()
params = config.params
# Replace batch_size with params.batch_size.
ds_train = create_dataset_cifar10(args.data_path, params.batch_size)
# Replace cfg.learning_rate with params.learning_rate.
lr = Tensor(get_lr_cifar10(0, params.learning_rate, cfg.epoch_size, step_per_epoch))
# Replace cfg.momentum with params.momentum.
opt = nn.Momentum(network.trainable_params(), lr, params.momentum)
# Instantiate SummaryCollector and add it to callback to automatically collect training information.
summary_cb = SummaryCollector(config.summary_dir)
model.train(cfg.epoch_size, ds_train, callbacks=[time_cb, ckpoint_cb, LossMonitor(), summary_cb]
运行
在进行自动调参前请确保训练脚本可以正确执行。
mindoptimizer --config ./config.yaml --iter 10
将执行训练的命令填写在配置文件中,在能够成功运行该训练命令的目录下运行mindoptimizer程序。
可视化
基于config.yaml里面配置的summary_base_dir来启动MindInsight,启动方法可以查看MindInsight启动命令。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。