📰 Создание заголовков из новостных статей с использованием моделей seq2seq.

Совместная работа Кристиана Шефера (старший инженер по машинному обучению @ Axel Springer AI) и Dat Tran (руководитель AI @ Axel Springer AI).

В Axel Springer, крупнейшем цифровом издательстве Европы, мы размещаем множество новостных статей из различных СМИ, таких как Welt, Bild, Business Insider и многих других. Возможно, самая важная часть новостной статьи - это ее название, и неудивительно, что журналисты, как правило, тратят изрядное количество времени, чтобы придумать хорошую. По этой причине для нас, в Axel Springer AI, возник интересный вопрос, можем ли мы создать модель НЛП, которая генерирует качественные заголовки из новостных статей Welt (см. Рисунок 1). Это могло бы, например, послужить нашим журналистам вдохновением для создания SEO-заголовков, на которые у наших журналистов часто нет времени (на самом деле мы работаем вместе с нашими коллегами из SPRING и AWS над созданием генератора SEO-заголовков) .

Рисунок 1. Один пример из нашего генератора заголовков Welt.de.

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

Это не новая тема

Создание заголовков новостей - не новая тема. Константин Лопырев уже использовал глубокое обучение в 2015 году для создания заголовков 6 крупных информационных агентств, включая New York Times и Associated Press. В частности, он использовал архитектуру нейронной сети кодер-декодер (блоки LSTM и внимание, см. Рисунок 2) для решения этой конкретной проблемы. В целом создание заголовков можно рассматривать как проблему резюмирования текста, и в этой области было проведено множество исследований. Мягкое введение в эту тему можно найти на Мастерстве машинного обучения или FloydHub.

Рис. 2. Модель "последовательность-последовательность" кодер-декодер.

Почему хедлайнер?

Когда мы начали этот проект, мы провели небольшое исследование существующих библиотек. На самом деле существует множество библиотек, таких как Facebook fairseq, Googles seq2seq и ​​OpenNMT. Хотя эти библиотеки великолепны, у них есть несколько недостатков для нашего варианта использования. Например, первый не уделяет особого внимания производству, а Google активно не поддерживает. OpenNMT был ближе всего к нашим требованиям, поскольку он уделяет большое внимание производству. Однако мы хотели предоставить более компактный репозиторий, который пользователь мог бы легко настраивать и расширять.

Поэтому мы создали нашу библиотеку, имея в виду следующие цели:

  • Предоставьте простой в использовании API как для обучения, так и для развертывания
  • Воспользуйтесь всеми новыми функциями TensorFlow 2.x, такими как tf.function, tf.keras.layers и т. Д.
  • Иметь модульную конструкцию и легко подключаться к другим библиотекам, таким как Huggingface’s transformers или SpaCy.
  • Возможность расширения для различных моделей кодировщика-декодера
  • Работа с большими данными

Создание библиотеки

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

  • Интеграция Keras с API создания подклассов моделей
  • Активное выполнение по умолчанию, которое позволяет разработчикам отлаживать выполнение графов вычислений
  • Возможность писать операции с графами с естественным синтаксисом Python, которые интерпретируются AutoGraph

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

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

Рисунок 3. Структура модели для (де) -сериализации.

Как только кодовая база была создана, мы начали добавлять более сложные модели, такие как повторяющиеся сети на основе внимания и Transformer. Наконец, мы реализуем сумматор SOTA, основанный на тонкой настройке предварительно обученных языковых моделей BERT.

Добро пожаловать, BertSum

Во время нашего проекта Spring по созданию заголовков для SEO AWS указала на недавнюю модель SOTA для абстрактного резюмирования текста под названием BertSum [1] и доказала ее эффективность для создания заголовков Welt. Следовательно, мы подумали, что внедрить BertSum в наш конвейер - хорошая идея.

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

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

В Headliner этот этап предварительной обработки выполняется классом BertPreprocessor, который внутренне использует SpaCy Sentencizer для разделения. Затем статья сопоставляется с двумя последовательностями, сначала с последовательностью индекса токена, а затем с последовательностью индекса сегмента, чтобы различать несколько предложений (см. Рисунок 4).

Рисунок 4: Архитектура исходной модели BERT (слева) и BertSum из [1] (справа). Для BertSum несколько предложений заключены в токены [CLS] и [SEP], а встраивание сегментов используется для различения нескольких предложений.

Модель BertSum состоит из предварительно обученной модели BERT в качестве кодировщика и стандартного преобразователя в качестве декодера. Предварительно обученный кодировщик тщательно настраивается, тогда как декодер обучается с нуля. Чтобы справиться с этим несоответствием, необходимо использовать два отдельных оптимизатора с разной скоростью обучения и расписаниями. Мы обнаружили, что обучение относительно чувствительно к гиперпараметрам, таким как скорость обучения, размер пакета, отсев и т. Д., Что требует некоторой тонкой настройки для каждого набора данных. Мы обучили модель на наборе данных из 500 тыс. Статей с заголовками из газеты WELT и были очень впечатлены результатами, пример ниже:

(ввод) Drei Arbeiter sind in der thailändischen Hauptstadt Bangkok vom 69 Stockwerk des höchsten Wolkenkratzers des Landes in den Tod gestürzt. Die Männer befanden sich mit zwei weiteren Kollegen auf einer am 304 Meter hohen Baiyoke-Hochhaus herabgelassenen Arbeitsbühne, um Werbung anzubringen, wie die Polizei am Montag mitteilte. Plötzlich sein ein Stützkabel gerissen, worauf die Plattform in zwei Teile zerbrochen sei. Nur zwei der fünf Männer konnten sich den Angaben zufolge rechtzeitig an den Resten der Arbeitsbühne festklammern. Sie wurden später vom darunter liegenden Stockwerk aus gerettet.

(target) [CLS] Unfälle: Drei Arbeiter stürzten в Бангкоке vom 69. Stock in den Tod [SEP]

(прогноз) [CLS] Unglücke: Drei Arbeiter stürzen von höchstem Wolkenkratzer в Бангкоке в ден Тод [SEP]

[1] Лю Ю., Лапата М., 2019. Резюмирование текста с помощью предварительно обученных кодировщиков. Препринт arXiv arXiv: 1908.08345.

Как пользоваться библиотекой

Для начала вы можете использовать готовую библиотеку для обучения модели сумматора. Просто установите Headliner через pip:

pip install headliner

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

from headliner.trainer import Trainer
from headliner.model.transformer_summarizer import TransformerSummarizer

data = [('You are the stars, earth and sky for me!', 'I love you.'),
        ('You are great, but I have other plans.', 'I like you.')]
# train summarizer and save model
summarizer = TransformerSummarizer(num_layers=1)
trainer = Trainer(batch_size=2, steps_per_epoch=100)
trainer.train(summarizer, data, num_epochs=2)
summarizer.save('/tmp/summarizer')
# load model and do a prediction
summarizer = TransformerSummarizer.load('/tmp/summarizer')
summarizer.predict('You are the stars, earth and sky for me!')

Для получения дополнительной информации о том, как использовать библиотеку, ознакомьтесь с нашими руководствами на GitHub.

Резюме

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

Если вы нашли эту статью полезной, дайте нам пять, чтобы другие тоже могли ее найти, и поделитесь ею со своими друзьями. Подпишитесь на нас на Medium (Christian Schäfer и Dat Tran), чтобы быть в курсе нашей работы. Спасибо за прочтение!