跳到内容

超参数优化

Ludwig 支持使用 Ray Tune 或本地执行器进行超参数优化。

超参数优化策略在 Ludwig 配置中指定,并使用 ludwig hyperopt 命令运行。配置中的每个参数都可以使用超参数优化进行调优。

超参数优化配置

Ludwig 配置中的大多数参数或嵌套参数都可以进行优化,包括 input_features(输入特征)、output_features(输出特征)、combiner(组合器)、preprocessing(预处理)、trainer(训练器)和 defaults(默认值)。支持的类型有 float(浮点型)、int(整型)和 category(类别型)。

要启用超参数优化,请在 config.yaml 的顶层添加 hyperopt 字典。hyperopt 部分声明要优化的参数、搜索策略和优化目标。

config.yaml
hyperopt:
  parameters:
    title.num_filters:
      space: choice
      categories: [128, 256, 512]
    training.learning_rate:
      space: loguniform
      lower: 0.0001
      upper: 0.1
    combiner.num_fc_layers:
      space: randint
      lower: 2
      upper: 6
  goal: minimize
  metric: loss

默认超参数优化参数

除了为单个输入或输出特征(如上面示例中的 title 特征)定义超参数优化参数外,还可以为整个特征类型指定默认参数(例如,用于数据集中所有文本特征的编码器)。这些参数将遵循与 Ludwig 配置的 defaults section(默认值部分)相同的约定。这在数据集具有大量特征且您不想为每个特征单独定义参数的情况下特别有用。

默认超参数优化参数按顺序使用以下由 . 分隔的关键字定义

  • defaults: 用于指示特征级别参数的默认关键字
  • feature_type: Ludwig 支持的任何输入或输出特征类型。可以是文本、数值、类别等。请参阅支持的特征类型完整列表 此处
  • subsection: preprocessing(预处理)、encoder(编码器)、decoder(解码器)或 loss(损失),这是可以通过 Ludwig 默认值部分修改的 4 个部分之一
  • parameter: 属于 subsection 的有效参数。例如,most_commontext 特征类型 preprocessing 子部分的有效参数。

对于每次超参数优化试验,将从参数空间中采样一个值,并将其应用于该特征类型的输入特征(与 preprocessingencoder 相关的参数)或输出特征(与 decoderloss 相关的参数)。此外,如果为单个特征定义的参数(如 title.preprocessing.most_common)与默认参数(如 defaults.text.preprocessing.most_common)共享相同的特征类型和参数,并且两个参数都在 Ludwig 超参数优化配置中定义,则前者将优先于后者。

config.yaml
...
hyperopt:
  parameters:
    title.num_filters:
      space: choice
      categories: [128, 256, 512]
    defaults.text.preprocessing.most_common:
      space: choice
      categories: [100, 500, 1000]
  goal: minimize
  metric: loss
...

在本例中,defaults.text.preprocessing.most_common 是一个默认参数。这里

  • defaults 用于表示一个默认超参数优化参数
  • text 指的是文本输入特征组,因为它是一个与 preprocessing 相关的参数
  • preprocessing 指的是 Ludwig 默认值部分中的文本预处理子部分。这意味着此参数将修改所有文本输入特征的预处理
  • most_commonpreprocessing 中我们想要修改所有文本输入特征的参数

嵌套的 Ludwig 配置参数

Ludwig 还扩展了超参数优化参数的范围,以支持由部分或完整的 Ludwig 配置节块组成的参数选择。这允许用户在一个 Ludwig 配置集上进行搜索,而不是需要单独指定配置参数并在所有参数组合上进行搜索。

要提供代表 Ludwig 配置子部分的参数,可以使用 . 键名。

例如,可以定义如下所示的超参数优化搜索空间,并采样部分 Ludwig 配置

hyperopt:
    parameters:
        .:  space: choice
            categories: 
                -   combiner: # Ludwig config subsection 1
                        type: tabnet
                    trainer:
                        learning_rate: 0.001
                        batch_size: 64
                -   combiner: # Ludwig config subsection 2
                        type: concat
                    trainer:
                        batch_size: 256
        trainer.decay_rate:
            space: loguniform
            lower: 0.001
            upper: 0.1

. 参数定义了具有两个选择的嵌套超参数优化参数。将对这些选择进行采样,并根据选择哪个选择来更新每次试验的 Ludwig 配置。

上述配置将创建如下所示的超参数优化样本

# Trial 1
  combiner:
    type: tabnet
  trainer: 
  learning_rate: 0.001
  batch_size: 64
  decay_rate: 0.02

# Trial 2
  combiner:
    type: tabnet
  trainer: 
    learning_rate: 0.001
    batch_size: 64
    decay_rate: 0.001

# Trial 3
  combiner:
    type: concat
  trainer: 
    batch_size: 64
    decay_rate: 0.001

运行超参数优化

使用 ludwig hyperopt 命令运行超参数优化。

ludwig hyperopt --dataset reuters-allcats.csv --config hyperopt_config.yaml

有关超参数搜索和执行选项的完整参考,请参阅 Ludwig 配置指南的超参数优化页面。