GraphSAGE: как масштабировать графовые нейронные сети до миллиардов соединений |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2022-09-17 06:04 Что общего между UberEatsи Pinterest? Их рекомендательные системы работают с помощью GraphSAGE в огромных масштабах с миллионами и миллиардами узлов и ребер.
В этом руководстве мы используем набор данных с 20 тысячами узлов, а не миллиардами, из-за ограничений Google Colab. В процессе изучения будем придерживаться архитектуры оригинального GraphSAGE, а также затронем некоторые интересные функции из предыдущих вариантов. Код можно запустить с помощью этого блокнота Google Colab. 1. Набор данных PubMed PubMed является частью датасета Planetoid (лицензия MIT). Вот что нужно о нем знать.
Цель — достичь точности в 70%. from torch_geometric.datasets import Planetoid dataset = Planetoid(root='.', name="Pubmed") # Вывод информации о датасете # Вывод информации о графе Dataset: Pubmed() Graph: PubMed имеет невероятно низкое количество обучающих узлов в сравнении с полным графом — ему нужно всего 60 образцов, чтобы научиться классифицировать 1000 тестовых узлов. Несмотря на сложности, GGNs смогла добиться высокого уровня точности. Вот таблица лидеров среди известных методик, согласно PapersWithCode: Я не смог найти результатов для GraphSAGE на PubMed, используя эту специфическую настройку (60 обучающих узлов и 1000 тестовых), так что не рассчитываем на высокую точность. Но при работе с большими графами не менее актуальной может оказаться и другая метрика: время обучения. 2. GraphSAGE в теории Алгоритм GraphSAGE можно разделить на два этапа.
Выборка по соседям Мини-пакетирование — распространенная техника, используемая в машинном обучении. Она разбивает набор данных на пакеты меньших размеров, что позволяет обучать модели более эффективно. Вот некоторые преимущества этой техники.
Техника мини-пакетирования настолько удобна, что стала стандартом для работы в обычных нейронных сетях. Однако с графическими данными все не так просто, поскольку разделение набора данных на мелкие куски приводит к разрыву важных связей между узлами. Что же делать? За последние годы было разработано несколько стратегий по созданию мини-пакетов для графов, в том числе выборка по соседям. Также существуют и другие техники, которые можно найти в документации PyG, например кластеризация подграфов. Техника выборки по соседям рассматривает только фиксированные числа случайных соседей. Вот как выглядит процесс.
Этот процесс повторяется для каждого узла из списка или целиком для всего графа. Но создавать подграф для каждого узла неэффективно, вместо этого мы можем обработать их пакетно. В этом случае каждый подграф используется несколькими целевыми узлами. Выборка по соседям имеет еще одно преимущество. Некоторые узлы очень популярны и действуют как хабы, например знаменитости в социальных сетях. С вычислительной точки зрения получение скрытых векторов этих узлов может быть очень затратным, поскольку требует расчета скрытых векторов тысяч или даже миллионов соседей. GraphSAGE исправляет эту ситуацию путем игнорирования большинства узлов. В PyG выборка по соседям реализуется через объект from torch_geometric.loader import NeighborLoader # Создание пакетов с помощью выборки по соседям # Вывод каждого подграфа # Построение каждого подграфа Subgraph 0: Data(x=[389, 500], edge_index=[2, 448], batch_size=16) Мы создали 4 подграфа различного размера, что обеспечивает их параллельную обработку и соответствие вычислительным ресурсам GPU. Количество соседей — важный показатель, так как отсечение графа удаляет большое количество информации, которое мы можем увидеть, просто посмотрев на степень узлов (количество соседей): from torch_geometric.utils import degree def plot_degree(data): # Подсчет количества узлов для каждой степени # Построение столбчатой диаграммы # Построение графика степеней узлов исходного графа # Построение графика степеней узлов конечного подграфа В этом примере максимальная степень узла подграфов — 5, что намного ниже начального максимального значения. Очень важно помнить про этот компромисс при работе с GraphSAGE. PinSAGE использует другой способ выборки — метод случайного блуждания, у которого есть 2 главные функции.
Эта стратегия немного напоминает механизм быстрого внимания. Она присваивает узлам веса и повышает релевантность наиболее популярных из них. Агрегация Процесс агрегации определяет, как сочетать векторы признаков для получения вложений узла. В оригинальной документации представлены три способа агрегирования признаков:
Агрегатор средних значений — самый простой из них. Метод работы похож на подход GCN.
Затем результат можно передать в нелинейную функцию активации ? (например, tanh и ReLU). Эту технику мы будем использовать в PyG и именно ее выбрала компания UberEats. Выбор LSTM-агрегатора может показаться странной идеей, так как его архитектура последовательна — он задает порядок для неорганизованных узлов. Поэтому авторы случайным образом перемешивают их, чтобы заставить LSTM учитывать только скрытые признаки. Эта техника показывает наилучшие результаты в сравнительных тестах. Агрегатор подвыборки подает скрытый вектор каждого соседа в нейронную сеть с прямым распространением. К результату применяется операция подвыборки максимумов. 3. GraphSAGE в PyTorch Geometric Мы легко можем встроить архитектуру GraphSAGE в PyTorch Geometric с помощью слоя Создадим сеть с двумя слоями
Поскольку мы имеем дело с задачей классификации по множеству категорий, то будем использовать в качестве функции потерь кросс-энтропию. Чтобы показать преимущества GraphSAGE, сравним его с GCN и GAT без применения выборки: class GraphSAGE(torch.nn.Module): def forward(self, x, edge_index): def fit(self, data, epochs): self.train() # Обучение на пакетах # Подтверждение соответствия # Вывод метрик каждые 10 эпох В GraphSAGE мы просматриваем пакеты (4 подграфа), созданные процессом выборки по соседям. Из-за этого способ расчета точности и потерь при валидации также отличается. Вот результаты (с точки зрения точности и времени обучения) для GCN, GAT и GraphSAGE: GCN test accuracy: 78.40% (52.6 s) По показателям точности эти три модели имеют схожие результаты. Мы рассчитывали, что GAT покажет себя лучше, так как его механизм агрегации более детальный, но дело не всегда в этом. Реальная разница заключается во времени обучения: в данном случае GraphSAGE в 88 раз быстрее GAT и в 4 раза быстрее, чем GCN. Это и есть настоящая сила GraphSage. Мы теряем много информации, отсекая граф с помощью выборки по соседям. Последние вложения узла могут быть не такими хорошими, как при работе с GCN и GAT. Однако GraphSage создан для улучшения масштабируемости. В свою очередь, он может привести к построению графов больших размеров для лучшей точности. Данная работа была выполнена с помощью контролируемого обучения (классификации узлов), но GraphSAGE можно обучать и без учителя. В этом случае нельзя использовать потери кросс-энтропии. Мы должны разработать функцию потерь, которая бы заставляла узлы, находящиеся рядом в исходном графе, оставаться близко друг к другу в пространстве вложения. И наоборот, эта же функция должна гарантировать, что отдаленные узлы графа имеют такие же расстояния и в пространстве вложения. Это потери описываются в документации по работе с GraphSage. Модификации GraphSage, такие как PinSAGE и та, что использует UberEats, направлены на систему рекомендаций. Их задача состоит в том, чтобы ранжировать наиболее подходящие каждому пользователю элементы (пины, рестораны) несмотря на существенные отличия между ними. Нужно найти не только ближайшие вложения, но и максимально точно распределить их степень значимости. Вот почему эти системы также обучают без учителя, но с другой функцией потерь, которая измеряет относительное расстояние между точками входных данных. Заключение GraphSage — невероятно быстрая архитектура для обработки больших графов. Он может быть не так точен, как GCN и GAT, но его использование является важным при работе с большими объемами данных. Высокая скорость работы GraphSage достигается благодаря продуманной комбинации, состоящей из выборки по соседям для проряжения графа и быстрой агрегации. В данном примере использовался агрегатор средних значений. В этой статье мы выполнили следующее.
Читайте также:
Источник: Nuances of Programming Источник: m.vk.com Комментарии: |
|