跳到内容

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 分割,但您也可以灵活地指定 traintest 分割。
  • parameters 部分包含一组要优化的超参数。它们以键(参数名称)和与之关联的值(定义搜索空间)的形式提供。值根据超参数类型而异。此部分的语法基于 Ray Tune 的搜索空间参数
  • search_alg 部分指定用于对定义的 parameters 空间进行采样的算法。候选算法可在 Ray Tune 的搜索算法 中找到。
  • executor 部分指定如何执行超参数优化。执行可以在本地串行进行,也可以在多个工作节点上并行进行,如果可用,还可以使用 GPU。executor 部分包括工作调度和要生成的样本数量的规范。

定义超参数搜索空间

parameters 部分,超参数名称使用点 (.) 分隔。超参数名称中由 . 分隔的部分是 Ludwig 配置中嵌套部分的引用。例如,要引用 trainer 部分的 learning_rate,可以使用名称 trainer.learning_rate。如果引用的参数在输入或输出特征内部,则该特征的名称将用作起点。例如,要引用 title 特征的 encodercell_type,请使用名称 title.encoder.cell_type

数值超参数

  • space:使用 Ray Tune 的搜索空间 类型,例如 uniformquniformloguniformchoice 等。详细信息请参阅引用的页面。

对于数值 space,它们定义了生成值的范围

  • lower:参数可以具有的最小值
  • upper:参数可以具有的最大值
  • q:量化数,用于 space,例如 quniformqloguniformqrandnqrandintqlograndint
  • base:定义 loguniformqloguniformlograndintqlograndint 的对数底

注意

根据具体的数值 spaceupper 参数可能包含或排除边界值。有关具体分布的详细信息,请参阅 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]

网格中的超参数

对于 spacegrid_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 规范(例如 uniformrandnchoice 等),则试验次数将为 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 个具有 uniformrandint 空间的超参数。当 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 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}}}"