Dalam postingan ini, kami akan melanjutkan pengerjaan prediksi tautan dengan kumpulan data Twitch. Kami akan fokus pada pelatihan model ML berdasarkan Graph Neural Networks (GNN) dan mengoptimalkan hiperparameternya. Sekarang, kami telah memproses dan menyiapkan data grafik untuk pelatihan model. Langkah-langkah sebelumnya dijelaskan dalam Bagian 3 - Pemrosesan data, Bagian 2 - Mengekspor data dari DB, dan Bagian 1 - Memuat data ke dalam DB.
Baca bagian 1 di sini ; bagian 2 di sini ; dan bagian 3 di sini.
Bahasa Indonesia: Kami akan menggunakan Graph Convolutional Neural Networks seperti yang kami lakukan di postingan prediksi tautan lokal , dan meskipun Neptune ML menggunakan kerangka kerja DGL.ai yang sama, model yang mendasarinya sedikit berbeda. Neptune ML mendukung grafik pengetahuan (grafik homogen dengan tipe simpul tunggal dan tipe tepi tunggal) dan grafik heterogen yang memiliki beberapa tipe simpul dan tepi. Kumpulan data yang sedang kita kerjakan memiliki tipe simpul tunggal (pengguna) dan tipe tepi tunggal (persahabatan). Meskipun model Graph Convolutional Network (GCN) atau Graph Sample and Aggregation (GraphSAGE) juga akan berfungsi dalam kasus ini, Neptune ML secara otomatis memilih model Relational Graph Convolutional Network (R-GCN) untuk kumpulan data dengan properti simpul yang dapat bervariasi dari simpul ke simpul, seperti yang dijelaskan di sini . Secara umum, R-GCN memerlukan lebih banyak komputasi untuk pelatihan karena peningkatan jumlah parameter yang diperlukan untuk menangani beberapa tipe simpul dan tepi.
Selama tahap pemrosesan data (yang kami jelaskan dalam posting sebelumnya TODO LINK), Neptune ML membuat file bernama model-hpo-configuration.json
. File ini berisi tipe model (R-GCN), tipe tugas (prediksi tautan), metrik evaluasi dan frekuensi, dan 4 daftar parameter: satu dengan parameter tetap yang tidak dimodifikasi selama pelatihan, dan 3 daftar parameter yang akan dioptimalkan, dengan rentang dan nilai default. Parameter dikelompokkan berdasarkan kepentingan. Apakah parameter dari masing-masing grup disetel atau tidak diputuskan berdasarkan jumlah pekerjaan penyetelan yang tersedia: parameter tingkat ke-1 selalu disetel, parameter tingkat ke-2 disetel jika jumlah pekerjaan yang tersedia > 10, dan parameter tingkat ke-3 disetel hanya jika > 50. File model-hpo-configuration.json
kami terlihat seperti ini:
{ "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 } ] } ] }
Parameter model & jenis tugas ditetapkan selama tahap ekspor dan pemrosesan data, dan tidak boleh diubah di sini.
Metrik evaluasi juga dipilih secara otomatis. Peringkat resiprokal rata-rata (MRR) mengukur peringkat rata-rata tautan yang benar dalam hasil prediksi, dengan MRR yang lebih tinggi menunjukkan kinerja yang lebih baik .
Frekuensi evaluasi ditetapkan sebesar 5% dari kemajuan pelatihan. Misalnya, jika kita memiliki 100 periode, evaluasi akan dilakukan setiap 5 periode.
Mari kita tinjau beberapa hiperparameter yang akan disetel:
lr : Laju pembelajaran adalah salah satu hiperparameter yang paling berpengaruh untuk pelatihan model apa pun. Laju pembelajaran yang lebih rendah dapat menyebabkan konvergensi yang lebih lambat tetapi berpotensi menghasilkan kinerja yang lebih baik, sementara laju pembelajaran yang lebih tinggi dapat mempercepat pelatihan tetapi mungkin kehilangan solusi optimal.
num-hidden : Parameter num-hidden merujuk pada jumlah unit tersembunyi (neuron) di setiap lapisan jaringan saraf R-GCN, khususnya di lapisan tersembunyi. Jumlah unit tersembunyi yang lebih besar meningkatkan kapasitas model untuk mempelajari pola dan hubungan yang kompleks dari data, yang dapat meningkatkan akurasi prediksi, tetapi juga dapat menyebabkan overfitting jika model menjadi terlalu kompleks untuk kumpulan data.
num-epochs : Ini menentukan berapa lama model dilatih. Semakin banyak epoch, semakin baik model mempelajari lebih banyak data, tetapi dapat meningkatkan risiko overfitting.
batch-size : Ukuran batch memengaruhi penggunaan memori dan stabilitas konvergensi. Ukuran batch yang lebih kecil mungkin membuat model lebih sensitif terhadap data, sementara ukuran batch yang lebih besar dapat meningkatkan kecepatan pelatihan.
num-negs : Pengambilan sampel negatif memengaruhi cara model belajar membedakan tautan yang benar dari yang salah. Jumlah sampel negatif yang lebih tinggi dapat meningkatkan kualitas prediksi tetapi meningkatkan biaya komputasi.
dropout : Dropout membantu mencegah overfitting dengan melewatkan beberapa neuron secara acak selama pelatihan. Tingkat dropout yang lebih tinggi dapat mengurangi overfitting tetapi dapat mempersulit pembelajaran model.
regularisasi-koef : Regularisasi yang ditujukan untuk mencegah model dari overfitting.
Anda dapat mengubah nilai default, rentang, dan ukuran langkah untuk setiap parameter ini. Daftar lengkap parameter dapat ditemukan di sini .
Setelah mengubah parameter, cukup ganti file model-hpo-configuration.json
asli di S3.
Sama seperti pemrosesan data yang dijelaskan di Bagian 3 panduan ini, pelatihan model memerlukan 2 peran IAM: peran Neptune yang menyediakan akses Neptune ke SageMaker dan S3, dan peran eksekusi Sagemaker yang digunakan oleh SageMaker saat menjalankan tugas pemrosesan data dan memungkinkannya mengakses S3. Peran-peran ini harus memiliki kebijakan kepercayaan yang memungkinkan layanan Neptune dan SageMaker untuk mengasumsikannya:
{ "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" } ] }
Setelah membuat peran dan memperbarui kebijakan kepercayaannya, kami menambahkannya ke kluster Neptune (Neptune -> Basis Data -> YOUR_NEPTUNE_CLUSTER_ID -> Konektivitas & Keamanan -> Peran IAM -> Tambahkan peran).
Sekarang kita siap untuk memulai pelatihan model. Untuk melakukannya, kita perlu mengirim permintaan ke HTTP API klaster Neptune dari dalam VPC tempat klaster berada. Kita akan menggunakan curl pada instans EC2:
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" }'
Hanya parameter berikut yang diperlukan:
Ada juga parameter maxHPONumberOfTrainingJobs yang menetapkan jumlah tugas pelatihan yang akan dijalankan dengan set hiperparameter yang berbeda. Secara default, nilainya adalah 2, tetapi AWS merekomendasikan untuk menjalankan setidaknya 10 tugas untuk mendapatkan model yang akurat.
Ada banyak parameter opsional juga: misalnya, kita dapat secara manual memilih tipe instans EC2 yang akan digunakan untuk pelatihan model dengan trainingInstanceType dan mengatur ukuran volume penyimpanannya dengan trainingInstanceVolumeSizeInGB . Daftar lengkap parameter dapat ditemukan di sini .
Cluster merespons dengan JSON yang berisi ID pekerjaan pemrosesan data yang baru saja kita buat:
{"id":"d584f5bc-d90e-4957-be01-523e07a7562e"}
Kita dapat menggunakannya untuk mendapatkan status pekerjaan pelatihan model dengan perintah ini (gunakan neptuneIamRoleArn yang sama seperti pada permintaan sebelumnya):
curl https://YOUR_NEPTUNE_CLUSTER_ENDPOINT:8182/ml/modeltraining/YOUR_JOB_ID?neptuneIamRoleArn='arn:aws:iam::123456789012:role/NeptuneMLModelTrainingNeptuneRole'
Setelah merespons dengan sesuatu seperti ini,
{ "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" }
kita dapat memeriksa log pelatihan dan artefak di bucket S3 tujuan.
Pelatihan model telah selesai, jadi mari periksa hasilnya di konsol AWS: SageMaker -> Pelatihan -> Pekerjaan Pelatihan.
Untuk menyederhanakannya, kami tidak mengubah jumlah pekerjaan HPO saat memulai pelatihan model, dan nilai default 2 digunakan. Kedua pekerjaan tersebut dijalankan secara paralel. Jenis instans dipilih secara otomatis: ml.g4dn.2xlarge .
Pekerjaan pertama (yang memiliki nama '001') selesai dalam waktu 15 menit, dan pekerjaan kedua ('002') dihentikan secara otomatis, karena SageMaker mendukung penghentian awal jika metrik pelatihan tidak membaik untuk sementara waktu:
Mari kita bandingkan hiperparameter yang digunakan dalam pekerjaan ini:
Hanya 3 parameter yang memiliki nilai berbeda: num-hidden, num-negs, dan lr . Model kedua (dilatih dengan Job 2) memiliki tingkat pembelajaran yang lebih tinggi, tetapi memiliki kapasitas yang lebih rendah untuk menangkap pola yang kompleks (karena memiliki lebih sedikit neuron), dan dilatih pada lebih sedikit sampel negatif. Hal itu menyebabkan akurasi yang jauh lebih rendah seperti yang dapat kita lihat dari Validation Mean Rank (115 vs 23) dan HITS@K :
Peringkat Rata-rata (MR) adalah posisi peringkat rata-rata tautan yang benar di antara prediksi. Nilai MR yang lebih rendah lebih baik karena menunjukkan bahwa tautan yang benar, secara rata-rata, memiliki peringkat lebih dekat ke atas .
Metrik HITS@K mengukur proporsi kemunculan tautan yang benar pada hasil prediksi K teratas.
Ketika pekerjaan pelatihan selesai, artefak model dibuat dalam bucket S3 keluaran, bersama dengan file yang berisi statistik dan metrik pelatihan:
Metrik dan parameter dalam file JSON ini adalah yang telah kami sebutkan sebelumnya. Hanya direktori 001 yang berisi subdirektori 'output' dengan file model.tar.gz, karena itu satu-satunya pekerjaan HPO yang telah diselesaikan. Artefak untuk prediksi tautan juga berisi data grafik DGL karena diperlukan untuk membuat prediksi aktual, seperti yang dijelaskan di sini .
File-file ini akan digunakan untuk membuat titik akhir inferensi dan menghasilkan prediksi tautan yang sebenarnya. Hal itu akan dibahas dalam posting berikutnya dan terakhir dari seri ini.