paint-brush
Вот нейронная сеть, которая может предсказать вашего следующего онлайн-другак@andrei9735
340 чтения
340 чтения

Вот нейронная сеть, которая может предсказать вашего следующего онлайн-друга

к Andrei11m2025/02/13
Read on Terminal Reader

Слишком долго; Читать

В этом посте мы продолжим работу над прогнозированием ссылок с набором данных Twitch. Мы сосредоточимся на обучении модели ML на основе графовых нейронных сетей (GNN) и оптимизации ее гиперпараметров.
featured image - Вот нейронная сеть, которая может предсказать вашего следующего онлайн-друга
Andrei HackerNoon profile picture
0-item

В этой статье мы продолжим работу над прогнозированием ссылок с помощью набора данных Twitch. Мы сосредоточимся на обучении модели ML на основе графовых нейронных сетей (GNN) и оптимизации ее гиперпараметров. К настоящему моменту у нас уже есть обработанные и подготовленные для обучения модели графовые данные. Предыдущие шаги описаны в Части 3 — Обработка данных, Части 2 — Экспорт данных из БД и Части 1 — Загрузка данных в БД.


Прочитайте часть 1 здесь , часть 2 здесь и часть 3 здесь.

ВЫБОР ТИПА ГРАФОВОЙ НЕЙРОННОЙ СЕТИ: GCN и R-GCN

Мы будем использовать графовые сверточные нейронные сети, как и в посте о прогнозировании локальных связей , и хотя Neptune ML использует ту же структуру DGL.ai , базовая модель немного отличается. Neptune ML поддерживает как графы знаний (однородные графы с одним типом узла и одним типом ребра), так и неоднородные графы с несколькими типами узлов и ребер. Набор данных, с которым мы работаем, имеет один тип узла (пользователь) и один тип ребра (дружба). Хотя модель графовой сверточной сети (GCN) или графовой выборки и агрегации (GraphSAGE) также подойдет в этом случае, Neptune ML автоматически выбирает модель реляционной графовой сверточной сети (R-GCN) для наборов данных со свойствами узлов, которые могут различаться от узла к узлу, как объяснено здесь . В целом, R-GCN требуют больше вычислений для обучения из-за увеличенного количества параметров, необходимых для обработки нескольких типов узлов и ребер.

ГИПЕРПАРАМЕТРЫ ОБУЧЕНИЯ МОДЕЛИ

На этапе обработки данных (который мы описали в предыдущем посте TODO LINK) Neptune ML создал файл с именем model-hpo-configuration.json . Он содержит тип модели (R-GCN), тип задачи (link predicting), метрику оценки и частоту, а также 4 списка параметров: один с фиксированными параметрами, которые не изменяются во время обучения, и 3 списка параметров для оптимизации с диапазонами и значениями по умолчанию. Параметры сгруппированы по важности. Настраиваются ли параметры из каждой из групп, решается на основе количества доступных заданий по настройке: параметры 1-го уровня настраиваются всегда, параметры 2-го уровня настраиваются, если количество доступных заданий > 10, а параметры 3-го уровня настраиваются, только если оно > 50. Наш файл 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 : Скорость обучения — один из самых влиятельных гиперпараметров для обучения любой модели. Более низкая скорость обучения может привести к более медленной сходимости, но потенциально лучшей производительности, в то время как более высокая скорость обучения может ускорить обучение, но может привести к пропуску оптимальных решений.

num-hidden : Параметр num-hidden относится к числу скрытых единиц (нейронов) в каждом слое нейронной сети R-GCN, в частности в скрытых слоях. Большее число скрытых единиц увеличивает способность модели изучать сложные закономерности и взаимосвязи из данных, что может улучшить точность прогнозирования, но также может привести к переобучению, если модель станет слишком сложной для набора данных.

num-epochs : определяет, как долго обучается модель. Большее количество эпох позволяет модели лучше изучить данные, но может увеличить риск переобучения.

batch-size : Размер пакета влияет на использование памяти и стабильность сходимости. Меньший размер пакета может сделать модель более чувствительной к данным, тогда как больший размер пакета может улучшить скорость обучения.

num-negs : Отрицательная выборка влияет на то, как модель учится отличать истинные связи от ложных. Большее количество отрицательных выборок может улучшить качество прогнозов, но увеличивает вычислительные затраты.

