Использование двунаправленных GRU с spaCy и пользовательскими вложениями

В последние годы фейковые новости становятся все более распространенными. Поскольку все больше и больше наших новостей потребляется из онлайн-источников, жизненно важно иметь возможность определить, реальны ли новости. Эта статья представляет собой забавный взгляд на то, как можно использовать подходы глубокого обучения для решения этой проблемы в Python.

Он разбит на 5 разделов:

  • Описание данных
  • Предварительная обработка
  • Встраивание слоев
  • Архитектура модели
  • Полученные результаты

Описание данных

Данные для этой задачи берутся из набора данных Kaggle, содержащего около 45 000 новостных статей. Около половины данных — это поддельные статьи, взятые с различных американских веб-сайтов, которые были признаны ненадежными организациями, занимающимися проверкой фактов, а другая половина — это настоящие статьи, взятые с американского новостного веб-сайта Reuters.

Пример того, как выглядят эти статьи, можно увидеть ниже.

Учитывая, что все статьи поступают из источников в США и что все настоящие статьи поступают из одного и того же источника в США, это явно не идеальный набор данных о фейковых новостях. Другие также выявили некоторую утечку в наборе данных. Утечка — это когда информация доступна в обучающих данных для модели для прогнозирования, к которой у нее не было бы доступа в реальном мире. В ходе предварительной обработки будут предприняты шаги, чтобы попытаться свести к минимуму последствия этой утечки.

Несмотря на эти недостатки, оригинальная статья, в которой был создан набор данных, имеет почти 200 ссылок в Google Scholar и, по-видимому, является одним из немногих общедоступных наборов данных о фальшивых новостях.

ПРЕДОСТЕРЕЖЕНИЕ.Описанный здесь подход может работать для этого конкретного набора данных, но, возможно, плохо подходит для других коллекций поддельных/настоящих новостей.

Предварительная обработка

Первым шагом в предварительной обработке является загрузка данных и создание поля, чтобы указать, была ли статья подделкой (1) или правдой (0). И заголовок, и текстовые поля (каждой статьи) используются для дедупликации данных, а затем объединяются в одно длинное поле «all_text». Для устранения ранее выявленных утечек столбцы даты и темы опущены, как и ряд информативных ключевых слов («рейтер», «политифакт» и т. д.).

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

Функции Keras Tokenizer и pad_sequences могут очень легко позаботиться об этом за нас.

Tokenizer отфильтровывает специальные символы и преобразует текст в нижний регистр. Затем он сопоставляет каждое уникальное слово (также известное как токен) с числом, так что теперь каждое слово во всех наших статьях может быть представлено одним числом. pad_sequences гарантирует, что все последовательности этих чисел имеют одинаковую длину (длиной 500 токенов) либо путем предварительного заполнения слишком коротких статей пробелами/нулями, либо путем усечения слишком длинных статей. Это необходимо, так как Keras требует, чтобы входные данные были одинаковой длины (более полное обсуждение см. здесь).

Мы можем убедиться, что все прошло по плану, изучив одну из наших статей. Мы можем сравнить 1-е 100 токенов для (например) 10-й статьи в обучающих данных с 1-ми 100 токенами 10-й статьи в токенизированных обучающих данных. Затем мы можем использовать метод sequences_to_texts из нашего объекта Tokenizer, чтобы преобразовать последовательность чисел обратно в слова и проверить, соответствует ли она исходному артикулу (за вычетом специальных символов и верхнего регистра).

Кажется, это сработало!

Встраивание слоев

Встраивание — это метод, часто используемый в обработке естественного языка для представления слов в уменьшенном количестве измерений. Например, если наш набор данных фальшивых новостей содержит словарь всего из 1000 слов (например, только 1000 уникальных слов), то каждое слово может быть представлено вектором из 999 нулей и одной 1. 999 случаев, когда оно не является одним из наших 1000 слов. и 1 случай, когда это 1 из наших 1000 слов. Это известно как горячее кодирование.

Хотя это относительно простой способ обработки текстовых данных, он неэффективен. Результирующие векторы будут очень разреженными — в нашем примере каждый вектор полностью разреженный, за исключением единственной 1. Кроме того, никакая информация об отношениях между словами не сохраняется. Именно здесь встраивающие слои демонстрируют свою ценность — они могут брать разреженные, многомерные, горячие кодированные векторы и представлять их в более плотном низкоразмерном пространстве. Дополнительным преимуществом этого подхода является то, что слова, имеющие сходное значение, теперь будут иметь аналогичное представление при их встраивании.

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

СПАСИ

