[Перевод] Автоматическая суммаризация текстов с помощью трансформеров Hugging Face. Часть 1
В июле 2020 года компания OpenAI выпустила свою модель машинного обучения третьего поколения, GPT-3, ориентированную на генерирование текстов. Тогда я понял, что мир уже не будет прежним. Эта модель задела меня за живое. Те системы такого рода, что выходили раньше, у меня подобных ощущений не вызывали. И вот ещё неожиданность — о новой системе начали говорить мои друзья и коллеги, в принципе интересующиеся технологиями, но не особенно обращающие внимание на последние достижения машинного обучения (Machine Learning, ML) и искусственного интеллекта (Artificial Intelligence, AI). Об этом написала даже газета Guardian. А если точнее — статью написала сама модель, а в Guardian её лишь отредактировали и опубликовали. Совершенно очевидно то, что выход модели GPT-3 стал поворотным моментом в развитии искусственного интеллекта.
Сразу же после выхода модели начали появляться идеи по поводу вариантов её применения. В течение нескольких недель было создано множество впечатляющих демонстрационных проектов, которые можно найти на сайте GPT-3. Моё внимание привлёк один из способов применения GPT-3 — автоматическое реферирование текстов (text summarization): компьютер читает переданный ему текст и выдаёт краткое изложение этого текста. Это — одна из самых сложных задач, с которыми приходится сталкиваться компьютерам. Дело в том, что она совмещает в себе два навыка из сферы обработки естественных языков (Natural Language Processing, NLP). Это — понимание читаемых текстов и возможность писать тексты самостоятельно. Именно поэтому меня так впечатлили примеры использования GPT-3, демонстрирующие возможности системы по генерированию текстов.
Попробовать эти демонстрации можно в разделе Spaces сайта Hugging Face. Сейчас мой любимый пример такого рода — это приложение, которое генерирует сводки по новостным статьям, получая на вход лишь URL статьи, которую нужно обработать.
В этом материале, состоящем из двух частей, я предложу вниманию читателей практическое руководство по архитектуре ИИ-проекта, ориентированного на реферирование текстов. Освоение этих материалов позволит вам оценить качество моделей, реферирующих тексты, понять, подойдут ли они для вашей сферы деятельности.
Обзор учебного руководства
Во многих организациях, с которыми я работал (благотворительные учреждения, различные компании, неправительственные организации), имеется огромное количество текстов, которые нужно читать и реферировать. Это, например, финансовые отчёты, новостные публикации, научные статьи, патентные заявки, юридические договоры. Совершенно естественно то, что эти организации заинтересованы в автоматизации таких задач с помощью технологий обработки естественных языков. Для того чтобы показать таким организациям то, на что способны современные технологии, я часто использую демонстрационные примеры систем реферирования текстов. Такие примеры почти никогда не оставляют зрителей равнодушными.
И что с того?
Главная задача, которая стоит перед этими организациями, заключается в том, что им нужно оценивать модели для реферирования текстов на основе результатов обработки огромного множества документов, а не одного документа, для обработки которого нужно немало ручного труда. Они не хотят нанимать сотрудников, рабочий день которых выглядел бы так: запустить приложение, вставить в некое поле текст документа, нажать на кнопку Обработать
, подождать результата, оценить качество реферирования, а потом повторить те же действия для тысяч документов.
Я написал это руководство, принимая во внимание то, в каком положении я сам находился четыре недели назад. Это — то самое руководство, которое очень пригодилось бы мне, когда я начинал своё путешествие по технологиям. В этом смысле — целевой аудиторией данного материала является некто, знакомый с AI и ML, уже пользовавшийся трансформерами, но только приступающий к освоению систем реферирования текстов, стремящийся углубиться в эту тему. Так как это руководство написано «новичком» и на новичков же рассчитано, мне хотелось бы особо отметить тот факт, что это — обычное практическое руководство, а не некий монументальный труд, который можно рассматривать как истину в последней инстанции. Поэтому прошу вас рассматривать его через призму высказывания Джорджа Бокса:
В сущности, все м̶о̶д̶е̶л̶и̶ учебные руководства неправильны, но некоторые полезны
Если говорить о том, какими техническими знаниями надо обладать для успешного освоения этого руководства, могу сказать, что тут используются программы, написанные на Python, но работа кода, чаще всего, заключается в вызове различных API. Поэтому глубоких знаний Python-программирования вам не понадобится. Полезно будет знакомство с некоторыми концепциями ML. Например — вам пригодятся знания о том, что значит «обучение» и «развёртывание» модели, о том, что такое «обучение», «валидация», «тестовый набор данных», и так далее. Кроме того, если вы уже пробовали библиотеку Transformers, это может оказаться кстати, так как мы будем много пользоваться этой библиотекой. В материале вы найдёте ссылки, которые позволят вам лучше познакомиться с различными концепциями машинного обучения.
Так как это руководство написано новичком — я не ожидаю, что эксперты обработки естественных языков и продвинутые практики глубокого обучения почерпнут из него что-то существенное. По крайней мере, это касается технической стороны дела, но, возможно, они всё же найдут тут что-нибудь интересное и полезное. Поэтому, если вы — из их числа, прошу вас не прекращать чтение прямо сейчас! Правда, вам придётся проявить терпение из-за того, что я стремлюсь к простоте. Я постарался сделать всё в этом руководстве настолько простым, насколько это возможно, но не проще.
О структуре руководства
Это руководство состоит из четырёх разделов, разделённых на две публикации, в которых мы пройдёмся по разным этапам работы над проектом по реферированию текстов. В первом материале (в разделе №1) мы начнём со знакомства с метриками, касающимися задач реферирования текстов. Это — измерение эффективности работы моделей, результаты которого позволяют нам понять, хорошим или плохим получился реферат текста. Мы, кроме того, познакомимся с набором данных, который будем обрабатывать, и создадим модель, генерирующую реферат переданного ей текста, не являющуюся ML-моделью, основанную на простом эвристическом алгоритме. Результаты её работы мы будем использовать в качестве точки отсчёта, базовой линии для оценивания других моделей. Создание подобной базовой модели — это жизненно важный шаг любого ML-проекта, так как он позволяет, в количественной форме, оценивать улучшения, которые дают ИИ-модели при решении различных задач. Это позволяет нам ответить на вопрос о том, стоит ли вкладывать время и силы в технологии искусственного интеллекта.
Во втором материале мы воспользуемся предварительно обученной моделью для генерирования рефератов (раздел №2). Это возможно благодаря современному подходу машинного обучения, который называется обучением с переносом опыта (transfer learning). Это — ещё один важный шаг работы над моделью, так как тут оказывается, что мы берём готовую модель и тестируем её на нашем наборе данных. Это позволяет создать ещё одну базовую линию, которая поможет оценить результаты обучения модели на нашем наборе данных. Этот подход называется реферированием без подготовки (zero-shot summarization), так как модель не обучалась на текстах, входящих в наш набор данных.
После этого придёт время воспользоваться предварительно обученной моделью и обучить её на нашем наборе данных (раздел №3). Этот шаг работы над подобными проектами называется тонкой настройкой модели (fine-tuning). Это позволяет модели изучить паттерны и специфические особенности наших данных и постепенно к ним адаптироваться. После того, как мы обучим модель, мы воспользуемся ей для реферирования текстов (раздел №4).
Весь код, используемый в руководстве, можно найти в этом GitHub-репозитории.
Чего мы достигнем по завершении этого руководства?
После прохождения этого руководства в нашем распоряжении не окажется модель для реферирования текстов, которую можно использовать в продакшне. У нас даже не будет хорошей модели для реферирования текстов (тут можно вставить смайлик, символизирующий крик).
Но у нас окажется нечто, способное стать начальной точкой для следующей фазы проекта, предусматривающей проведение экспериментов. Именно тут в дело вступает слово «наука», входящее в состав словосочетания «наука о данных», так как весь подобный этап будет посвящён экспериментам с различными моделями и с различными параметрами моделей. Всё это нацелено на то, чтобы понять, можно ли обучить достаточно хорошую модель для реферирования текстов, пользуясь имеющимися данными.
И, чтобы сразу снять все вопросы, отмечу, что высока вероятность того, что в итоге мы сделаем вывод о том, что исследуемые нами технологии пока ещё являются недостаточно зрелыми, что наш проект пока нельзя реализовать на достойном уровне. А значит — вам нужно будет подготовить к такому варианту развития событий тех, кто принимает решения в вашей организации. Но это — уже совсем другая история.
Раздел 1: применение модели, не использующей технологии машинного обучения, для установки точки отсчёта
Это — первый раздел нашего руководства по созданию проекта, направленного на автоматическое реферирование текстов. Здесь мы зададим точку отсчёта для оценивания моделей, используя очень простую модель, в которой ML-технологии не используются. Этот шаг очень важен в любом ML-проекте, так как он позволяет понять то, насколько весомы улучшения, вносимые в систему технологиями машинного обучения, и то, стоит ли тратить на эти технологии время и силы.
Данные, данные и ещё раз данные
Каждый ML проект начинается с данных. Если это возможно — всегда нужно использовать данные, связанные с тем, на что нацелен проект по автоматическому реферированию текстов. Например, если наша цель заключается в реферировании патентных заявок, то для обучения моделей нужно использовать тексты патентных заявок. Важным нюансом, который нужно учитывать в проектах машинного обучения, является тот факт, что учебные данные обычно должны быть снабжены метками. В контексте реферирования текстов это значит, что нужно предоставить модели и текст, который нужно отреферировать, и его реферат (метку). Только имея в своём распоряжении и то и другое, модель может узнать о том, как должен выглядеть хороший реферат.
В этом руководстве мы будем пользоваться общедоступным набором данных, но последовательность шагов, выполняемых при работе над проектом, и применяемый код, останутся такими же при использовании наборов данных, подготовленных самостоятельно, или наборов, состоящих из данных, закрытых для посторонних. И, опять же, если вы создаёте модель с конкретной целью, и если у вас есть соответствующие данные — используйте собственные данные для того чтобы выжать из модели всё что можно.
Наши данные взяты из набора данных arXiv. Там содержатся как выдержки из документов (поле abstract
в наборе данных), так и их названия (поле title
). Выдержки из документов мы будем использовать в роли реферируемого текста, а названия — в виде итогового результата работы модели. В этом блокноте Jupyter Notebook представлено всё необходимое для загрузки и предварительной обработки данных. Для успешного запуска этого блокнота нужна роль AWS Identity and Access Management (IAM), которая разрешает загрузку данных в Amazon Simple Storage Service (Amazon S3) и их выгрузку оттуда. Наш набор данных был создан в рамках этой работы, он распространяется по лицензии Creative Commons CC0 1.0 Universal Public Domain Dedication.
Данные разделены на три набора, используемых для обучения модели (training data), для её валидации (validation data) и для её тестирования (test data). Если вы хотите использовать собственные данные — подготовьте их по такой же схеме. На следующем рисунке показано то, как мы пользуемся различными наборами данных.
Использование различных наборов данных
На данном этапе работы над подобными моделями обычно возникает вопрос о том, сколько данных для этого нужно. Вы, возможно, уже догадались о том, что это зависит от конкретной ситуации. В частности — от того, насколько специализированной является область знаний, к которой относятся тексты (реферирование патентных заявок сильно отличается от реферирования новостных статей), от того, насколько точной должна быть модель для того, чтобы она могла бы приносить практическую пользу, от того, сколько должно стоить обучение модели, и так далее. Мы вернёмся к этому вопросу позже, когда будем обучать модель, пока же можно сказать, что, на фазе проекта, предусматривающей проведение экспериментов, нужно будет попробовать наборы данных разных размеров.
Что представляет собой хорошая модель?
Во многих ML-проектах оценить эффективность работы модели несложно. Это так из-за того, что в них обычно можно довольно-таки однозначно определить то, являются ли результаты правильными. Метки в наборах данных обычно являются либо бинарными (Истина/Ложь, Да/Нет), либо категориальными. В любом случае, в подобных ситуациях легко сравнить результат работы модели с меткой и пометить его как правильный или неправильный.
А вот при оценке качества текстов, генерируемых моделью, всё усложняется. Рефераты (метки), которые имеются в нашем наборе данных — это лишь один из способов получения сжатой версии текста. А способов таких существует очень много. Поэтому, даже если то, что выдала модель, не полностью соответствует желаемому, результат её работы вполне может оказаться правильным и ценным. Как же сравнивать то, что выдаёт модель, с тем, что нам нужно? В задачах реферирования текстов для оценки качества моделей чаще всего используется набор метрик ROUGE. Для того чтобы понять внутреннее устройство механизма вычисления таких метрик, обратитесь к этому материалу. Если описать их работу в общих чертах, то получится, что оценки ROUGE вычисляются на основе измерения перекрытия N-грамм (непрерывных последовательностей из n элементов) между тем, что выдаёт модель (candidate summary) и желаемым результатом её работы, входящим в состав набора данных (reference summary). Но это, конечно, не идеальная система оценки качества моделей. Вот материал, который поможет понять ограничения метрик ROUGE.
Как вычисляются показатели ROUGE? Существует немало Python-пакетов, помогающих решать эту задачу. Для обеспечения единообразия результатов нам нужно использовать один и тот же метод расчёта показателей во всём проекте. Так как мы, позже, будем пользоваться обучающим скриптом из библиотеки Transformers, а не скриптом собственной разработки, мы можем заглянуть в исходный код скрипта и скопировать оттуда строки, отвечающие за вычисление показателей ROUGE:
from datasets import load_metric
metric = load_metric("rouge")
def calc_rouge_scores(candidates, references):
result = metric.compute(predictions=candidates, references=references, use_stemmer=True)
result = {key: round(value.mid.fmeasure * 100, 1) for key, value in result.items()}
return result
Мы, используя этот метод вычисления показателей, гарантируем то, что всегда, во всём проекте, будем сравнивать, так сказать, яблоки с яблоками.
Представленная здесь функция вычисляет несколько показателей ROUGE: rouge1
, rouge2
, rougeL
, и rougeLsum
. Слово sum
в названии rougeLsum
указывает на то, что этот показатель вычисляется по всему результату работы модели. А показатель rougeL
— это среднее по отдельным предложениям. Какой из этих показателей использовать в нашем проекте? Для ответа на подобный вопрос нам, как обычно, надо провести эксперименты на соответствующем этапе работы над проектом. Но, как бы там ни было, в исходной статье по ROUGE говорится, что показатели ROUGE-2 и ROUGE-L хорошо подходят для задач реферирования отдельных документов, а ROUGE-1 и ROUGE-L отлично показывают себя на оценке коротких рефератов.
Создание базовой линии
Займёмся созданием простой модели, не использующей технологии машинного обучения, результаты которой послужат точкой отсчёта для оценивания других моделей. Как решить эту задачу? Во многих исследованиях из сферы автоматического реферирования текстов используется очень простой подход: берут первые n предложений текста и называют их «результатами работы модели». Затем сравнивают их с желаемыми результатами и вычисляют показатели ROUGE. Это — простой, но мощный подход, который можно реализовать в нескольких строках кода (полный код, имеющий отношение к этому разделу, можно найти здесь):
import re
ref_summaries = list(df_test['summary'])
for i in range (3):
candidate_summaries = list(df_test['text'].apply(lambda x: ' '.join(re.split(r'(?<=[.:;])\s', x)[:i+1])))
print(f"First {i+1} senctences: Scores {calc_rouge_scores(candidate_summaries, ref_summaries)}")
Здесь мы используем тестовый набор данных. Это оправданно, так как мы, после обучения модели, будем использовать тот же набор данных для формирования итоговой оценки модели. Мы, кроме того, попробуем различные значения для n. А именно — начнём с одного, самого первого предложения, назвав его результатом работы модели, потом возьмём два первых предложения, и наконец — три.
Вот как выглядят результаты проверки нашей первой модели:
Наилучшие показатели ROUGE получены при использовании первого предложения из текста в качестве результата работы модели. Это значит, что использование дополнительных предложений приводит к тому, что реферат оказывается слишком пространным, что ведёт к ухудшению его оценки. В результате мы, в качестве отправной точки анализа эффективности моделей, будем использовать показатели, полученные для варианта первой модели, выходом которого является одно предложение.
Важно отметить, что, для столь простого подхода, полученные результаты выглядят весьма прилично. Особенно — для показателя rouge1
. Для того чтобы с чем-то сравнить эти показатели, можно обратиться к модели Pegasus, результаты которой соответствуют результатам лучших современных моделей для разных наборов данных.
Итоги и пара слов о продолжении
В первом разделе этого руководства мы познакомились с набором данных, который будем использовать в проекте по автоматическому реферированию текстов, а так же — с метриками, которыми будем пользоваться при оценке эффективности моделей. Затем мы создали простую модель, не использующую технологии машинного обучения, результаты работы которой будем использовать в качестве базовой линии при оценке других моделей.
Примечание: тут таблица, но она явно лишняя, т.к. ниже даётся домашнее задание, ответ на которое есть в таблице, а эта таблица рассматривается уже в следующей статье.
В следующем материале мы воспользуемся моделью с реферированием без подготовки, обученной на общедоступных новостных статьях. Но на наших данных эта модель обучаться не будет (поэтому она и называется «неподготовленной» моделью).
Предлагаю вам, в качестве домашнего задания, поразмышлять о том, как покажет себя «неподготовленная» модель в сравнении с нашей первой простой моделью. С одной стороны — это будет модель гораздо более продвинутая (это, на самом деле, нейронная сеть). А с другой — обучалась она только на новостях, поэтому у неё могут возникнуть проблемы с паттернами, присущими набору данных arXiv.
О, а приходите к нам работать?