

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Neptune ML 中自定义模型超参数配置
<a name="machine-learning-customizing-hyperparams"></a>

启动 Neptune ML 模型训练任务时，Neptune ML 会自动使用从之前的[数据处理](machine-learning-on-graphs-processing.md)任务中推理的信息。它使用这些信息生成超参数配置范围，这些范围用于创建 A [SageMaker I 超参数调整作业](https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-how-it-works.html)，为您的任务训练多个模型。这样，您就不必为要训练的模型指定一长串超参数值。相反，模型超参数范围和默认值是根据任务类型、图形类型和调整任务设置来选择的。

但是，也可以通过修改数据处理任务生成的 JSON 配置文件，来覆盖默认的超参数配置并提供自定义超参数。

使用 Neptune ML [modelTraining API](machine-learning-api-modeltraining.md)，您可以控制多个高级超参数调整任务设置，例如 `maxHPONumberOfTrainingJobs`、`maxHPOParallelTrainingJobs` 和 `trainingInstanceType`。要更精细地控制模型超参数，可以自定义数据处理任务生成的 `model-HPO-configuration.json` 文件。该文件保存在您为处理任务输出指定的 Amazon S3 位置。

您可以下载该文件，对其进行编辑以覆盖默认的超参数配置，然后将其上传回相同的 Amazon S3 位置。请勿更改文件名，编辑时请注意按照以下说明进行操作。

从 Amazon S3 下载该文件

```
aws s3 cp \
  s3://(bucket name)/(path to output folder)/model-HPO-configuration.json \
  ./
```

完成编辑后，将文件上传回原处：

```
aws s3 cp \
  model-HPO-configuration.json \
  s3://(bucket name)/(path to output folder)/model-HPO-configuration.json
```

## `model-HPO-configuration.json` 文件的结构
<a name="machine-learning-hyperparams-file-structure"></a>

`model-HPO-configuration.json` 文件指定了要训练的模型、机器学习 `task_type` 以及应在模型训练的不同运行中改变或固定的超参数。

超参数归类为属于不同的层，这些层表示调用超参数调整任务时赋予超参数的优先级：
+ 第 1 层超参数具有最高优先级。如果将 `maxHPONumberOfTrainingJobs` 设置为小于 10 的值，则只调整第 1 层超参数，其余超参数采用其默认值。
+ 第 2 层超参数的优先级较低，因此，如果调整任务的训练任务总数超过 10 但少于 50，则会调整第 1 层和第 2 层超参数。
+ 只有当训练任务总数超过 50 时，第 3 层超参数才会与第 1 层和第 2 层一起调整。
+ 最后，固定的超参数根本不会进行调整，并且始终采用其默认值。

### `model-HPO-configuration.json` 文件的示例
<a name="machine-learning-hyperparams-file-sample"></a>

下面是一个示例 `model-HPO-configuration.json` 文件。

```
{
  "models": [
    {
      "model": "rgcn",
      "task_type": "node_class",
      "eval_metric": {
        "metric": "acc"
      },
      "eval_frequency": {
          "type":  "evaluate_every_epoch",
          "value":  1
      },
      "1-tier-param": [
        {
            "param": "num-hidden",
            "range": [16, 128],
            "type": "int",
            "inc_strategy": "power2"
        },
        {
          "param": "num-epochs",
          "range": [3,30],
          "inc_strategy": "linear",
          "inc_val": 1,
          "type": "int",
          "node_strategy": "perM"
        },
        {
          "param": "lr",
          "range": [0.001,0.01],
          "type": "float",
          "inc_strategy": "log"
        }
      ],
      "2-tier-param": [
        {
          "param": "dropout",
          "range": [0.0,0.5],
          "inc_strategy": "linear",
          "type": "float",
          "default": 0.3
        },
        {
          "param": "layer-norm",
          "type": "bool",
          "default": true
        }
      ],
      "3-tier-param": [
        {
          "param": "batch-size",
          "range": [128, 4096],
          "inc_strategy": "power2",
          "type": "int",
          "default": 1024
        },
        {
          "param": "fanout",
          "type": "int",
          "options": [[10, 30],[15, 30], [15, 30]],
          "default": [10, 15, 15]
        },
        {
          "param": "num-layer",
          "range": [1, 3],
          "inc_strategy": "linear",
          "inc_val": 1,
          "type": "int",
          "default": 2
        },
        {
          "param": "num-bases",
          "range": [0, 8],
          "inc_strategy": "linear",
          "inc_val": 2,
          "type": "int",
          "default": 0
        }
      ],
      "fixed-param": [
        {
          "param": "concat-node-embed",
          "type": "bool",
          "default": true
        },
        {
          "param": "use-self-loop",
          "type": "bool",
          "default": true
        },
        {
          "param": "low-mem",
          "type": "bool",
          "default": true
        },
        {
          "param": "l2norm",
          "type": "float",
          "default": 0
        }
      ]
    }
  ]
}
```

