

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Neptune ML を使用したモデルのトレーニング
<a name="machine-learning-on-graphs-model-training"></a>

モデルトレーニングのために Neptune からエクスポートするデータを処理した後、次のように `curl` (または `awscurl`) コマンドを使用してモデルトレーニングジョブを開始できます。

```
curl \
  -X POST https://(your Neptune endpoint)/ml/modeltraining
  -H 'Content-Type: application/json' \
  -d '{
        "id" : "(a unique model-training job ID)",
        "dataProcessingJobId" : "(the data-processing job-id of a completed job)",
        "trainModelS3Location" : "s3://(your Amazon S3 bucket)/neptune-model-graph-autotrainer"
      }'
```

このコマンドの使用方法の詳細については、[モデルトレーニングコマンド](machine-learning-api-modeltraining.md) を参照してください。また、実行中のジョブのステータスの取得方法、実行中のジョブの停止方法、実行中のすべてのジョブの一覧表示方法について説明する情報も併せてご確認ください。

完了した Neptune ML モデルトレーニングジョブの情報を使用して、新しいトレーニングジョブでハイパーパラメータ検索を高速化するために `previousModelTrainingJobId` を指定することもできます。これは、[新しいグラフデータのモデルの再トレーニング](machine-learning-overview-evolving-data-incremental.md#machine-learning-overview-model-retraining)であり、[同じグラフデータに対するインクリメンタルトレーニング](machine-learning-overview-evolving-data-incremental.md#machine-learning-overview-incremental)でもあります。次のようなコマンドを使用します。

```
curl \
  -X POST https://(your Neptune endpoint)/ml/modeltraining
  -H 'Content-Type: application/json' \
  -d '{
        "id" : "(a unique model-training job ID)",
        "dataProcessingJobId" : "(the data-processing job-id of a completed job)",
        "trainModelS3Location" : "s3://(your Amazon S3 bucket)/neptune-model-graph-autotrainer"
        "previousModelTrainingJobId" : "(the model-training job-id of a completed job)"
      }'
```

Neptune ML トレーニングインフラストラクチャで、次のように `customModelTrainingParameters` オブジェクトを指定して独自のモデル実装をトレーニングできます。

```
curl \
  -X POST https://(your Neptune endpoint)/ml/modeltraining
  -H 'Content-Type: application/json' \
  -d '{
        "id" : "(a unique model-training job ID)",
        "dataProcessingJobId" : "(the data-processing job-id of a completed job)",
        "trainModelS3Location" : "s3://(your Amazon S3 bucket)/neptune-model-graph-autotrainer"
        "modelName": "custom",
        "customModelTrainingParameters" : {
          "sourceS3DirectoryPath": "s3://(your Amazon S3 bucket)/(path to your Python module)",
          "trainingEntryPointScript": "(your training script entry-point name in the Python module)",
          "transformEntryPointScript": "(your transform script entry-point name in the Python module)"
        }
      }'
```



実行中のジョブのステータスの取得方法、実行中のジョブの停止方法、実行中のすべてのジョブの一覧表示方法などの詳細については、[モデルトレーニングコマンド](machine-learning-api-modeltraining.md) を参照してください。カスタムモデルの実装と使用方法の詳細については、[Neptune ML のカスタムモデル](machine-learning-custom-models.md) を参照してください。

**Topics**
+ [Amazon Neptune ML でのモデルとモデルトレーニング](machine-learning-models-and-training.md)
+ [Neptune ML でのモデルのハイパーパラメータ設定のカスタマイズ](machine-learning-customizing-hyperparams.md)
+ [モデルトレーニングのベストプラクティス](machine-learning-improve-model-performance.md)

# Amazon Neptune ML でのモデルとモデルトレーニング
<a name="machine-learning-models-and-training"></a>

Neptune ML は、グラフニューラルネットワーク (GNN) を使用して、さまざまな機械学習タスクのモデルを作成します。グラフニューラルネットワークは、グラフ機械学習タスクに関する最先端の結果を得るため、グラフ構造化データから情報パターンを抽出するのに優れています。

## Neptune ML のグラフニューラルネットワーク (GNN)
<a name="machine-learning-gnns"></a>

グラフニューラルネットワーク (GNN) は、近傍のノードの構造と特徴を考慮してノード表現を計算するニューラルネットワークのファミリーに属します。GNN は、グラフデータには適していない他の従来の機械学習とニューラルネットワーク手法を補完します。

GNN は、ノード分類とリグレッション (ノードの特性の予測)、エッジ分類とリグレッション (エッジの特性の予測) やリンク予測 (グラフ内の 2 つのノードを接続すべきかどうかを予測) などの機械学習タスクを実行するために使用されます。

一般に、GNN を機械学習タスクに使用するには、次の 2 つの段階があります。
+ 符号化段階。GNN がグラフ内の各ノードの d 次元ベクトルを計算します。これらのベクトルは、*表現*または*埋め込み*です。
+ 符号化された表現に基づいて予測を行う復号化ステージ。

ノードの分類とリグレッションでは、ノード表現が分類およびリグレッションタスクに直接使用されます。エッジ分類とリグレッションでは、エッジ上のインシデントノードのノード表現が分類またはリグレッションの入力として使用されます。リンク予測の場合、エッジ尤度スコアは、ノード表現とエッジタイプ表現のペアを使用して計算されます。

[ディープグラフライブラリ (DGL)](https://www.dgl.ai/) は、これらのタスクの GNN の効率的な定義とトレーニングを容易にします。

メッセージパッシングの定式化の下で異なる GNN モデルが統一されます。このビューでは、グラフ内のノードの表現は、ノードの近傍の表現 (メッセージ) とノードの初期表現を使用して計算されます。NeptuneML では、ノードの初期表現は、ノードのプロパティから抽出された特徴から導出されるか、または学習可能であり、ノードのアイデンティティに依存します。

Neptune ML には、ノード特徴と学習可能なノード表現を連結して、元のノード表現として機能するオプションも用意されています。

ノードプロパティを持つグラフを含む Neptune ML のさまざまなタスクについては、[リレーショナルグラフ畳み込みネットワーク](https://arxiv.org/abs/1703.06103) (R-GCN)) で符号化段階を行います。R-GCN は、複数のノードタイプとエッジタイプを持つグラフに適した GNN アーキテクチャです (これらは異種グラフと呼ばれます)。

R-GCN ネットワークは固定数のレイヤーで構成され、次々に積み重ねられます。R-GCN の各レイヤーは、学習可能なモデルパラメータを使用して、ノードの直近 1 ホップ近傍からの情報を集約します。後続のレイヤーは前のレイヤーの出力表現を入力として使用するため、ノードの最終的な埋め込みに影響するグラフ近傍の半径は、R-GCN ネットワークのレイヤーの数 (`num-layer`) によって異なります。

たとえば、これは、2 層ネットワークが 2 ホップ離れたノードからの情報を使用することを意味します。

GNN の詳細については、[グラフニューラルネットワークに関する包括的な調査](https://arxiv.org/abs/1901.00596)を参照してください。Deep Graph Library (DGL) の詳細については、DGL [ウェブページ](https://www.dgl.ai/)を参照してください。DGL での GNN の使用に関する実践的なチュートリアルについては、[ディープグラフライブラリを使用したグラフニューラルネットワークの学習](https://www.amazon.science/videos-webinars/learning-graph-neural-networks-with-deep-graph-library)を参照してください。

## トレーニンググラフニューラルネットワーク
<a name="machine-learning-gnn-training"></a>

機械学習では、タスクに対して適切な予測を行う方法を学ぶためにモデルを取得するプロセスをモデルトレーニングと呼びます。これは、通常、最適化する具体的な目的と、この最適化を実行するために使用するアルゴリズムを指定することによって実行されます。

このプロセスは、下流のタスクに対する適切な表現を学ぶための GNN のトレーニングにも使用されます。モデルトレーニング中に最小化される、そのタスクの目的関数を作成します。たとえば、ノード分類の場合、[CrossentropyLoss](https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html) を目標とし、誤分類にペナルティを科し、ノードリグレッションでは [SquareError](https://pytorch.org/docs/stable/generated/torch.nn.MSELoss.html) を最小限に抑えます。

目的は通常、特定のデータポイントのモデル予測を取得し、そのデータポイントのグラウンドトゥルース値と比較する損失関数です。これは、モデルの予測がどれくらい離れているかを示す損失値を返します。トレーニングプロセスの目標は、損失を最小限に抑え、モデルの予測がグラウンドトゥルースに近いことを確認することです。

トレーニングプロセスのディープラーニングで使用される最適化アルゴリズムは、通常、勾配降下の一種です。Neptune MLでは、[Adam](https://arxiv.org/pdf/1412.6980.pdf) を使用します。これは、低次モーメントの適応的推定に基づいて、確率的目的関数を一次勾配に基づいて最適化するアルゴリズムです。

モデルトレーニングプロセスでは、学習したモデルパラメータが目的関数の最小値に近いことを確認しようとしますが、モデルの全体的なパフォーマンスは、モデルの*ハイパーパラメータ*に依存し、これは、トレーニングアルゴリズムで学習されないモデル設定です。たとえば、学習したノード表現、`num-hidden`、の次元性は、モデルのパフォーマンスに影響するハイパーパラメータです。したがって、機械学習では、ハイパーパラメータ最適化 (HPO) を実行して適切なハイパーパラメータを選択することが一般的です。

Neptune ML は SageMaker AI ハイパーパラメータチューニングジョブを使用して、さまざまなハイパーパラメータ構成によりモデルトレーニングの複数のインスタンスを起動し、ハイパーパラメータ設定範囲に最適なモデルを見つけようとします。「[Neptune ML でのモデルのハイパーパラメータ設定のカスタマイズ](machine-learning-customizing-hyperparams.md)」を参照してください。

## Neptune ML にモデルを埋め込むナレッジグラフ
<a name="machine-learning-kg-embedding"></a>

ナレッジグラフ (KG) は、異なるエンティティ (ノード) とその関係 (エッジ) に関する情報をエンコードするグラフです。Neptune ML では、グラフにノードプロパティが含まれず、他のノードとの関係のみが含まれている場合に、リンク予測を実行するためにデフォルトでナレッジグラフ埋め込みモデルが適用されます。ただし、学習可能な埋め込みを持つ R-GCN モデルは、モデル型を `"rgcn"` のように指定することで、これらのグラフにも使用できます。一方、知識グラフ埋め込みモデルはより単純であり、大規模な知識グラフの表現を学ぶのに有効になるように設計されています。

ナレッジグラフ埋め込みモデルは、リンク予測タスクで使用され、`h` が始点ノードであり、`r` がリレーションタイプ、`t` が終点ノードであるトリプル `(h, r, t)` を完了するノードまたはリレーションを予測します。

Neptune MLで実装されたナレッジグラフ埋め込みモデルは `distmult`、`transE` および `rotatE` です。ナレッジグラフの埋め込みモデルの詳細については、[「DGL-KE」](https://github.com/awslabs/dgl-ke)を参照してください。

## Neptune ML のカスタムモデルのトレーニング
<a name="machine-learning-training-custom-models"></a>

Neptune ML では、特定のシナリオに対して、独自のカスタムモデルを定義して実装できます。カスタムモデルの実装方法と、Neptune ML インフラストラクチャを使用してトレーニングする方法については、[Neptune ML のカスタムモデル](machine-learning-custom-models.md) を参照してください。

# Neptune ML でのモデルのハイパーパラメータ設定のカスタマイズ
<a name="machine-learning-customizing-hyperparams"></a>

Neptune ML モデルトレーニングジョブを開始すると、Neptune ML は先行する[データ処理](machine-learning-on-graphs-processing.md)ジョブから推測された情報を自動的に使用します。この情報を使用して、タスク用に複数のモデルをトレーニングするための [SageMaker AI ハイパーパラメータチューニングジョブ](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` およびモデルトレーニングのさまざまな実行に対して変更または固定する必要のあるハイパーパラメータを指定します。

ハイパーパラメータは、ハイパーパラメータチューニングジョブが呼び出されたときにハイパーパラメータに与えられる優先順位を示すさまざまな階層に属するものとして分類されます。
+ Tier-1 ハイパーパラメータの優先順位は最優先されます。`maxHPONumberOfTrainingJobs` を10 未満の値に設定すると、Tier-1 ハイパーパラメータのみが調整され、残りはデフォルト値になります。
+ Tier-2 ハイパーパラメータの優先順位は低いため、チューニングジョブの合計トレーニングジョブが 10 以上あっても 50 未満の場合は、Tier-1 と Tier-2 の両方のハイパーパラメータが調整されます。
+ Tier 3 のハイパーパラメータは、合計 50 を超えるトレーニングジョブがある場合にのみ、Tier-1 および Tier-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>

このファイルには、モデル設定オブジェクトが 1 つ含まれる `models` という名前のトップレベル配列が 1 つある JSON オブジェクトが含まれています。ファイルをカスタマイズするときは、`models` 配列にはモデル設定オブジェクトが 1 つしかないことを確認してください。ファイルに複数のモデル設定オブジェクトが含まれている場合、チューニングジョブは警告とともに失敗します。

モデル設定オブジェクトには、次の最上位要素が含まれます。
+ **`model`** — (*文字列*) トレーニングするモデルタイプ (**変更しない**)。次の値を指定できます。
  + `"rgcn"` — これは、ノード分類およびリグレッションタスク、および異種リンク予測タスクのデフォルトです。
  + `"transe"` — これは、KGE リンク予測タスクのデフォルトです。
  + `"distmult"` — これは KGE リンク予測タスクの代替モデルタイプです。
  + `"rotate"` — これは KGE リンク予測タスクの代替モデルタイプです。

  原則として、`model` 値は直接変更しないでください。モデルタイプによって適用可能なハイパーパラメータが実質的に異なることが多く、トレーニングジョブの開始後に解析エラーが発生する可能性があるためです。

  モデルタイプを変更するには、`model-HPO-configuration.json` ファイルで変えるのではなく、[モデルトレーニング API](machine-learning-api-modeltraining.md#machine-learning-api-modeltraining-create-job)で `modelName` パラメータを使用します。

  モデルタイプを変更し、細粒度のハイパーパラメータを変更するには、使用するモデルのデフォルトのモデル設定テンプレートをコピーして、`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` とハイパーパラメータの仕様を `model-HPO-configuration.json` ファイルで変更すると、これらは異なり、`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"` の、2 つの要素が含まれています。例:

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

  有効な `type` 値は次のとおりです。
  + **`evaluate_every_pct`** — 各評価で完了するトレーニングの割合を指定します。

    `evaluate_every_pct` の場合、`"value"` フィールドには、そのパーセンテージを表すゼロから 1 までの浮動小数点数が含まれます。

    
  + **`evaluate_every_batch`** — 各評価で完了するトレーニングバッチの数を指定します。

    `evaluate_every_batch` の場合、`"value"` フィールドには、そのバッチ数を表す整数が含まれます。
  + **`evaluate_every_epoch`** — 評価ごとのエポック数を指定します。新しいエポックは午前 0 時に開始されます。

    `evaluate_every_epoch` の場合、`"value"` フィールドには、そのエポック数を表す整数が含まれます。

  `eval_frequency` のデフォルトの設定は次のとおりです。

  ```
    "eval_frequency": {
      "type":  "evaluate_every_epoch",
      "value":  1
    },
  ```
+ **`1-tier-param`** — (*必須*) Tier-1 ハイパーパラメータの配列。

  ハイパーパラメータを調整しない場合は、これを空の配列に設定できます。これは SageMaker AI ハイパーパラメータチューニングジョブによって起動されるトレーニングジョブの総数には影響しません。これは、すべてのトレーニングジョブが 1 より多いが 10 未満の場合、同じハイパーパラメータのセットで実行されることを意味します。

  一方、すべての調整可能なハイパーパラメータを同じ有意で扱う場合は、すべてのハイパーパラメータをこの配列に入れることができます。
+ **`2-tier-param`** — (*必須*) Tier-2 ハイパーパラメータの配列。

  これらのパラメータは、`maxHPONumberOfTrainingJobs` が 10 より大きい値を持つ場合にのみ調整されます。そうしない場合は、デフォルト値が固定されます。

  最大で 10 のトレーニングジョブ用のトレーニング予算がある場合、または他の理由で Tier-2 ハイパーパラメータを必要とせず、すべての調整可能なハイパーパラメータを調整する場合は、これを空の配列に設定できます。
+ **`3-tier-param`** — (*必須*) Tier-3 ハイパーパラメータの配列。

  これらのパラメータは、`maxHPONumberOfTrainingJobs` が 50 より大きい値を持つ場合にのみ調整されます。そうしない場合は、デフォルト値が固定されます。

  Tier-3 ハイパーパラメータを調整しない場合は、これを空の配列に設定できます。
+ **`fixed-param`** — (*必須*) 既定値のみを取り、さまざまなトレーニングジョブによって変化しない固定ハイパーパラメータの配列。

  すべてのハイパーパラメータを変更する場合は、これを空の配列に設定し、すべての階層を変えるか、すべてのハイパーパラメータを Tier-1 にするのに十分な大きさ `maxHPONumberOfTrainingJobs` の値に設定します。

`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`** — (*配列*) 連続調整可能なハイパーパラメータの範囲。

  これは、2つの値、すなわち範囲の最小値と最大値を持つ配列でなければなりません (`[min, max]`)。
+ **`options`** — (*配列*) カテゴリカル調整可能なハイパーパラメータのオプション。

  この配列には、考慮すべきすべてのオプションが含まれている必要があります。

  ```
    "options" : [value1, value2, ... valuen]
  ```
+ **`inc_strategy`** — (*文字列*) 連続調整可能なハイパーパラメータ範囲に対する増分変更のタイプ (**変わらない**)。

  有効な値は、`log`、`linear`、`power2` です。これは、範囲キーが設定されている場合にだけ適用されます。

  これを変更すると、チューニングにハイパーパラメータの全範囲を使用しないことがあります。
+ **`inc_val`** — (*浮動小数点*) 連続調整可能ハイパーパラメータで連続する増分が異なる量 (**変わらない**)。

  これは、範囲キーが設定されている場合にだけ適用されます。

  これを変更すると、チューニングにハイパーパラメータの全範囲を使用しないことがあります。
+ **`node_strategy`** — (*文字列*) このハイパーパラメータの有効範囲は、グラフ内のノード数に基づいて変化することを示します (**変わらない**)。

  有効な値は、`"perM"` (100 万当たり)、`"per10M"` (1000 万当たり)、`"per100M"` (1 億当たり) です。

  この値を変更するのではなく、代わりに `range` を変更します。
+ **`edge_strategy`** — (*文字列*) このハイパーパラメータの有効範囲は、グラフ内のエッジ数に基づいて変化することを示します (**変わらない**)。

  有効な値は、`"perM"` (100 万当たり)、`"per10M"` (1000 万当たり)、`"per100M"` (1 億当たり) です。

  この値を変更するのではなく、代わりに `range` を変更します。

### Neptune ML のすべてのハイパーパラメータのリスト
<a name="machine-learning-hyperparams-list"></a>

次のリストには、Neptune ML の任意のモデルタイプおよびタスクに対して設定できるすべてのハイパーパラメータが含まれています。これらはすべて全部のモデルタイプに適用できるわけではないので、ハイパーパラメータは使用しているモデルのテンプレートに表示される `model-HPO-configuration.json` ファイルでのみ設定します。
+ **`batch-size`** — 1 つのフォワードパスで使用するターゲットノードのバッチのサイズ。*タイプ*: `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 レイヤーごとにファンアウトを指定できるためです。

  このハイパーパラメータによってモデルのパフォーマンスが大きく変わる可能性があるため、固定するか、Tier-2 または Tier-3 ハイパーパラメータとして設定する必要があります。これを大きな値に設定すると、GPU インスタンスのトレーニングでメモリの問題が発生する可能性があります。
+ **`gamma`** — スコア関数のマージン値。*タイプ*: `float`。

  これは、`KGE` リンク予測モデルのみに当てはまります。
+ **`l2norm`** — オプティマイザで使用される荷重減衰値。荷重に L2 正規化ペナルティを課します。*タイプ*: `bool`。
+ **`layer-norm`** — `rgcn` モデルにレイヤー正規化を使用するかどうかを示します。*タイプ*: `bool`。
+ **`low-mem`** — 速度を犠牲にしてリレーションメッセージパッシング関数のメモリ不足実装を使用するかどうかを示します。*タイプ*: `bool`。

  
+ **`lr`** — 学習レート。*タイプ*: `float`。

  これは Tier-1 ハイパーパラメータとして設定する必要があります。
+ **`neg-share`** — リンク予測では、正のサンプリングされたエッジが負のエッジサンプルを共有できるかどうかを示します。*タイプ*: `bool`。
+ **`num-bases`** — `rgcn` モデルにおける基底分解のベース数。グラフ内のエッジタイプの数よりも小さい `num-bases` の値を使用すると、グラフは `rgcn` モデルの正則化手段として機能します。*タイプ*: `int`。
+ **`num-epochs`** - 実行するトレーニングエポックの数。*タイプ*: `int`。

  エポックは、グラフを通る完全なトレーニングパスです。
+ **`num-hidden`** — 非表示のレイヤーのサイズまたは単位数。*タイプ*: `int`。

  これにより、特徴がないノードの初期埋め込みサイズも設定されます。

  これを `batch-size` を減らすことなくはるかに大きな値に設定すると、GPU インスタンスのトレーニングでメモリの問題が発生する可能性があります。
+ **`num-layer`** — モデル内の GNN レイヤーの数。*タイプ*: `int`。

  この値は、ファンアウトパラメータと緊密に結合されています。また、常に同じハイパーパラメータ層内にファンアウトを設定した後にこれが来る必要があります。

  これによってモデルのパフォーマンスが大きく変わる可能性があるため、固定するか、Tier-2 または Tier-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. type=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` ハイパーパラメータの最小値および/または最大値を編集します。
+ ハイパーパラメータを固定値に設定するには、`fixed-param` セクションを開き、デフォルト値を設定したい固定値に設定します。
+ ハイパーパラメータを特定の層に配置し、その範囲を編集し、そのデフォルト値が適切に設定されていることを確認して、ハイパーパラメータの優先順位を変更します。

# モデルトレーニングのベストプラクティス
<a name="machine-learning-improve-model-performance"></a>

Neptune ML モデルのパフォーマンスを向上させるためにできることはあります。

## 適切なノードプロパティを選択する
<a name="machine-learning-before-exporting-data-choose-property"></a>

グラフ内のすべてのプロパティが機械学習タスクに有意義である、または関連性があるとは限りません。無関係なプロパティは、データのエクスポート時に除外する必要があります。

ベストプラクティスを以下に示します。
+ ドメインのエキスパートを使用して、特徴の重要性とそれらを予測に使用することの実現可能性を評価します。
+ データのノイズや重要でない相関を減らすために、冗長または無関係であると判断した特徴を削除します。
+ モデルの構築中に反復処理を行います。特徴、特徴の組み合わせ、調整目標を調整できます。

Amazon Machine Learning Developer Guide の[特徴処理](https://docs.aws.amazon.com/machine-learning/latest/dg/feature-processing.html)には、Neptune ML に関連する特徴処理に関する追加のガイドラインが記載されています。

## 外れ値のデータポイントの処理
<a name="machine-learning-before-exporting-data-outliers"></a>

外れ値は、残りのデータとは大きく異なるデータ点です。データの外れ値は、トレーニングプロセスを台無しにしたり誤解を招いたりして、トレーニング時間が長くなったり、モデルの精度が低下したりする可能性があります。これらが本当に重要でない限り、データをエクスポートする前に外れ値を排除する必要があります。

## 重複するノードとエッジを削除する
<a name="machine-learning-before-exporting-data-remove-duplicates"></a>

Neptune に格納されているグラフには、重複したノードまたはエッジがある場合があります。これらの冗長要素は、ML モデルトレーニングにノイズを発生させます。データをエクスポートする前に、重複するノードまたはエッジを削除してください。

## グラフ構造の微調整
<a name="machine-learning-before-exporting-data-tune-graph"></a>

グラフをエクスポートするときに、特徴の処理方法やグラフの作成方法を変更して、モデルのパフォーマンスを向上させることができます。

ベストプラクティスを以下に示します。
+ エッジプロパティがエッジのカテゴリの意味を持つ場合、場合によってはエッジタイプに変換する価値があります。
+ 数値プロパティに使用されるデフォルトの正規化ポリシーは `min-max` ですが、場合によっては他の正規化ポリシーがうまくいく場合もある。[`model-HPO-configuration.json` 要素のリスト。](machine-learning-customizing-hyperparams.md#machine-learning-hyperparams-file-elements) の説明に従って、プロパティを前処理し、正規化ポリシーを変更できます。
+ エクスポートプロセスでは、プロパティタイプに基づいて特徴タイプが自動的に生成されます。例えば、`String` プロパティをカテゴリ別特徴とし、`Float` および `Int` プロパティを数値特徴として処理します。必要に応じて、エクスポート後にとしタイプを変更できます ([`model-HPO-configuration.json` 要素のリスト。](machine-learning-customizing-hyperparams.md#machine-learning-hyperparams-file-elements))。

## ハイパーパラメータの範囲とデフォルトを調整する
<a name="machine-learning-before-exporting-data-change-hpo"></a>

データ処理オペレーションは、グラフからハイパーパラメータ設定範囲を推測します。生成されたモデルのハイパーパラメータの範囲とデフォルトがグラフデータでうまく機能しない場合は、HPO 設定ファイルを編集して、独自のハイパーパラメータ調整戦略を作成できます。

ベストプラクティスを以下に示します。
+ グラフが大きくなると、デフォルトの非表示次元サイズがすべての情報を含むのに十分な大きさではない場合があります。`num-hidden` ハイパーパラメータを変更して非表示の寸法サイズを制御することもできます。
+ Knowledge Graph Embedding (KGE) モデルの場合、グラフの構造と予算に応じて、使用されている特定のモデルを変更したい場合があります。

  `TrainsE` モデルは、１対多 (1-N)、多対１ (N-1)、多対多 (N-N) の関係を扱うのが困難です。`DistMult` モデルは対称関係を扱うのが困難です。`RotatE` はあらゆる種類のリレーションのモデリングが得意ですが、トレーニング中は `TrainsE` および `DistMult` よりも高価です。
+ 場合によっては、ノード識別とノード特徴情報の両方が重要な場合は、``concat-node-embed`` を使用してNeptune ML モデルに、その特徴と初期埋め込みを連結して、ノードの初期表現を取得するように指示します。
+ 一部のハイパーパラメータに対して適度に良好なパフォーマンスが得られる場合は、それらの結果に応じてハイパーパラメータサーチスペースを調整できます。

## Neptune ML でのモデルトレーニングプロセスの早期停止
<a name="machine-learning-model-training-early-stop"></a>

早期停止により、モデルのパフォーマンスを低下させることなく、モデルトレーニングのランタイムと関連コストを大幅に削減できます。また、モデルがトレーニングデータに過適合するのを防ぎます。

早期停止は、検証セットのパフォーマンスの定期的な測定値に依存します。最初は、トレーニングが進むにつれてパフォーマンスは向上しますが、モデルが過適合となると、再び低下し始めます。早期停止機能は、モデルが過適合を開始し、その時点でモデルトレーニングを停止する点を特定します。

Neptune ML は検証メトリクスの呼び出しを監視し、最新の検証メトリクスを最後の **`n`** 評価の検証メトリクスの平均と比較します。ここで、**`n`** は `window-for-early-stop` パラメータを使用して設定された数値です。検証メトリクスがその平均よりも悪くなるとすぐに、Neptune ML はモデルトレーニングを停止し、それまでに最適なモデルを保存します。

次のパラメータを使用して、早期停止を制御できます。
+ ** `window-for-early-stop`** —このパラメータの値は、早期停止を決定する際に平均する最近の検証スコアの数を指定する整数です。デフォルト値は `3` です。
+ ** `enable-early-stop`** —このブール値パラメータを使用して、早期停止機能をオフにします。デフォルトでは、この値は `true` です。

## Neptune ML での HPO プロセスの早期停止
<a name="machine-learning-HPO-early-stop"></a>

Neptune ML の早期停止機能は、SageMaker AI HPO ウォームスタート機能を使用して、他のトレーニングジョブと比較してうまく機能しないトレーニングジョブを停止します。これにより、コストを削減し、HPO の品質を向上させることができます。

この仕組みについては、[ウォームスタートのハイパーパラメータチューニングジョブを実行する](https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-warm-start.html)を参照してください。

ウォームスタートは、以前のトレーニングジョブから学習した情報を後続のトレーニングジョブに渡す機能を提供し、次の 2 つの異なる利点があります。
+ まず、以前の調整ジョブの結果は、新しいトレーニングジョブで検索するハイパーパラメータの良い組み合わせを選択する目的で使用されます。
+ 第 2 に、早期停止により多くのモデル実行にアクセスできるため、チューニング時間が短縮されます。

この機能は Neptune ML で自動的に有効になり、モデルトレーニング時間とパフォーマンスのバランスを取ることができます。現在のモデルのパフォーマンスに満足すれば、そのモデルを使用できます。そうでない場合は、以前の実行の結果でウォームスタートされるより多くの HPO を実行して、より良いモデルを発見します。

## プロフェッショナルサポートサービスを受ける
<a name="machine-learning-before-exporting-data-get-support"></a>

AWS は、Neptune プロジェクトでの機械学習における問題に対処するための専門的なサポートサービスを提供します。行き詰まったら、[AWS サポート](https://aws.amazon.com/premiumsupport/)をご利用ください。