Hyperopt
Ludwig 配置中的 hyperopt
部分定义了要优化的指标、要优化的参数、搜索策略和执行策略。
hyperopt:
goal: minimize
output_feature: combined
metric: loss
split: validation
parameters:
title.encoder.cell_type: ... # title is a text feature type
title.encoder.num_layers: ...
combiner.num_fc_layers: ...
section.encoder.embedding_size: ...
preprocessing.text.vocab_size: ...
trainer.learning_rate: ...
trainer.optimizer.type: ...
...
search_alg:
type: variant_generator # random, hyperopt, bohb, ...
# search_alg parameters...
executor:
type: ray
num_samples: ...
scheduler:
type: fifo # hb_bohb, asynchyperband, ...
# scheduler parameters...
Hyperopt 配置参数¶
goal
指示是最小化还是最大化任何输出特征在任何数据集分割上的指标或损失。可用值为:minimize
(默认)或maximize
。output_feature
是一个str
,包含我们想要优化其指标或损失的输出特征的名称。可用值为combined
(默认)或配置中提供的任何输出特征的名称。combined
是一个特殊的输出特征,允许优化所有输出特征的聚合损失和指标。metric
是我们想要优化的指标。默认是loss
,但根据output_feature
中定义的特征类型,有不同的指标和损失可用。请查阅特定输出特征类型的指标部分,了解有哪些指标可用。split
是我们想要计算指标的数据分割。默认是validation
分割,但您也可以灵活地指定train
或test
分割。parameters
部分包含一组要优化的超参数。它们以键(参数名称)和与之关联的值(定义搜索空间)的形式提供。值根据超参数类型而异。此部分的语法基于 Ray Tune 的搜索空间参数。search_alg
部分指定用于对定义的parameters
空间进行采样的算法。候选算法可在 Ray Tune 的搜索算法 中找到。executor
部分指定如何执行超参数优化。执行可以在本地串行进行,也可以在多个工作节点上并行进行,如果可用,还可以使用 GPU。executor
部分包括工作调度和要生成的样本数量的规范。
定义超参数搜索空间¶
在 parameters
部分,超参数名称使用点 (.
) 分隔。超参数名称中由 .
分隔的部分是 Ludwig 配置中嵌套部分的引用。例如,要引用 trainer
部分的 learning_rate
,可以使用名称 trainer.learning_rate
。如果引用的参数在输入或输出特征内部,则该特征的名称将用作起点。例如,要引用 title
特征的 encoder
的 cell_type
,请使用名称 title.encoder.cell_type
。
数值超参数¶
space
:使用 Ray Tune 的搜索空间 类型,例如uniform
、quniform
、loguniform
、choice
等。详细信息请参阅引用的页面。
对于数值 space
,它们定义了生成值的范围
lower
:参数可以具有的最小值upper
:参数可以具有的最大值q
:量化数,用于space
,例如quniform
、qloguniform
、qrandn
、qrandint
、qlograndint
base
:定义loguniform
、qloguniform
、lograndint
和qlograndint
的对数底
注意
根据具体的数值 space
,upper
参数可能包含或排除边界值。有关具体分布的详细信息,请参阅 Ray Tune 文档。
浮点数示例:在 0.001 和 0.1 之间均匀分布的浮点随机值(在对数空间)
trainer.learning_rate:
space: loguniform
lower: 0.001
upper: 0.1
整数示例:均匀分布的随机整数值 1、2、3
combiner.num_fc_layers:
space: randint
lower: 1
upper: 4
量化示例:均匀分布的浮点随机值,例如 0、0.1、0.2、...、0.9
my_output_feature.decoder.dropout:
space: quniform
lower: 0
upper: 1
q: 0.1
类别超参数¶
space
:使用choice
。categories
:可能值的列表。列表中每个值的类型是通用的,即它们可以是字符串、整数、浮点数以及其他任何类型,甚至是整个字典。这些值将进行均匀随机选择。
示例
title.encoder.cell_type:
space: choice
categories: [rnn, gru, lstm]
网格中的超参数¶
对于 space
:grid_search
values
:用于创建网格搜索空间的数值列表。列表中每个值的类型是通用的,即它们可以是字符串、整数、浮点数以及其他任何类型,甚至是整个字典。
示例
title.encoder.cell_type:
space: grid_search
values: [rnn, gru, lstm]
更全面的示例¶
hyperopt:
parameters:
trainer.learning_rate:
space: loguniform
lower: 0.001
upper: 0.1
combiner.num_fc_layers:
space: randint
lower: 2
upper: 6
title.encoder.cell_type:
space: grid_search
values: ["rnn", "gru"]
title.encoder.bidirectional:
space: choice
categories: [True, False]
title.encoder.fc_layers:
space: choice
categories:
- [{"output_size": 512}, {"output_size": 256}]
- [{"output_size": 512}]
- [{"output_size": 256}]
默认 Hyperopt 参数¶
除了为单个输入或输出特征(如上面示例中的 title
特征)定义 hyperopt 参数外,还可以为整个特征类型指定默认参数(例如,用于数据集中所有文本特征的编码器)。在此处阅读更多关于默认 hyperopt 参数的信息 这里。
嵌套 Ludwig 配置参数¶
Ludwig 还允许从 hyperopt 搜索空间中采样部分或完整的 Ludwig 配置。在此处阅读更多关于嵌套 Ludwig 配置参数的信息 这里。
搜索算法¶
Ray Tune 支持其自己的 搜索算法 集合,通过 hyperopt 配置的 search_alg
部分指定
search_alg:
type: variant_generator
您可以在 Ray Tune 的 create_searcher 函数中找到支持的搜索算法完整列表。请注意,这些算法需要安装额外的包。截至当前版本的 Ludwig,Ludwig 安装了搜索算法 hyperopt
的包。对于所有其他搜索算法,用户需要自行安装所需的包。
执行器¶
Ray Tune 执行器¶
ray
执行器用于启用 Ray Tune,以在机器集群上进行本地和分布式 hyperopt。
参数
-
num_samples
:此参数以及parameters
部分中的space
规范,控制生成多少个试验 (默认值: 1)。注意
- 如果
parameters
部分中的所有超参数都具有非grid_search
规范(例如uniform
、randn
、choice
等),则试验次数将为num_samples
。 - 如果所有超参数都具有
grid_search
,则试验次数将是为每个超参数指定的值数量的乘积。在这种情况下,num_samples
应设置为 1。例如,如果有三个grid_search
超参数,它们分别有 2、4 和 4 个值。试验次数将为 2 X 4 X 4 = 32,其中每个试验都是三个grid_search
超参数值的唯一组合。 - 如果存在
grid_search
和非grid_search
空间的混合,则试验次数将是为每个grid_search
超参数指定的值数量的乘积乘以num_samples
的值。为了说明这一点,我们采用前一个项目符号中描述的三个grid_search
超参数,并添加 2 个具有uniform
和randint
空间的超参数。当num_samples = 10
时,对于来自grid_search
超参数的每个唯一值组合,将生成 10 个试验,并为 `uniform` 和 `randint` 超参数选择随机值。这将导致总共 32 X 10 = 320 个试验。
- 如果
-
cpu_resources_per_trial
:分配给每个试验的 CPU 核数 (默认值: 1)。 gpu_resources_per_trial
:分配给每个试验的 GPU 设备数 (默认值: 0)。kubernetes_namespace
:在 Kubernetes 上运行时,提供 Ray 集群的命名空间,以便在 Pod 之间同步结果。有关更多信息,请参阅 Ray 文档。time_budget_s
:整个 hyperopt 运行的时间(秒)。-
max_concurrent_trials
:同时训练的最大试验次数。如果未指定,则默认为auto
。注意
- 如果您使用 Ray 后端,
auto
将根据您的集群配置推断可设置的最大并发试验次数,以防止试验停滞。 - 如果您使用 Local 或 Horovod 后端,
auto
将把 max_concurrent_trials 设置为 None。
- 如果您使用 Ray 后端,
调度器¶
Ray Tune 还允许您指定一个 调度器,以支持早期停止和其他可能在训练期间暂停和恢复试验的基于群体的策略等功能。Ludwig 在 executor
配置的 scheduler
部分公开了完整的调度器 API。
您可以在 Ray Tune 的 create_scheduler 函数中找到支持的调度器完整列表。
示例
executor:
type: ray
cpu_resources_per_trial: 2
gpu_resources_per_trial: 1
kubernetes_namespace: ray
time_budget_s: 7200
scheduler:
type: async_hyperband
time_attr: training_iteration
reduction_factor: 4
运行 Ray 执行器
有关设置 Ray 集群的指导,请参阅 使用 Ray 运行 Ludwig 部分。
完整的超参数优化示例¶
以下是一个带有超参数优化的完整 Ludwig 配置示例。
YAML 示例
input_features:
-
name: title
type: text
encoder:
type: rnn
cell_type: lstm
num_layers: 2
combiner:
type: concat
num_fc_layers: 1
output_features:
-
name: class
type: category
defaults:
text:
preprocessing:
word_vocab_size: 10000
trainer:
learning_rate: 0.001
optimizer:
type: adam
hyperopt:
goal: maximize
output_feature: class
metric: accuracy
split: validation
parameters:
trainer.learning_rate:
space: loguniform
lower: 0.0001
upper: 0.1
trainer.optimizer.type:
space: choice
categories: [sgd, adam, adagrad]
preprocessing.text.word_vocab_size:
space: qrandint
lower: 700
upper: 1200
q: 5
combiner.num_fc_layers:
space: randint
lower: 1
upper: 5
title.encoder.cell_type:
space: choice
values: [rnn, gru, lstm]
search_alg:
type: random
executor:
type: ray
num_samples: 12
命令行示例
ludwig hyperopt --dataset reuters-allcats.csv --config_str "{input_features: [{name: title, type: text, encoder: {type: rnn, cell_type: lstm, num_layers: 2}}], output_features: [{name: class, type: category}], trainer: {learning_rate: 0.001}, hyperopt: {goal: maximize, output_feature: class, metric: accuracy, split: validation, parameters: {trainer.learning_rate: {space: loguniform, lower: 0.0001, upper: 0.1}, title.encoder.cell_type: {space: choice, categories: [rnn, gru, lstm]}}, search_alg: {type: variant_generator},executor: {type: ray, num_samples: 10}}}"