Graph Neural Networks

graph neural networks (gnn) — нейросети для данных в виде графов

Раздел
Основы AI
Сокращ.
GNN
Обновлено
05.09.26

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

Коротко

Graph Neural Networks, или GNN, — графовые нейросети. Они работают с объектами и связями между ними: атомами в молекуле, пользователями в социальной сети, перекрёстками и дорогами.

Свойства самого объекта не всегда объясняют происходящее. Два аккаунта могут выглядеть одинаково, но один связан с обычными покупателями, а другой — с сетью подозрительных переводов. GNN помогает учесть такое окружение вместе с признаками объекта.

Что такое граф

Граф состоит из узлов и рёбер. Узел обозначает объект, ребро — связь. У обоих могут быть признаки: у атома — химический элемент, у связи — её тип, у дороги — длина и ограничение скорости.

Графом удобно представить:

  • социальную сеть: пользователи и подписки;
  • молекулу: атомы и химические связи;
  • транспортную сеть: перекрёстки и участки дорог;
  • граф знаний: сущности и отношения;
  • программу: функции и вызовы между ними.

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

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

Как узлы обмениваются информацией

Во многих GNN используется передача сообщений — message passing. На слое сеть собирает сведения от соседей и обновляет представление узла.

Упрощённая схема:

Для каждого узла:
  1. Рассчитать сообщения от соседей.
  2. Объединить их: например, суммой или взвешенным средним.
  3. Обновить признаки узла с учётом собранных сообщений.

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

За один локальный слой информация проходит по одному ребру, за два — может дойти от соседей соседей. После K таких слоёв узел может учитывать K-шаговую окрестность. Это не значит, что он сохранил о ней все сведения: при объединении часть информации теряется. В архитектурах с глобальным вниманием или дополнительными связями радиус устроен иначе.

Что предсказывает GNN

Есть три распространённых уровня задачи.

Узел. Например, относится ли аккаунт к подозрительным. Выход соответствует каждому пользователю.

Связь. Например, какой товар человек, вероятно, выберет. Сеть оценивает существующее ребро или возможность нового.

Весь граф. Например, какое свойство ожидается у молекулы. Представления узлов объединяют в общий результат. Предсказание токсичности здесь остаётся модельной оценкой, а не заменой исследования.

Почему порядок узлов не должен менять смысл

Если перенумеровать атомы молекулы, сама молекула не изменится. Хорошо устроенная графовая модель учитывает это.

Для ответа о всём графе нужна инвариантность к перестановке: ответ остаётся тем же. Для ответов по узлам — эквивариантность: результаты переставляются вслед за узлами. Оценка пользователя не меняется только потому, что его строка переместилась в конец массива.

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

Основные варианты

  • GCN — Graph Convolutional Network. В распространённой версии объединяет признаки узла и соседей с нормировкой по связям. Это один из базовых вариантов графовой свёртки, а не название всех GNN.
  • GraphSAGE. Обучает способ собирать признаки соседей. Выборка части соседей помогает обрабатывать большие графы.
  • GAT — Graph Attention Network. Использует обучаемые веса внимания, чтобы сообщения разных соседей влияли на результат по-разному.
  • MPNN — Message Passing Neural Network. Общая схема с функциями сообщений, обновления и получения итогового ответа.
  • GIN — Graph Isomorphism Network. Построена с учётом выразительности агрегации. При условиях из исходной работы различает структуры на уровне теста Вейсфейлера — Лемана первого порядка. Это не «самая мощная сеть для любых графов»: у этого теста тоже есть пределы.
  • Graph Transformer. Использует внимание вместе с информацией о структуре графа. Внимание может быть локальным или глобальным; полный обмен между всеми узлами требует больше ресурсов.

Пример: подбор похожих материалов

Представим сервис с коллекциями изображений. Пользователи сохраняют картинки на доски. Сами изображения могут быть похожи визуально, но совместные сохранения дают дополнительную подсказку: люди объединяют их по стилю, теме или задаче.

В работе о PinSage авторы описали внедрение графовой рекомендательной системы в Pinterest. Она сочетала признаки объектов, случайные обходы графа и графовые свёртки. Это конкретный исследовательский пример, а не обещание, что любая GNN улучшит рекомендации.

Ниже — небольшой учебный GraphSAGE-код, не реализация PinSage. Он показывает только получение векторов узлов. Для содержательных рекомендаций модель ещё нужно обучить на выбранной задаче.

