Сегодня ясный и практический взгляд на теорию GCN. Мы рассмотрим реализацию PyTorch 🔦 GCN 👩‍🎓 от Kipf. Затем мы применим то, что узнали, к ненавистному набору данных Twitter 🔥

Мои предыдущие посты о графах и машинном обучении:

Поддержите меня, когда я присоединюсь к Medium по моей реферальной ссылке:



Добро пожаловать в мою серию статей о графовых нейронных сетях! В предыдущем посте мы исследовали теорию и математические основы графовых сверточных нейронных сетей. Сегодня мы рассмотрим реализация GCN на PyTorch от Kipf, попытаемся упростить реализацию и применить GCN к набору данных ненависть/обычные пользователи Twitter. Наслаждаться :)

Перевести теорию GCN на PyTorch

Наследование PyTorch nn.Module

В PyTorch обычной практикой является создание собственного модуля для создания модели с использованием torch.nn.Module Это создает объект Python, который позволяет создавать сложные модули. Пользовательские модули — это классы, являющиеся дочерними элементами пакета torch.nn.Module, унаследовавшие все методы и атрибуты:

class MyNetwork(nn.Module) определяет дочерний класс, который затем, аналогично nn.Module, хочет, чтобы конструктор был определен с размером входной и выходной сети ( in_size и output_size соответственно). В конструкторе вызывается суперконструктор super(). Это позволяет создать объект из пакета torch.nn.Module внутри объекта MyNetwork без его явной инициализации. Затем можно настроить сетевые слои и шаг forward, который, опять же, унаследован от nn.Module.

Применение nn.Module к базовой операции GCN:layers.py

По этой же схеме Kipf реализует логику GCN в layers.py: https://github.com/tkipf/pygcn/blob/master/pygcn/layers.py. который представляет собой произведение матрицы графа смежности на входной массив признаков графа и веса i-го слоя:

Параметры веса и смещения определяются как torch.nn.parameter объектов и генерируются путем случайной выборки из равномерного распределения. Шаг forward обновляет веса слоев, вычисляя уравнение 10 из предыдущей статьи.

Объединение слоев: модель GCN в models.py

Теперь, когда у нас реализован базовый строительный блок, мы можем приступить к реализации модели GCN. Согласно статье Кипфа, GCN состоит из 2 слоев, одного входного слоя и одного скрытого слоя, которые объединяются посредством активации ReLu. Кроме того, у нас может быть отсеваемый слой, в котором часть входных тренировочных данных отбрасывается, для дальнейшего прогнозирования слоев прочности. Конечный результат задается как логарифм softmax, экв. 1

Подготовка входных данных

После настройки базовой модели мы можем взглянуть на входные данные. Kipf предложил данные из датасета Cora (https://paperswithcode.com/dataset/cora;
CC0: Public Domain)[1,4]. Набор данных Cora состоит из документов по машинному обучению, которые классифицируются по 7 классам: case_based, genetic_algorithms, neural_networks, probabilistic_methods, reinforcement_learning, rule_learning, theory. Общее количество бумаг равно 2708, что и будет количеством узлов. С удалением корней и стоп-слов окончательный набор данных будет содержать только 1433 уникальных слова, что и будет количеством признаков. Таким образом, граф может быть представлен матрицей 2708 x 1433, где единицы и нули зависят от наличия определенного слова. Из бумажного файла цитат можно получить список ребер и создать из него матрицу смежности 2708 x 2708. Данные создаются через служебный скрипт utils.py. Как только эти элементы созданы, можно переходить к этапу обучения.

Обучение модели GCN с помощью набора данных Cora

Рис.4 суммирует все этапы GCN. Данные загружаются для создания матрицы признаков X и матрицы смежности adj. Эти элементы могут быть приняты моделью GCN, которая преобразует данные посредством умножения Лапласа, возвращая вероятность 7 классов для каждого узла.

На рис. 5 показан фрагмент кода Кипфа для обучения модели GCN. Основной бит — это функция поезда. Здесь изначально градиент устанавливается равным нулю через optimiser.zero_grad(). Затем выходные данные модели вычисляются как output = model(features, adj). Наконец, выполняется проверка производительности и потери модели с вычислением отрицательного логарифмического правдоподобия, которое обновляет веса сети, и точности, которые оценивают качество модели по сравнению с набором данных для оценки.