dropout : Dropout помогает предотвратить переобучение, случайно пропуская некоторые нейроны во время обучения. Более высокий процент выпадения может снизить переобучение, но может усложнить обучение модели.

regularization-coef : Регуляризация, направленная на предотвращение переобучения модели.


Вы можете изменить значения по умолчанию, диапазон и размер шага для каждого из этих параметров. Полный список параметров можно найти здесь .

После изменения параметров просто замените исходный файл model-hpo-configuration.json в S3.

РОЛИ IAM ДЛЯ ОБУЧЕНИЯ МОДЕЛИ И HPO

Как и обработка данных, описанная в Части 3 этого руководства, для обучения модели требуются 2 роли IAM: роль Neptune, которая обеспечивает доступ Neptune к SageMaker и S3, и роль выполнения Sagemaker, которая используется SageMaker при запуске задачи обработки данных и позволяет ему получать доступ к S3. Эти роли должны иметь политики доверия, которые позволяют службам 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 -> Добавить роль).

НАЧАЛО ОБУЧЕНИЯ МОДЕЛИ И HPO С ИСПОЛЬЗОВАНИЕМ NEPTUNE ML API

Теперь мы готовы начать обучение модели. Для этого нам нужно отправить запрос в HTTP API кластера Neptune изнутри VPC, где расположен кластер. Мы будем использовать curl на экземпляре 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" }'

Обязательны только эти параметры:

  • dataProcessingJobId — идентификатор задания будет использоваться для получения местоположения обработанных данных в S3)
  • trainModelS3Location - выходное местоположение артефактов (весов модели)
  • Роли Neptune и SageMaker (эти роли должны быть добавлены в кластер Neptune DB)

Также есть параметр maxHPONumberOfTrainingJobs , который задает количество учебных заданий для запуска с различными наборами гиперпараметров. По умолчанию это 2, но AWS рекомендует запустить не менее 10 заданий для получения точной модели.

Также есть много необязательных параметров: например, мы можем вручную выбрать тип экземпляра EC2, который будет использоваться для обучения модели с помощью trainingInstanceType , и задать размер его тома хранения с помощью trainingInstanceVolumeSizeInGB . Полный список параметров можно найти здесь .

Кластер отвечает 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 минут, а второе («002») было автоматически остановлено, поскольку SageMaker поддерживает раннюю остановку, если показатели обучения не улучшаются в течение некоторого времени:


Ранняя остановка (2-я работа)


Давайте сравним гиперпараметры, которые использовались в этих работах:

Только 3 параметра имеют разные значения: num-hidden, num-negs и lr . Вторая модель (обученная с помощью Job 2) имела более высокую скорость обучения, но при этом меньшую способность улавливать сложные паттерны (потому что у нее было меньше нейронов), и она была обучена на меньшем количестве отрицательных образцов. Это привело к значительно более низкой точности, как мы можем видеть из Validation Mean Rank (115 против 23) и HITS@K :


1-я модель


2-я модель


Статистика 2-й модели


Средний ранг (MR) — это среднее ранговое положение правильной ссылки среди прогнозов. Более низкие значения MR лучше, поскольку они указывают на то, что правильная ссылка в среднем ранжируется ближе к вершине .

Метрика HITS@K измеряет долю раз, когда правильная ссылка появляется в первых K предсказанных результатах.

МОДЕЛЬНЫЕ АРТЕФАКТЫ

После завершения заданий по обучению в выходном контейнере S3 создаются артефакты модели вместе с файлами, содержащими статистику и метрики обучения:

Список файлов и папок, созданных в S3 в результате учебного задания.


Список файлов в папке 001.


Метрики и параметры в этих файлах JSON — те, о которых мы упоминали ранее. Только каталог 001 содержит подкаталог 'output' с файлом model.tar.gz, поскольку это единственное задание HPO, которое было выполнено. Артефакты для прогнозирования ссылок также содержат данные графа DGL, поскольку они требуются для выполнения фактических прогнозов, как описано здесь .


Эти файлы будут использоваться для создания конечной точки вывода и генерации фактических прогнозов ссылок. Это будет обсуждаться в следующем и последнем посте этой серии.