Краткий обзор основных компонентов Graph-Nets

В октябре 2018 года команда из 27 исследователей из DeepMind / Google, Массачусетского технологического института и Эдинбургского университета опубликовала статью, озаглавленную: Реляционные индуктивные предубеждения, глубокое обучение и графовые сети.



Библиотека Graph Nets
Graph Nets - это библиотека DeepMind для построения сетей графов в TensorFlow и Sonnet. deepmind.com





Суть статьи частично является «позиционным документом», а также практической реализацией, поскольку она включает библиотеку для построения нейронных сетей графов в TensorFlow и Sonnet (Sonnet - это библиотека DeepMind для нейронных сетей поверх TensorFlow). На сегодняшний день на эту статью было цитировано почти 1000 ссылок, поэтому она требует более тщательного изучения.



В этой заметке мы с Марком Нидхэмом сначала суммируем основные теоретические аргументы, изложенные в статье, а затем проиллюстрируем библиотеку Graph-Net на игрушечном примере.

TL; DR: Graph-Nets - это модель нейронной сети Graph и библиотека нижнего уровня DeepMind, которая предлагает такую ​​гибкость, что практически любую существующую GNN можно реализовать с использованием 6 основных функций и расширить до Временные графы.

В теории…

Предпосылка статьи заключается в следующем: для достижения ИИ человеческих способностей он должен применять Комбинаторное обобщение (CG), а для реализации этой цели он должен искажать свое обучение. к структурированным представлениям и вычислениям.

Комбинаторное обобщение определяется:

«как построение новых выводов, прогнозов и поведения на основе известных строительных блоков».

Неформально: небольшой набор элементов, таких как слова, можно продуктивно составлять неограниченным количеством способов, таких как предложения или книга. Люди обладают способностью «бесконечно использовать конечные средства».

Тогда, как мы можем улучшить возможности ИИ для компьютерной графики?
Мы делаем это с помощью вышеупомянутого «смещения обучения в сторону структурированных представлений и вычислений… и, в частности, систем, которые работают с графами» ». Или, говоря более кратко: тезис статьи состоит в том, что для развития ИИ нам нужно перейти к обучению на графиках.

В статье этот подход формализуется, определяя «реляционное мышление» и «индуктивное смещение» следующим образом:

«Реляционное мышление определяется как манипулирование структурированными представлениями сущностей и отношений с помощью правил».

Сущности - это элементы с атрибутами, следовательно, узлы, отношение - это отношение между ними, а 'правило' - это функция, которая сопоставляет сущности и отношения к другим объектам и отношениям.

индуктивное смещение (или смещение обучения) - это набор допущений, которые алгоритм обучения использует для прогнозирования выходных данных заданных входных данных, с которыми он не сталкивался.

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

Затем «относительное индуктивное смещение» называется индуктивным смещением, которое накладывает ограничения (т. Е. Допущения / смещения) на отношения и взаимодействия между объектами в процессе обучения. Примером может служить многослойный персептрон (MLP), в котором иерархическая обработка является типом реляционного индуктивного смещения.

Да, все это звучит чудесно, но вы, должно быть, уже думали о том, как я могу использовать это на реальных графиках?

Что ж, в статье содержится жалоба на отсутствие модели с явным представлением сущностей и отношений и алгоритмов обучения, которые находят правила для вычисления их взаимодействий.
И затем подчеркивает, что в целом графы - это представление, которое поддерживает произвольную (попарную) реляционную структуру, а вычисления над графами действительно дают сильное реляционное индуктивное смещение, более превосходное чем RNN, CNN и т. д.

Таким образом, авторы вводят понятие «Графические сети (GN)», определяемое как:

«Фреймворк GN определяет класс функций для реляционных рассуждений и представлений с графической структурой»

Таким образом, структура GN фактически обобщает и расширяет существующие нейронные сети графов. Ключевым расширением, предлагаемым платформой GN, является ее способность обрабатывать И предсказывать последовательности графиков и, таким образом, траекторию динамической системы во времени. Теоретически игровой пул можно смоделировать:

Основной единицей вычислений в среде GN является «блок GN», который представляет собой переходную модель графа в график модель, которая принимает граф в качестве входных данных, выполняет вычисления структура и возвращает график в качестве вывода.