Играйте с GCN и предсказывайте ненавистных пользователей в Twitter

Пришло время поиграть с причудливым набором данных и GCN. Набор данных — ненавистные пользователи Твиттера[2] (CC0: Public Domain License) с описаниями в его статье [2]. Набор данных имеет 100 000 пользователей. 5000 пользователей помечены как разжигающие ненависть, а именно, они размещают посты с ненавистью в Твиттере. У каждого пользователя есть набор определенных и разработанных вручную функций, users_neightborhood_anon.csv, где твиты были закодированы с помощью вложений GloVe [3]. Цель состоит в том, чтобы использовать сетевую информацию, чтобы предсказать, какие пользователи также могут быть ненавистными. Пример свободно вдохновлен этим руководством: https://stellargraph.readthedocs.io/en/v1.0.0rc1/demos/interpretability/gcn/hateful-twitters-interpretability.html

Загрузка данных и предварительная обработка

Во-первых, нам нужно загрузить данные и разархивировать файлы. В этом примере мы собираемся использовать API Kaggle через блокнот Google Colab:

!pip install kaggle --upgrade
# download from your kaggle account the token file kaggle.json
!mkdir /root/.kaggle 
!cp kaggle.json /root/.kaggle/. 
!mkdir dataset 
!kaggle datasets download -d manoelribeiro/hateful-users-on-twitter -p dataset/
# unzip the files 
!unzip dataset/*.zip

Для этого примера нужны файлы users_neighborhood_anon.csv и список ребер из users.edges.

Функции узлов создаются вручную, однако преимущество графических нейронных сетей заключается в том, что они могут избавиться от этих функций, поскольку они могут извлекать сетевую информацию, которая имеет решающее значение для правильной классификации. По этой причине мы собираемся очистить входной набор данных и уменьшить размер признаков с 1039 до 206:

Отсюда мы можем начать подготовку набора данных для прогнозирования с помощью GCN. Во-первых, мы выбираем всех тех пользователей, которые были помечены как normal и hate (всего 4971). Затем можно прочитать ребра и выбрать подграф с индексами узлов, которые были отфильтрованы, и, наконец, мы можем создать список смежности.

Матрица смежности — это разреженный тип, созданный с помощью scipy.sparse.coo_martrix, как мы видели в коде Кипфа.

Последним шагом является подготовка матрицы смежности и функций для загрузки GCN. В этом случае мы собираемся нормализовать значения признаков, так как свойства смежности уже нормализованы, и мы собираемся определить некоторые выборочные показатели для обучения (0–1000), оценки (1000–1200) и тестирования ( 1200–1400).

Тренируйте GCN на ненавистном наборе данных Twitter

Последний шаг точно следует коду Кипфа. Мы собираемся назвать модель GCN и оптимизатор Адама. Оттуда мы запускаем программу обучения для заданного количества эпох и будем измерять точность.

В этом случае мы определили размер скрытого слоя равным 16, но не стесняйтесь изменять его, а количество выходных классов равно 2 (normal или hate). Мы можем собрать данные о потерях и точности по эпохам и увидеть сходимость после 50 эпох, в то время как точность достигает 0,89 для оценочного набора.

Это всего лишь небольшой пример красоты GCN. Вы можете взять это домашнее задание для дальнейшей практики и изучения возможностей GCN:

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

На сегодня это все :) Оставайтесь с нами для следующего графического приключения!

Пожалуйста, не стесняйтесь присылать мне электронное письмо с вопросами или комментариями по адресу: [email protected] или прямо здесь, в Medium.

Библиография

  1. Сен, Притхвирадж и др. «Коллективная классификация сетевых данных». Журнал AI 29.3 (2008): 93–93.
  2. Рибейро, Маноэль Орта и др. «Характеризация и обнаружение ненавистных пользователей в Твиттере». Двенадцатая международная конференция AAAI в Интернете и социальных сетях. 2018.
  3. Пеннингтон, Джеффри, Ричард Сочер и Кристофер Д. Мэннинг. «Перчатка: глобальные векторы для представления слов». Материалы конференции 2014 года по эмпирическим методам обработки естественного языка (EMNLP). 2014.
  4. МакКаллум, Эндрю Качитес и др. «Автоматизация создания интернет-порталов с помощью машинного обучения». Информационный поиск 3.2 (2000): 127–163.