Подход на основе графа с полуконтролем для классификации и вывода текста

В этой статье я подробно расскажу о текстовой сверточной сети графов (GCN) и ее реализации с использованием PyTorch и стандартных библиотек. Модель GCN на основе текста - это интересная и новая современная концепция полууправляемого обучения, которая была предложена недавно (расширяя предыдущую идею GCN компанией Kipf et al . на нетекстовых данных), который может очень точно вывести метки некоторых неизвестных текстовых данных с учетом связанных известных помеченных текстовых данных.

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

Здесь мы реализуем текстовую GCN, используя Библию в качестве корпуса, который был выбран, потому что это одна из самых читаемых книг в мире и содержит богатую текстовую структуру. Библия (протестантская) состоит из 66 книг (Бытие, Исход и т.д.) и 1189 глав. Здесь частично контролируемая задача состоит в том, чтобы обучить языковую модель, которая способна правильно классифицировать Книгу, к которой принадлежат некоторые немаркированные главы, учитывая известные названия других глав. (Поскольку мы действительно знаем точные названия всех глав, мы намеренно замаскируем ярлыки примерно 10–20% глав, которые будут использоваться в качестве набора тестов во время вывода модели для измерения точности модели)

Чтобы решить эту задачу, языковая модель должна уметь различать контексты, связанные с различными Книгами (например, Книга Бытия больше говорит об Адаме и Еве, а Книга Экклезиаста рассказывает о жизни царя Соломона). Полученные хорошие результаты модели текст-GCN, как мы увидим ниже, показывают, что структура графа способна относительно хорошо улавливать такой контекст, где документ (глава) - края слова кодируют контекст внутри глав, а слово - края слова кодируют относительный контекст между главами.

Хорошее и подробное объяснение графических нейронных сетей в целом вы можете найти в этой замечательной статье https://neptune.ai/blog/graph-neural-network-and-some-of-gnn-applications

Используемый здесь текст Библии (версия BBE) любезно предоставлен https://github.com/scrollmapper/bible_databases.