В коде такой блок представлен «GraphsTuple». Блок GN состоит из 6 основных функций:

  • 3 функции «обновления»: по одной для каждого узла, ребра и глобального атрибута.
  • 3 функции «агрегирования»: агрегирование атрибутов ребра для каждого узла и агрегирование атрибутов ребер и узлов глобально.

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

На практике…

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

Графики…

  • направленные (односторонние края),
  • с атрибутами (допускаются функции на уровне узлов, ребер и графов),
  • мультиграфы (несколько ребер могут соединять любые два узла, допускается использование собственных ребер).

Чтобы создать GraphsTuple и, следовательно, Graph, нам нужно создать список словарей с ключами: globals, nodes и edges, которые представляют соответствующие векторы функций с плавающей запятой.

Список ребер представлен senders и receivers, представленными индексом узла с целочисленным значением.

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

Пример создания графа в Graph-Nets:



Этот график в GraphsTuple можно визуализировать следующим образом:

Библиотека и приложение Graph-Nets

Повторюсь, структура GN определяет класс функций, и поэтому библиотека Graph-Nets перечисляет 51 класс функций.

Их можно разделить на три основных части.

  • Во-первых, основные модули задаются graph-nets.modules и состоят из 7 классов.
  • Во-вторых, для создания собственных модулей графической сети необходимо развернуть классы в graph_nets.blocks и
  • Наконец, оставшиеся функции - это служебные функции.

Мы кратко опишем и проиллюстрируем построение двух модулей: GraphNetwork и InteractionNetwork.

Как создать экземпляр сетевого модуля графа?

Реализация сети Graph по существу выполняется с использованием класса modules.GraphNetwork и создает основной блок GN.
Эта конфигурация может принимать три обучаемые подфункции для edge, node и global и являются вызовами библиотеки и модулей Sonnet.
Это могут быть линейные модули (snt.Linear) или многослойный персептрон (snt.nets.MLP) или потенциально любой из 14 классов в Рекуррентном модуле Sonnet.



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

После создания GraphsTuple, как мы делали ранее, остается работа по созданию GraphNetwork, чтобы указать эти функции, и пример следующий:

OUTPUT_EDGE_SIZE = 6
OUTPUT_NODE_SIZE = 5
OUTPUT_GLOBAL_SIZE = 3
graph_network = modules.GraphNetwork(
 edge_model_fn=lambda: snt.Linear(output_size=OUTPUT_EDGE_SIZE),
 node_model_fn=lambda: snt.Linear(output_size=OUTPUT_NODE_SIZE),
 global_model_fn=lambda: snt.Linear(output_size=OUTPUT_GLOBAL_SIZE))
output_graphs = graph_network(graphs_tuple)

Сети взаимодействия

Пример Нейронной сети передачи сообщений приведен в modules.InteractionNetwork, который реализует работу из статьи Баттальи и др .: Сети взаимодействия для изучения объектов, отношений и физики. Здесь авторы разработали модель, которая может рассуждать о том, как взаимодействуют объекты в сложных системах, и для которой компонент передачи сообщений является важной частью.



Здесь снова, как только GraphsTuple создан, для него требуется только указать функции Sonnet и передать GraphsTuple, как показано ниже:

interact = modules.InteractionNetwork(
 edge_model_fn=lambda: snt.Linear(output_size=OUTPUT_EDGE_SIZE),
 node_model_fn=lambda: snt.Linear(output_size=OUTPUT_NODE_SIZE)
)
interact_graph = interact(graphs_tuple)

Это вернет GraphsTuple с обновленными ребрами и узлами следующим образом:

Как видно, узлы и грани существенно трансформируются и расширяются, обеспечивая основу для сетевой модели взаимодействия.

Авторы также предоставляют ряд рабочих примеров в виде записных книжек.



Заключение

Graph-Nets - это низкоуровневая библиотека для построения GNN в TensorFlow / Sonnet, которая предлагает значительную гибкость, позволяя реализовать большинство, если не все существующие архитектуры GNN.

Возможность составлять «блоки GN» позволяет создавать последовательности графиков и вычислений в динамических системах.

Что касается будущей работы, мы намерены изучить, как мы можем интегрировать Graph-Nets с Neo4j, а также изучить другие библиотеки GNN, такие как jraph и Deep Graph Library.