### `model-HPO-configuration.json` 文件的元素
<a name="machine-learning-hyperparams-file-elements"></a>

该文件包含一个 JSON 对象，带有一个名为 `models` 的顶级数组，其中包含单个模型配置对象。自定义此文件时，请确保 `models` 数组中只有一个模型配置对象。如果文件包含多个模型配置对象，则调整任务将失败并显示警告。

模型配置对象包含以下顶级元素：
+ **`model`** –（*字符串*）要训练的模型类型（**请勿修改**）。有效值为：
  + `"rgcn"` – 这是节点分类和回归任务以及异构链接预测任务的默认设置。
  + `"transe"` – 这是 KGE 链接预测任务的默认设置。
  + `"distmult"` – 这是 KGE 链接预测任务的替代模型类型。
  + `"rotate"` – 这是 KGE 链接预测任务的替代模型类型。

  通常，不要直接修改 `model` 值，因为不同的模型类型通常具有明显不同的适用超参数，这可能会在启动训练任务后导致解析错误。

  要更改模型类型，请使用 [modelTraining API](machine-learning-api-modeltraining.md#machine-learning-api-modeltraining-create-job) 中的 `modelName` 参数，而不是在 `model-HPO-configuration.json` 文件中对其进行更改。

  更改模型类型并对超参数进行精细更改的一种方法是：复制要使用的模型的默认模型配置模板并将其粘贴到 `model-HPO-configuration.json` 文件中。如果推理的任务类型支持多个模型，那么在与 `model-HPO-configuration.json` 文件相同的 Amazon S3 位置中有一个名为 `hpo-configuration-templates` 的文件夹。此文件夹包含适用于该任务的其它模型的所有默认超参数配置。

  例如，如果要将 `KGE` 链接预测任务的模型和超参数配置从默认 `transe` 模型更改为 `distmult` 模型，只需将 `hpo-configuration-templates/distmult.json` 文件的内容粘贴到 `model-HPO-configuration.json` 文件中，然后根据需要编辑超参数即可。
**注意**  
如果您在 `modelTraining` API 中设置 `modelName` 参数，此外还更改 `model-HPO-configuration.json` 文件中的 `model` 和超参数规范，但它们不同，则 `model-HPO-configuration.json` 文件中的 `model` 值优先，`modelName` 值将被忽略。
+ **`task_type`** –（*字符串*）由数据处理任务推理或直接传递给数据处理任务的机器学习任务类型（**请勿修改**）。有效值为：
  + `"node_class"`
  + `"node_regression"`
  + `"link_prediction"`

  数据处理任务通过检查导出的数据集和生成的训练任务配置文件中的数据集属性来推理任务类型。

  不应更改该值。如果要训练其它任务，则需要[运行新的数据处理任务](machine-learning-on-graphs-processing.md)。如果 `task_type` 值不是您预期的值，则应检查数据处理任务的输入以确保它们正确无误。这包括 `modelTraining` API 的参数，以及数据导出过程生成的训练任务配置文件中的参数。
+ **`eval_metric`** –（*字符串*）评估指标应用来评估模型性能和选择在 HPO 运行中表现最佳的模型。有效值为：
  + `"acc"` – 标准分类精度。这是单标签分类任务的默认设置，除非在数据处理过程中发现不平衡的标签，在这种情况下，默认值为 `"F1"`。
  + `"acc_topk"`– 正确的标签出现在前 **`k`** 个预测中的次数。您也可以通过传入 `topk` 作为额外键来设置值 **`k`**。
  + `"F1"` – [F1 分数](https://en.wikipedia.org/wiki/F-score)。
  + `"mse"` – 回归任务的[均方误差指标](https://en.wikipedia.org/wiki/Mean_squared_error)。
  + `"mrr"` – [平均倒数排名指标](https://en.wikipedia.org/wiki/Mean_reciprocal_rank)。
  + `"precision"`– 模型查准率，计算方法为真阳性与预测阳性的比率：`= true-positives / (true-positives + false-positives)`。
  + `"recall"` – 模型查全率，计算方法为真阳性与实际阳性的比率：`= true-positives / (true-positives + false-negatives)`。
  + `"roc_auc"` – [ROC 曲线](https://en.wikipedia.org/wiki/Receiver_operating_characteristic)下方的区域。这是多标签分类的默认设置。

  例如，要将指标更改为 `F1`，请按如下方式更改 `eval_metric` 值：

  ```
  "  eval_metric": {
      "metric": "F1",
    },
  ```

  或者，要将指标更改为 `topk` 精度分数，您可以按以下方式更改 `eval_metric`：

  ```
    "eval_metric": {
      "metric": "acc_topk",
      "topk": 2
    },
  ```
+ **`eval_frequency`** –（*对象*）指定在训练期间应多久检查一次模型在验证集上的性能。根据验证性能，可以启动提前停止，并保存最佳模型。

  `eval_frequency` 对象包含两个元素，即 `"type"` 和 `"value"`。例如：

  ```
    "eval_frequency": {
      "type":  "evaluate_every_pct",
      "value":  0.1
    },
  ```

  有效的 `type` 值为：
  + **`evaluate_every_pct`** – 指定每次评估要完成的训练百分比。

    对于 `evaluate_every_pct`，`"value"` 字段包含一个介于零和一之间的浮点数，用于表示该百分比。

    
  + **`evaluate_every_batch`** – 指定每次评估要完成的训练批次数。

    对于 `evaluate_every_batch`，`"value"` 字段包含一个表示该批次计数的整数。
  + **`evaluate_every_epoch`** – 指定每次评估的纪元数，其中新纪元从午夜开始。

    对于 `evaluate_every_epoch`，`"value"` 字段包含一个表示该纪元计数的整数。

  `eval_frequency` 的默认设置是：

  ```
    "eval_frequency": {
      "type":  "evaluate_every_epoch",
      "value":  1
    },
  ```
+ **`1-tier-param`** –（*必需*）第 1 层超参数的数组。

  如果您不想调整任何超参数，则可以将其设置为空数组。这不会影响 SageMaker AI 超参数调整任务启动的训练作业总数。这只是意味着所有训练任务（如果大于 1 但小于 10）都将使用相同的超参数集运行。

  另一方面，如果您想以同等的重要性对待所有可调整的超参数，您可以将所有超参数放在这个数组中。
+ **`2-tier-param`** –（*必需*）第 2 层超参数的数组。

  仅当 `maxHPONumberOfTrainingJobs` 的值大于 10 时，才调整这些参数。否则，它们将固定为默认值。

  如果您的训练预算最多为 10 个训练任务，或者出于任何其它原因不想要第 2 层超参数，但您想调整所有可调整的超参数，则可以将其设置为空数组。
+ **`3-tier-param`** –（*必需*）第 3 层超参数的数组。

  仅当 `maxHPONumberOfTrainingJobs` 的值大于 50 时，才调整这些参数。否则，它们将固定为默认值。

  如果您不想要第 3 层超参数，可以将其设置为空数组。
+ **`fixed-param`** –（*必需*）固定超参数的数组，这些超参数仅采用其默认值，且在不同的训练任务中没有变化。

  如果您想改变所有超参数，您可以将其设置为一个空数组，然后将 `maxHPONumberOfTrainingJobs` 的值设置为足够大以改变所有层，或者使所有超参数成为第 1 层。

表示 `1-tier-param`、`2-tier-param`、`3-tier-param` 和 `fixed-param` 中每个超参数的 JSON 对象包含以下元素：
+ **`param`** –（*字符串*）超参数的名称（**请勿更改**）。

  请参阅 [Neptune ML 中的有效超参数名称列表](#machine-learning-hyperparams-list)。
+ **`type`** –（*字符串*）超参数类型（**请勿更改**）。

  有效类型为：`bool`、`int` 和 `float`。
+ **`default`** –（*字符串*）超参数的默认值。

  您可以设置新的默认值。

可调整超参数也可以包含以下元素：
+ **`range`** –（*数组*）连续可调整超参数的范围。

  这应该是一个包含两个值的数组，即范围的最小值和最大值 (`[min, max]`)。
+ **`options`** –（*数组*）分类可调整超参数的选项。

  此数组应包含所有需要考虑的选项：

  ```
    "options" : [value1, value2, ... valuen]
  ```
+ **`inc_strategy`** –（*字符串*）连续可调整超参数范围的增量更改的类型（**请勿更改**）。

  有效值包括 `log`、`linear` 和 `power2`。仅当设置范围键时适用。

  修改此设置可能会导致无法使用超参数的完整范围进行调整。
+ **`inc_val`** –（*浮点数*）连续可调整超参数的连续增量差异量（**请勿更改**）。

  仅当设置范围键时适用。

  修改此设置可能会导致无法使用超参数的完整范围进行调整。
+ **`node_strategy`** –（*字符串*）表示此超参数的有效范围应根据图形中的节点数而变化（**请勿更改**）。

  有效值为 `"perM"`（每百万）、`"per10M"`（每千万）和 `"per100M"`（每 1 亿）。

  不更改此值，而应更改 `range`。
+ **`edge_strategy`** –（*字符串*）表示此超参数的有效范围应根据图形中的边缘数而变化（**请勿更改**）。

  有效值为 `"perM"`（每百万）、`"per10M"`（每千万）和 `"per100M"`（每 1 亿）。

  不更改此值，而应更改 `range`。

### Neptune ML 中所有超参数的列表
<a name="machine-learning-hyperparams-list"></a>

以下列表包含可以在 Neptune ML 中的任何位置为任何模型类型和任务设置的所有超参数。由于它们并非全部适用于每种模型类型，因此务必仅在所用模型的模板中出现的 `model-HPO-configuration.json` 文件中设置超参数。
+ **`batch-size`** – 一次向前传递中使用的目标节点批次的大小。*类型*：`int`。

  将其设置为更大的值可能会导致在 GPU 实例上进行训练时出现内存问题。
+ **`concat-node-embed`** – 指示是否通过将节点的处理后特征与可学习的初始节点嵌入相连接来获得节点的初始表示形式，以改善模型的表现力。*类型*：`bool`。
+ **`dropout`** – 应用于丢弃层的丢弃概率。*类型*：`float`。

  
+ **`edge-num-hidden`**– 边缘特征模块的隐藏层大小或单位数量。仅在 `use-edge-features` 设置为 `True` 时使用。*类型*：浮点数。
+ **`enable-early-stop`** – 切换是否使用提前停止特征。*类型*：`bool`。*默认值*：`true`。

  使用此布尔参数可关闭提前停止特征。
+ **`fanout`** – 在邻居采样期间要为目标节点采样的邻居数量。*类型*：`int`。

  此值与 `num-layers` 紧密耦合，应始终位于同一个超参数层中。这是因为您可以为每个潜在的 GNN 层指定扇出。

  由于此超参数可能导致模型性能变化很大，因此应将其固定或设置为第 2 层或第 3 层超参数。将其设置为较大的值可能会导致在 GPU 实例上训练时出现内存问题。
+ **`gamma`** – 分数函数中的边距值。*类型*：`float`。

  这仅适用于 `KGE` 链接预测模型。
+ **`l2norm`** – 优化程序中使用的权重衰减值，该值对权重施加 L2 规范化惩罚。*类型*：`bool`。
+ **`layer-norm`** – 表示是否对 `rgcn` 模型使用层规范化。*类型*：`bool`。
+ **`low-mem`** – 指示是否以牺牲速度为代价使用关系消息传递函数的低内存实现。*类型*：`bool`。

  
+ **`lr`** – 学习率。*类型*：`float`。

  应将其设置为第 1 层超参数。
+ **`neg-share`** – 在链接预测中，表示正采样的边缘是否可以共享负边缘样本。*类型*：`bool`。
+ **`num-bases`** – `rgcn` 模型中用于基本分解的基数。使用小于图形中边缘类型数量的 `num-bases` 值可以作为 `rgcn` 模型的正则化项。*类型*：`int`。
+ **`num-epochs`** – 要运行的训练纪元数。*类型*：`int`。

  纪元是通过图形的完整训练过程。
+ **`num-hidden`** – 隐藏的层大小或单位数量。*类型*：`int`。

  这还会设置无特征节点的初始嵌入大小。

  将此值设置为更大的值而不减小`batch-size`可能会导致在 GPU 实例上进行训练时出现 out-of-memory问题。
+ **`num-layer`** – 模型中 GNN 层的数量。*类型*：`int`。

  该值与扇出参数紧密耦合，应在同一个超参数层中设置扇出之后出现。

  由于这可能导致模型性能变化很大，因此应将其固定或设置为第 2 层或第 3 层超参数。
+ **`num-negs`** – 在链接预测中，每个正样本的负样本数。*类型*：`int`。
+ **`per-feat-name-embed`** – 表示是否在组合特征之前通过单独转换每个特征来嵌入每个特征。*类型*：`bool`。

  如果设置为 `true`，则每个节点的每个特征都将独立转换为固定的维度大小，然后将该节点的所有已转换特征串联起来，并进一步转换为 `num_hidden` 维度。

  如果设置为 `false`，则在不进行任何特定于特征的转换的情况下串联特征。
+ **`regularization-coef`** – 在链接预测中，正则化损失的系数。*类型*：`float`。
+ **`rel-part`** – 表示是否使用关系分区进行 `KGE` 链接预测。*类型*：`bool`。
+ **`sparse-lr`** – 可学习节点嵌入的学习率。*类型*：`float`。

  可学习的初始节点嵌入用于没有特征或设置 `concat-node-embed` 时的节点。稀疏可学习节点嵌入层的参数使用单独的优化程序进行训练，该优化程序可以具有单独的学习速率。
+ **`use-class-weight`** – 表示是否对不平衡的分类任务应用类别权重。如果设置为 `true`，则使用标签计数为每个类别标签设置权重。*类型*：`bool`。
+ **`use-edge-features`** – 表示在消息传递过程中是否使用边缘特征。如果设置为 `true`，则将为具有特征的边缘类型向 RGCN 层添加自定义边缘特征模块。*类型*：`bool`。
+ **`use-self-loop`**– 表示是否在训练 `rgcn` 模型时包含自循环。*类型*：`bool`。
+ **`window-for-early-stop`** – 控制最新验证分数的平均值，以决定是否提前停止。默认值为 3。类型 = int。另请参阅[在 Neptune ML 中提前停止模型训练过程](machine-learning-improve-model-performance.md#machine-learning-model-training-early-stop)。*类型*：`int`。*默认值*：`3`。

  请参阅。

## 在 Neptune ML 中自定义超参数
<a name="machine-learning-hyperparams-editing"></a>

编辑 `model-HPO-configuration.json` 文件时，以下是最常见的更改类型：
+ 编辑`range`超参数 and/or 的最小最大值。
+ 通过将超参数移到 `fixed-param` 部分并将其默认值设置为您想要的固定值，将其设置为固定值。
+ 更改超参数的优先级，方法是将其置于特定层，编辑其范围，并确保正确设置其默认值。