Реализация соответствует статье о сверточной сети на основе текстовых графов (https://arxiv.org/abs/1809.05679)

Исходные коды для реализации можно найти в моем репозитории GitHub (https://github.com/plkmo/Bible_Text_GCN)

Если вы хотите попробовать text-GCN в своем собственном корпусе, я создал набор инструментов NLP, состоящий из современных моделей, одна из которых реализует text-GCN для легкой классификации текста (среди других задач). Вы можете использовать его здесь (https://github.com/plkmo/NLP_Toolkit).

Представление Корпуса

Следуя статье, чтобы позволить GCN улавливать контексты глав, мы строим граф с узлами и ребрами, которые представляют отношения между главами и словами. Узлы будут состоять из всех 1189 глав (документов) плюс весь словарь (слова) с взвешенными краями документ-слово и слово-слово между ними. Их вес A_ij определяется по формуле:

где PMI - это точечная взаимная информация между парами совпадающих слов в скользящем окне #W, которое, как мы зафиксировали, имеет длину 10 слов. #W (i) - это количество скользящих окон в корпусе, которые содержат слово i, #W (i, j) - это число скользящих окон, содержащих слова i и j, а #W - общее количество скользящих окон в корпусе. TF-IDF - это обычный термин, обратный частоте слова в документе. Интуитивно понятно, что высокий положительный PMI между парами слов означает, что они имеют высокую семантическую корреляцию, и наоборот, мы не строим границы между словами с отрицательным PMI. В целом, края документа-слова, взвешенные по TF-IDF, захватывают контекст внутри документа, а края слова-слова, взвешенные по PMI (которые могут охватывать документы), захватывают контексты всего документа.

Для сравнения, для моделей, не основанных на графах, такую ​​информацию о контексте всего документа нелегко предоставить в качестве входных функций, и модели пришлось бы изучать их самостоятельно «с нуля» на основе меток. Поскольку дополнительная информация о взаимосвязи между документами предоставляется в GCN, что определенно актуально для задач NLP, можно было бы ожидать, что GCN будет работать лучше.

  1. Расчет TF-IDF

Расчет TF-IDF относительно прост. Мы знаем математику и понимаем, как это работает, поэтому мы просто используем модуль TfidfVectorizer sklearn с текстами наших документов 1189 и сохраняем результат во фрейме данных. Это будет использоваться для весов слов документа, когда мы создадим график позже.

2. Вычисление точечной взаимной информации между словами

Вычислить PMI между словами сложнее. Во-первых, нам нужно найти совпадения слов i, j в скользящем окне из 10 слов, хранящемся в виде квадратной матрицы в кадре данных, где строки и столбцы представляют словарь. Исходя из этого, мы можем рассчитать PMI, используя определение ранее. Аннотированный код для расчета показан выше.

3. Постройте график

Теперь, когда у нас есть все веса для ребер, мы готовы построить граф G. Мы используем модуль networkx для его создания. Здесь стоит отметить, что большая часть сложных вычислений для обработки данных во всем этом проекте тратится на построение границ слово-слово, поскольку нам нужно перебирать все возможные попарные словосочетания для словаря примерно из 6500 слов. . К счастью, есть эффективный способ реализовать это, и он занял всего около 3 минут. Фрагмент кода для наших вычислений показан ниже.

Сверточная сеть с графами

В сверточных нейронных сетях для задач, связанных с изображениями, у нас есть сверточные слои или фильтры (с обучаемыми весами), которые «пропускают» группу пикселей для создания карт характеристик, которые изучаются в процессе обучения. Теперь представьте, что эта группа пикселей является узлами вашего графа. Аналогичным образом у нас будет набор фильтров с обучаемыми весами W, которые «пропускают» эти узлы графа в GCN.

Однако есть большая проблема: узлы графа на самом деле не имеют четкого представления о физическом пространстве и расстоянии, как пиксели (мы не можем сказать, что узел находится справа или слева от другого). Таким образом, чтобы осмысленно сворачивать узлы с помощью нашего фильтра W, мы должны сначала найти представления функций для каждого узла, которые лучше всего отражают структуру графа. Для опытных читателей авторы решили эта проблема заключается в проецировании весов фильтра W и пространства признаков X для каждого узла в пространство Фурье графа, так что свертка становится просто точечным умножением узлов с особенностями. Для более глубокого погружения в вывод, оригинальная статья Кипфа и др.. это хорошая отправная точка. В противном случае читатели могут просто обойтись этим интуитивным объяснением и продолжить.

Мы собираемся использовать здесь двухслойную GCN (функции свертываются дважды), поскольку, согласно их статье, она дает наилучшие результаты. Сложный тензор выходных признаков после двухслойной GCN задается следующим образом:

куда

Здесь A - это матрица смежности графа G (с диагональными элементами, равными 1, чтобы представить самостоятельное соединение узлов), а D - матрица степеней G. W_0 и W_1 - это обучаемые веса фильтра для первого и второго слоя GCN соответственно, которые необходимо обучить. X - это входная матрица характеристик, которую мы принимаем за диагональную квадратную матрицу (из единиц) той же размерности, что и количество узлов, что просто означает, что входные данные одноразовое кодирование каждого из узлов графа. Окончательный результат затем передается в слой softmax с функцией кросс-энтропийных потерь для классификации с 66 различными метками, соответствующими каждой из 66 книг.

Ниже представлена ​​реализация двухуровневой архитектуры GCN в PyTorch.

Фаза обучения

Из 1189 глав мы замаскируем ярлыки 111 из них (около 10%) во время обучения. Поскольку распределение меток классов по 1189 главам сильно искажено (рисунок выше), мы не будем маскировать ни одну из меток классов тех глав, в которых их общее количество меньше 4, чтобы гарантировать, что GCN может изучить представления из всех 66 уникальных метки классов.

Мы обучаем модель GCN минимизировать кросс-энтропийные потери немаскированных меток. После обучения GCN для 7000 эпох мы будем использовать модель, чтобы вывести метки Книги 111 замаскированных глав и проанализировать результаты.

Полученные результаты

Из приведенного выше графика потерь и эпох мы видим, что обучение проходит довольно хорошо и начинает насыщаться примерно через 2000 эпох.

По мере того, как обучение продолжается, точность обучения, а также точность вывода (замаскированных узлов), как видно, возрастают вместе, примерно до 2000 эпох, когда точность вывода начинает насыщаться примерно на уровне 50%. Учитывая, что у нас есть 66 классов, у которых будет базовая точность 1,5%, если мы предположим, что модель предсказывает чисто случайно, таким образом, точность вывода 50% уже кажется довольно хорошей. Это говорит нам о том, что модель GCN может правильно вывести книгу, к которой принадлежит данная немаркированная глава, примерно в 50% случаев после правильного обучения на помеченных главах.

Неверно классифицированные главы

Модель GCN способна довольно хорошо улавливать контексты внутри документа и между документами, но как насчет неправильно классифицированных глав? Означает ли это, что модель GCN на них не удалась? Давайте посмотрим на некоторые из них, чтобы узнать.

  • Книга: Матфей
    Глава 27: «Теперь, когда было утро, все первосвященники и власть имущие собрались вместе, чтобы предать Иисуса смерти. И они повесили на Него веревки, и взяли Его, и предали Пилату, начальнику. Тогда Иуда, лживый Ему, видя, что Он должен быть предан смерти, в своем сожалении вернул тридцать сребреников первосвященникам и власть имущим, сказав: Я поступил неправильно, отдав в ваши руки честный человек. Но они сказали, что нам до того? Это твое дело. и он положил серебро в храме, и, выйдя, умер через повешение. И взяли первосвященники серебро и сказали: нельзя класть его в храмовую кладовую, потому что это цена крови. И они решили получить за серебро поле горшечника, как место для мертвых из других стран. По этой причине это поле было названо ... Он воскрес из мертвых: и последняя ошибка будет хуже первой. Пилат сказал им: у вас есть сторожа; иди и сделай это как можно безопаснее. И они пошли, и сделали безопасным место, где было Его тело, поставив печать на камне, и стражи были с ними. »
    Предсказано как: Лука

В данном случае глава 27 книги Матфея была ошибочно отнесена к книге Луки. Сверху мы видим, что в этой главе говорится о том, что Иисус был казнен первосвященниками и умирает за наши грехи, а также о вине Иуды после того, как он предал Иисуса. Эти события также упоминаются в Евангелии от Луки! (а также у Марка и Иоанна) Скорее всего, поэтому модель классифицировала его как Люка, поскольку у них схожий контекст.

  • Книга: Исаия
    Глава 12: «И в тот день скажешь, что я восхваляю Тебя, Господи; Ибо, хотя Ты рассердился на меня, гнев Твой отвратился, и я утешился. Видите, Бог - мое спасение; Я буду иметь веру в Господа без страха: ибо Господь - сила и песня моя; и Он стал моим спасением. Так с радостью вы получите воду из источников спасения. И в тот день ты скажешь: воздай хвалу Господу, да прославится имя Его, расскажи о делах Его среди народов, скажи, что имя Его вознесено. Песнь Господу; ибо Он сделал благородные дела: возвещал о них по всей земле. Пусть твой голос звучит в крике радости, о дочь Сиона, ибо велик среди тебя Святый Израилев ».
    Предсказано как Псалтырь.

Здесь 12-я глава из Книги Исаии ошибочно считается из Книги Псалмов. Из этого отрывка ясно, что рассказчик в 12 главе Исаии говорит о вознесении и воспевании хвалы Богу, Его утешителю и источнику спасения. Этот контекст восхваления Бога и ожидания Его утешения - это как раз вся тема Книги Псалмов, где Давид записывает свои хвалы и молитвы Богу на протяжении всех своих успехов, испытаний и невзгод! Следовательно, неудивительно, что модель классифицирует его как Псалтирь, поскольку они имеют схожий контекст.

Заключение

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

Приложения GCN на самом деле довольно надежны и далеко идущие, и в этой статье дается только беглое представление о том, на что они способны. В целом, за исключением задачи, представленной здесь, GCN можно использовать всякий раз, когда кто-то хочет объединить мощь представлений графов с глубоким обучением. Чтобы предоставить несколько интересных примеров для дальнейшего чтения, GCN использовался в сочетании с Рекуррентными нейронными сетями (RNN) / Долгой краткосрочной памятью (LSTM) для динамического прогнозирования сети / узла / границы. Он также успешно применялся для динамической оценки позы человеческого скелета путем моделирования человеческих суставов в виде узлов графа, а взаимосвязи между структурами человеческого тела и временными рамками и внутри них - в виде ребер графа.

Спасибо за чтение, и я надеюсь, что эта статья очень помогла объяснить его внутреннюю работу.

Полезные ссылки

  1. Реализация Text-GCN в тексте Библии - https://github.com/plkmo/Bible_Text_GCN
  2. Реализация Text-GCN в общем корпусе (среди других задач NLP) - https://github.com/plkmo/NLP_Toolkit

Ссылки

  1. Томас Н. Кипф, Макс Веллинг, Полууправляемая классификация с графовыми сверточными сетями (https://arxiv.org/abs/1609.02907) (2016)
  2. Лян Яо, Чэншэн Мао, Юань Луо, Сверточные сети графов для классификации текста (https://arxiv.org/abs/1809.05679) (2018)

Чтобы быть в курсе последних тенденций, статей и новостей в области ИИ / науки о данных, посетите мой @followai_bot (https://t.me/followai_bot), ваш персонализированный бот Telegram для ИИ / науки о данных.