この投稿では、Twitch データセットを使用したリンク予測の作業を続けます。グラフ ニューラル ネットワーク (GNN) に基づく ML モデルのトレーニングとハイパーパラメータの最適化に焦点を当てます。この時点で、グラフ データは処理済みで、モデル トレーニングの準備が整っています。これまでの手順については、パート 3 - データ処理、パート 2 - DB からのデータのエクスポート、およびパート 1 - DB へのデータのロードで説明されています。
パート 1 はこちら、パート 2 はこちら、パート 3 はこちらでお読みください。
ローカルリンク予測の投稿で行ったのと同じように、グラフ畳み込みニューラルネットワークを使用します。Neptune ML は同じDGL.aiフレームワークを使用しますが、基盤となるモデルは少し異なります。Neptune ML は、ナレッジグラフ (単一のノードタイプと単一のエッジタイプの同種グラフ) と、複数のノードタイプとエッジタイプを持つ異種グラフの両方をサポートしています。ここで使用しているデータセットには、単一のノードタイプ (ユーザー) と単一のエッジタイプ (友情) があります。この場合、グラフ畳み込みネットワーク (GCN) またはグラフサンプルと集約 (GraphSAGE) モデルも機能しますが、ここで説明されているように、ノードごとに異なる可能性があるノードプロパティを持つデータセットには、Neptune ML によってリレーショナルグラフ畳み込みネットワーク (R-GCN) モデルが自動的に選択されます。一般に、R-GCN では、複数のノードタイプとエッジタイプを処理するために必要なパラメーターの数が増えるため、トレーニングに多くのコンピューティングが必要になります。
データ処理段階(前回の投稿 TODO LINK で説明)で、Neptune ML はmodel-hpo-configuration.json
というファイルを作成しました。このファイルには、モデルタイプ(R-GCN)、タスクタイプ(リンク予測)、評価メトリックと頻度、および 4 つのパラメータリスト(トレーニング中に変更されない固定パラメータのリスト 1 つと、範囲とデフォルト値を含む最適化されるパラメータのリスト 3 つ)が含まれています。パラメータは重要度別にグループ化されています。各グループのパラメータが調整されるかどうかは、利用可能な調整ジョブの数に基づいて決定されます。つまり、第 1 層のパラメータは常に調整され、第 2 層のパラメータは利用可能なジョブの数が 10 を超える場合に調整され、第 3 層のパラメータは 50 を超える場合にのみ調整されます。model model-hpo-configuration.json
ファイルは次のようになります。
{ "models": [ { "model": "rgcn", "task_type": "link_predict", "eval_metric": { "metric": "mrr", "global_ranking_metrics": true, "include_retrieval_metrics": false }, "eval_frequency": { "type": "evaluate_every_pct", "value": 0.05 }, "1-tier-param": [ { "param": "num-hidden", "range": [16, 128], "type": "int", "inc_strategy": "power2" }, { "param": "num-epochs", "range": [3, 100], "inc_strategy": "linear", "inc_val": 1, "type": "int", "edge_strategy": "perM" }, { "param": "lr", "range": [0.001, 0.01], "type": "float", "inc_strategy": "log" }, { "param": "num-negs", "range": [4, 32], "type": "int", "inc_strategy": "power2" } ], "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 }, { "param": "regularization-coef", "range": [0.0001, 0.01], "type": "float", "inc_strategy": "log", "default": 0.001 } ], "3-tier-param": [ { "param": "batch-size", "range": [128, 512], "inc_strategy": "power2", "type": "int", "default": 256 }, { "param": "sparse-lr", "range": [0.001, 0.01], "inc_strategy": "log", "type": "float", "default": 0.001 }, { "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": "neg-share", "type": "bool", "default": true }, { "param": "use-self-loop", "type": "bool", "default": true }, { "param": "low-mem", "type": "bool", "default": true }, { "param": "enable-early-stop", "type": "bool", "default": true }, { "param": "window-for-early-stop", "type": "bool", "default": 3 }, { "param": "concat-node-embed", "type": "bool", "default": true }, { "param": "per-feat-name-embed", "type": "bool", "default": true }, { "param": "use-edge-features", "type": "bool", "default": false }, { "param": "edge-num-hidden", "type": "int", "default": 16 }, { "param": "weighted-link-prediction", "type": "bool", "default": false }, { "param": "link-prediction-remove-targets", "type": "bool", "default": false }, { "param": "l2norm", "type": "float", "default": 0 } ] } ] }
モデルとタスク タイプのパラメーターは、データのエクスポートと処理の段階で設定されるため、ここでは変更しないでください。
評価指標も自動的に選択されました。平均逆順位 (MRR) は、予測結果における正しいリンクの平均順位を測定します。MRRが高いほど、パフォーマンスが優れていることを示します。
評価頻度はトレーニングの進行の 5% に設定されています。たとえば、エポックが 100 の場合、評価は 5 エポックごとに実行されます。
調整されるハイパーパラメータのいくつかを確認してみましょう。
lr : 学習率は、あらゆるモデルトレーニングにとって最も影響力のあるハイパーパラメータの 1 つです。学習率が低いと収束が遅くなりますが、パフォーマンスが向上する可能性があります。一方、学習率が高いとトレーニングが高速化されますが、最適なソリューションを見逃す可能性があります。
num-hidden : num-hidden パラメータは、R-GCN ニューラル ネットワークの各層、具体的には隠し層にある隠しユニット (ニューロン) の数を示します。隠しユニットの数が多いほど、データから複雑なパターンや関係性を学習するモデルの能力が高まり、予測精度が向上しますが、モデルがデータセットに対して複雑になりすぎると、過剰適合につながる可能性もあります。
num-epochs : モデルのトレーニング期間を定義します。エポック数が多いほど、モデルはデータからより多くのことを学習できますが、過剰適合のリスクが高まる可能性があります。
batch-size : バッチ サイズはメモリ使用量と収束の安定性に影響します。バッチ サイズが小さいほどモデルはデータに対してより敏感になる可能性があり、バッチ サイズが大きいほどトレーニング速度が向上する可能性があります。
num-negs : ネガティブ サンプリングは、モデルが真のリンクと偽のリンクを区別する方法に影響します。ネガティブ サンプルの数が多いと予測の品質が向上する可能性がありますが、計算コストが増加します。
ドロップアウト: ドロップアウトは、トレーニング中に一部のニューロンをランダムにスキップすることで、オーバーフィッティングを防ぐのに役立ちます。ドロップアウト率を高くすると、オーバーフィッティングが軽減される可能性がありますが、モデルの学習が難しくなる可能性があります。
normalization-coef : モデルの過剰適合を防ぐことを目的とした正規化。
これらの各パラメータのデフォルト値、範囲、ステップ サイズを変更できます。パラメータの完全なリストについては、 こちらを参照してください。
パラメータを変更したら、S3 内の元のmodel-hpo-configuration.json
ファイルを置き換えるだけです。
このガイドのパート 3 で説明したデータ処理と同様に、モデルのトレーニングには 2 つの IAM ロールが必要です。SageMaker と S3 への Neptune アクセスを提供する Neptune ロールと、データ処理タスクの実行中に SageMaker によって使用され、S3 へのアクセスを許可する Sagemaker 実行ロールです。これらのロールには、Neptune および SageMaker サービスがそれらを引き受けることを許可する信頼ポリシーが必要です。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "sagemaker.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Sid": "", "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
ロールを作成し、信頼ポリシーを更新したら、それらを Neptune クラスターに追加します (Neptune -> データベース -> YOUR_NEPTUNE_CLUSTER_ID -> 接続とセキュリティ -> IAM ロール -> ロールの追加)。
これで、モデルのトレーニングを開始する準備ができました。そのためには、クラスターが配置されている VPC 内から Neptune クラスターの HTTP API にリクエストを送信する必要があります。EC2 インスタンスで curl を使用します。
curl -XPOST https://(YOUR_NEPTUNE_ENDPOINT):8182/ml/modeltraining \ -H 'Content-Type: application/json' \ -d '{ "dataProcessingJobId" : "ID_OF_YOUR_DATAPROCESSING_JOB", "trainModelS3Location" : "s3://OUTPUT_BUCKET/model-artifacts/...", "neptuneIamRoleArn": "arn:aws:iam::123456789012:role/NeptuneMLModelTrainingNeptuneRole", "sagemakerIamRoleArn": "arn:aws:iam::123456789012:role/NeptuneMLModelTrainingSagemakerRole" }'
必要なのはこれらのパラメータのみです。
また、異なるハイパーパラメータのセットで実行するトレーニングジョブの数を設定するmaxHPONumberOfTrainingJobsパラメータもあります。デフォルトでは 2 ですが、 AWS では正確なモデルを取得するために少なくとも 10 個のジョブを実行することを推奨しています。
オプションのパラメータも多数あります。たとえば、 trainingInstanceTypeを使用してモデルのトレーニングに使用する EC2 インスタンスタイプを手動で選択し、 trainingInstanceVolumeSizeInGBを使用してそのストレージボリュームサイズを設定できます。パラメータの完全なリストについては、こちらを参照してください。
クラスターは、先ほど作成したデータ処理ジョブの ID を含む JSON で応答します。
{"id":"d584f5bc-d90e-4957-be01-523e07a7562e"}
このコマンドを使用して、モデルトレーニングジョブのステータスを取得できます (前のリクエストと同じneptuneIamRoleArnを使用します)。
curl https://YOUR_NEPTUNE_CLUSTER_ENDPOINT:8182/ml/modeltraining/YOUR_JOB_ID?neptuneIamRoleArn='arn:aws:iam::123456789012:role/NeptuneMLModelTrainingNeptuneRole'
次のような応答が返ってきたら、
{ "processingJob": { "name": "PROCESSING_JOB_NAME", "arn": "arn:aws:sagemaker:us-east-1:123456789012:processing-job/YOUR_PROCESSING_JOB_NAME", "status": "Completed", "outputLocation": "s3://OUTPUT_BUCKET/model-artifacts/PROCESSING_JOB_NAME/autotrainer-output" }, "hpoJob": { "name": "HPO_JOB_NAME", "arn": "arn:aws:sagemaker:us-east-1:123456789012:hyper-parameter-tuning-job/HPO_JOB_NAME", "status": "Completed" }, "mlModels": [ { "name": "MODEL_NAME-cpu", "arn": "arn:aws:sagemaker:us-east-1:123456789012:model/MODEL_NAME-cpu" } ], "id": "d584f5bc-d90e-4957-be01-523e07a7562e", "status": "Completed" }
トレーニング ログとアーティファクトを宛先 S3 バケットで確認できます。
モデルのトレーニングが完了したので、AWS コンソールで結果を確認しましょう: SageMaker -> トレーニング -> トレーニングジョブ。
簡単にするために、モデルのトレーニングを開始したときに HPO ジョブの数を変更せず、デフォルト値の 2 を使用しました。2 つのジョブは並行して実行されました。インスタンス タイプは自動的に選択されました: ml.g4dn.2xlarge 。
最初のジョブ (名前に「001」が含まれるジョブ) は 15 分で完了し、2 番目のジョブ (「002」) は自動的に停止しました。これは、SageMaker がトレーニング メトリックがしばらく改善されない場合の早期停止をサポートしているためです。
これらのジョブで使用されたハイパーパラメータを比較してみましょう。
異なる値を持つパラメータはnum-hidden、num-negs、lr の3 つだけです。2 番目のモデル (ジョブ 2 でトレーニング) は、学習率は高いものの、複雑なパターンを捕捉する能力は低く (ニューロンが少ないため)、トレーニングされたネガティブ サンプルの数も少なかったため、検証平均ランク (115 vs 23) と HITS@Kからわかるように、精度が大幅に低下しました。
平均ランク (MR) は、予測の中での正しいリンクの平均ランク位置です。MR値が低いほど、正しいリンクが平均して上位にランク付けされていることを示し、優れています。
HITS@K メトリックは、上位 K 個の予測結果に正しいリンクが出現する回数の割合を測定します。
トレーニング ジョブが完了すると、トレーニングの統計とメトリックを含むファイルとともに、モデル成果物が出力 S3 バケットに作成されます。
これらの JSON ファイル内のメトリックとパラメーターは、前に説明したものです。001 ディレクトリのみに、model.tar.gz ファイルを含む 'output' サブディレクトリが含まれています。これは、完了した唯一の HPO ジョブであるためです。リンク予測のアーティファクトには、 ここで説明されているように、実際の予測を行うために必要な DGL グラフ データも含まれています。
これらのファイルは推論エンドポイントを作成し、実際のリンク予測を生成するために使用されます。これについては、このシリーズの次の最後の投稿で説明します。