spaCy — это библиотека с открытым исходным кодом для НЛП на Python. Мы будем использовать из него пакет en_core_web_sm, представляющий собой небольшой англоязычный пайплайн, обученный на блогах, новостях и комментариях (поэтому подходит для нашей задачи). Мы будем использовать предварительно обученное встраивание пакета с нашими данными, например. для представления наших текстовых данных во встраивании spaCy. Мы будем использовать его статически, установив trainable=False, как показано в коде ниже. В качестве альтернативы мы могли бы просто использовать встраивание spaCy для заполнения нашей модели, а затем обновлять ее на протяжении всего обучения. Тем не менее, это, возможно, делает более интересным сравнение с пользовательским встраиванием Keras, если встраивание spaCy остается фиксированным.

Керас / Пользовательский

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

Архитектура модели

Поскольку наши данные являются последовательными (например, слова в предложении), в создаваемой нами нейронной сети можно использовать Gated Recurrent Unit (подробнее см. здесь или здесь). Было обнаружено, что GRU работают аналогично другим рекуррентным единицам, таким как долговременная кратковременная память (LSTM) единица (Chung et al., 2014), но с дополнительным преимуществом, заключающимся в том, что их можно быстрее обучать.

Кроме того, мы будем использовать слой Keras Bidirectional. В то время как стандартный GRU обучается только один раз на входной последовательности, двунаправленный GRU будет обучаться дважды: один раз на входной последовательности и еще раз на обратной копии входной последовательности. Есть надежда, что это обеспечит дополнительный контекст для сети, что приведет к более быстрому и лучшему обучению. Действительно, было показано, что двунаправленные модели превосходят однонаправленные модели в других исследованиях по обнаружению фальшивых новостей (Bahad et al., 2019).

Для сети с встраиванием Keras сводка нашей модели будет выглядеть следующим образом:

Пакетная нормализация реализуется (при желании), как описано в оригинальной статье, которая ее представила, то есть после плотного линейного преобразования, но до нелинейной (ReLU) активации. Выходной слой — это просто стандартный плотный слой с 1 нейроном и сигмовидной функцией активации (которая сжимает прогнозы между 0 и 1), так что наша модель в конечном итоге предсказывает 0 или 1, подделку или правду.

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

Чтобы изменить модель для работы с встраиванием spaCy, нам просто нужно изменить embedding_layer = "spacy" в строке 73.

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

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

В целом, встроенная модель Keras показала лучшие результаты: точность теста составила 99,1 % по сравнению с 94,8 % модели spaCy.

Сделанный! С подходами глубокого обучения, которые мы использовали, мы, кажется, «решили» проблему идентификации фальшивых новостей для этого набора данных. Если другие наборы данных о фальшивых новостях создаются/открываются, было бы интересно посмотреть, как эти подходы обобщаются за пределами данных данных. В этих случаях использование предварительно обученного встраивания (например, нашего spaCy или, возможно, Word2Vec/GloVe и т. д.) может дать более сильные модели, чем обучаемое встраивание Keras.

Полный код и демонстрационный блокнот см. в репозитории GitHub!

Ссылки

Рекомендации

  • Ахмед Х., Траоре И., Саад С. (2018) «Обнаружение спама мнений и поддельных новостей с помощью текстовой классификации», Журнал безопасности и конфиденциальности, том 1, выпуск 1, Wiley, январь/февраль 2018 г.
  • Ахмед Х., Траоре И., Саад С. (2017) «Обнаружение поддельных новостей в Интернете с использованием анализа N-грамм и методов машинного обучения. В: Траоре И., Вунганг И., Авад А. (ред.) Интеллектуальные, безопасные и надежные системы в распределенных и облачных средах. ISDDC 2017. Конспект лекций по информатике, том 10618. Спрингер, Чам (стр. 127–138).
  • Бахад, П., Саксена, П. и Камаль, Р., 2019. Обнаружение поддельных новостей с использованием двунаправленной LSTM-рекуррентной нейронной сети. Procedia Computer Science, 165, стр. 74–82.
  • Чанг, Дж., Гулсере, К., Чо, К. и Бенжио, Ю., 2014. Эмпирическая оценка закрытых рекуррентных нейронных сетей при моделировании последовательности. препринт arXiv arXiv:1412.3555.
  • Иоффе С., Сегеди К. (2015) Пакетная нормализация: ускорение обучения глубокой сети за счет уменьшения внутреннего ковариатного сдвига. https://doi.org/10.48550/arXiv.1502.03167
  • Утечки информации в наборе данных Kaggle Fake News
  • Kaggle Fake News Dataset, Клеман Бисайон