import torch
from torch_geometric.nn import SAGEConv


class GraphEncoder(torch.nn.Module):
    def __init__(self, input_dim, hidden_dim):
        super().__init__()
        self.conv1 = SAGEConv(input_dim, hidden_dim)
        self.conv2 = SAGEConv(hidden_dim, hidden_dim)

    def forward(self, x, edge_index):
        h = torch.relu(self.conv1(x, edge_index))
        return self.conv2(h, edge_index)


# Четыре узла, у каждого — три условных признака.
x = torch.tensor([
    [1.0, 0.0, 0.2],
    [0.8, 0.1, 0.3],
    [0.0, 1.0, 0.7],
    [0.1, 0.9, 0.6],
])

# Неориентированная цепочка: каждое ребро записано в обе стороны.
edge_index = torch.tensor([
    [0, 1, 1, 2, 2, 3],
    [1, 0, 2, 1, 3, 2],
], dtype=torch.long)

torch.manual_seed(0)
model = GraphEncoder(input_dim=3, hidden_dim=8)
model.eval()

with torch.no_grad():
    embeddings = model(x, edge_index)

print(embeddings.shape)  # torch.Size([4, 8])

Вход x хранит признаки, edge_index — направленные связи от первой строки индексов ко второй. Два слоя возвращают по восьми чисел на узел. Пока веса случайные, близость этих векторов нельзя считать качественной рекомендацией.

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

Что даёт граф и чего он не решает

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

Для масштаба используют выборку соседей, обработку частями и распределённое хранение. Это отдельная инженерная работа, а не бесплатное свойство аббревиатуры GNN.

Не менее важен сам смысл ребра. Совместная покупка, случайная встреча и подозрительный перевод — разные отношения. Если смешать их или включить сведения из будущего, сеть может выучить неверную закономерность или показать обманчиво высокое качество.

Для проверки прогноза во времени граф строят из информации, доступной на момент прогноза. Иначе возникает утечка: модель косвенно узнаёт ответ через связи, которых тогда ещё не было.

Ограничения

Чрезмерное сглаживание — over-smoothing. После многих проходов представления узлов могут стать слишком похожими. Числа слоёв, после которого это обязательно случится, нет: влияют граф, преобразования и дополнительные связи между слоями.

Сжатие далёкой информации — over-squashing. Много сигналов из удалённой окрестности приходится уместить в небольшой вектор и провести через ограниченное число связей. Добавить слои не всегда достаточно.

Пределы различения структур. Некоторые разные графы выглядят одинаково для выбранного способа передачи сообщений. Более выразительные модели могут стоить дороже.

Шумные или бесполезные связи. Соседство помогает лишь тогда, когда несёт полезный сигнал. Хорошая табличная модель или простой поиск похожих объектов иногда оказывается лучше.

С чем часто путают

  • Граф знаний и GNN. Первый описывает сущности и отношения, вторая учится работать с графовыми данными.
  • Графовая база и GNN. База хранит граф и выполняет запросы; нейросеть делает предсказания.
  • Схема ComfyUI и графовая нейросеть. Соединение нод задаёт порядок вычислений. Само по себе оно не обучает GNN и не превращает каждую ноду в нейрон.
  • Transformer и последовательность. Трансформеры работают не только с текстом: их используют и для изображений, и для графов.
  • Вектор узла и конечный ответ. Эмбеддинг может быть промежуточным представлением; поверх него часто строится классификация или оценка связи.

Частые вопросы

Сколько данных нужно?

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

Можно ли обучить дома?

Небольшие примеры — да. Расход памяти зависит не только от числа узлов, но и от рёбер, размера признаков, глубины и способа обработки соседей. Видеокарта полезна не во всех режимах одинаково; сначала стоит оценить конкретный пример.

С какой библиотеки начать?

В Python графовые слои есть, например, в PyTorch Geometric и DGL. Для первого опыта удобна библиотека с примером именно вашей задачи: классификация узлов и предсказание свойств молекулы требуют разной подготовки данных.

GNN заменяет физический или химический эксперимент?

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

Главное

GNN полезна, когда ответ зависит не только от объекта, но и от его окружения. Основная работа начинается ещё до обучения: выбрать осмысленные связи, подготовить признаки и организовать проверку без подсказок из будущего. После этого можно выяснять, действительно ли граф помогает лучше простого решения.

Источники