Создайте гетерогенный граф, используя dgl в Python

Опубликовано: 21 Февраля, 2023

В этой статье мы создадим гетерогенные графы, используя библиотеку dgl (Deep Graph Library) в Python. Графы — это не что иное, как набор узлов/вершин и ребер. Кроме того, ребра — это не что иное, как исходные узлы для узлов назначения. Таким образом, все ребра могут быть представлены как (U, V), где U и V — узлы.

Но в случае с гетерогенными графами нам нужно быть на шаг осторожнее. Гетерогенный граф — это особый вид информационной сети, который содержит либо несколько типов объектов (узлов), либо несколько типов связей (ребер).

G = (V, E)

Что такое библиотека Deep Graph (DGL) в Python?

Библиотека Deep Graph (DGL) — это библиотека Python с открытым исходным кодом, которая помогает исследователям и ученым быстро создавать, обучать и оценивать GNN на своих наборах данных. Это фреймворк-агностик. Создавайте свои модели с помощью PyTorch, TensorFlow или Apache MXNet.

Есть лишь небольшая разница по сравнению с созданием однородных графиков. В случае однородных графов все, что нам нужно передать, — это 2 набора тензоров, и это создает ребра между передаваемыми идентификаторами. Поскольку однородные графы имеют только 1 тип вершины и 1 тип ребра.

Здесь в гетерогенных графах у нас есть несколько типов узлов и несколько типов ребер . Таким образом, входные данные, которые мы передаем, представляют собой словарь пар ключ-значение для каждого отношения .

Syntax: { (source_type, edge_type, destination_type)  : (src_node_id Tensor , dest_node_id Tensor ) }

Ниже приведена реализация:

Python3




import dgl
import torch
  
data_dict = {
    ("user", "watches", "movie"): (torch.tensor([0, 0, 1, 2]),
                                   torch.tensor([0, 1, 0, 1])),
    ("director", "directs", "movie"): (torch.tensor([0, 1]),
                                       torch.tensor([1, 0]))
}
hetero_graph = dgl.heterograph(data_dict)
hetero_graph

Выход:

Теперь давайте рассмотрим различные типы узлов в графе, который мы здесь создали.

Python3




hetero_graph.ntypes

Выход:

["director", "movie", "user"]

Мы также можем посмотреть на различные типы ребер, присутствующих в рассматриваемом графе.

Python3




hetero_graph.etypes

Выход:

["directs", "watches"]

Преимущества создания гетерогенного графа

  • Если мы посмотрим на реальные сценарии — большинство задач относятся к типу гетерогенных графов.
  • Кроме того, следующим преимуществом является то, что мы получаем возможность применять разные модели GNN к разным отношениям .
  • Кроме того, при отрицательной и положительной выборке мы получаем точные края, никакие избыточные и неоднозначные края не выбираются.
  • Вот хороший пример: Пользователь – (смотрит) -> Фильм. Эта связь Watch может быть только между пользователем и фильмом. У вас не может быть Кино- (смотрит) -> Кино (или) Пользователь — (смотрит) -> Пользовательские отношения в случае разнородных графов, так как мы знаем тип узла.