Настройте проект суммирования текста с помощью Hugging Face Transformers: Часть 1

Исходный узел: 1236281

После появления OpenAI выпустила третье поколение своей модели машинного обучения (ML), которая специализируется на генерации текста в июле 2020 года, я знал, что что-то изменилось. Эта модель произвела фурор, как ни одна из предыдущих. Внезапно я услышал, как об этом говорят друзья и коллеги, которые могут интересоваться технологиями, но обычно не особо интересуются последними достижениями в области AI/ML. Даже Гардиан написал статью об этом. Или, если быть точным, модель написал статью, а Guardian отредактировала и опубликовала ее. Нельзя было отрицать — GPT-3 изменил правила игры.

После того, как модель была выпущена, люди сразу же начали придумывать для нее возможные применения. В течение нескольких недель было создано множество впечатляющих демонстраций, которые можно найти на Сайт ГПТ-3. Одно конкретное приложение, которое привлекло мое внимание, было обобщение текста – способность компьютера читать заданный текст и резюмировать его содержание. Это одна из самых сложных задач для компьютера, потому что она объединяет две области в области обработки естественного языка (NLP): понимание прочитанного и генерация текста. Вот почему меня так впечатлили демонстрации GPT-3 для суммирования текста.

Вы можете попробовать их на Веб-сайт Hugging Face Spaces. Мой любимый на данный момент это приложению который генерирует сводки новостных статей, используя только URL-адрес статьи в качестве входных данных.

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

Обзор учебника

Многие организации, с которыми я работаю (благотворительные организации, компании, неправительственные организации), имеют огромное количество текстов, которые им нужно прочитать и обобщить: финансовые отчеты или новостные статьи, научные исследования, патентные заявки, юридические контракты и многое другое. Естественно, эти организации заинтересованы в автоматизации этих задач с помощью технологии НЛП. Чтобы продемонстрировать искусство возможного, я часто использую демоверсии с обобщением текста, которые почти всегда производят впечатление.

Но что теперь?

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

Я написал этот урок, помня о себе из прошлого, который был четыре недели назад — это урок, который я хотел бы иметь тогда, когда начинал это путешествие. В этом смысле целевая аудитория этого руководства — это те, кто знаком с AI/ML и уже использовал модели Transformer раньше, но находится в начале пути к обобщению текста и хочет углубиться в него. Поскольку оно написано «новичком» и для начинающих, я хочу подчеркнуть тот факт, что это руководство a практическое руководство - нет домен практическое руководство. Пожалуйста, относитесь к этому как к Коробка Джорджа EP сказал:

С точки зрения того, сколько технических знаний требуется в этом руководстве: оно включает в себя некоторое кодирование на Python, но большую часть времени мы просто используем код для вызова API, поэтому глубоких знаний в области кодирования также не требуется. Полезно ознакомиться с некоторыми понятиями ML, например, что означает поезд и развертывание модель, концепции обучение, Проверкакачества тестовые наборы данных, и так далее. Также, побаловавшись с Библиотека трансформаторов before может оказаться полезным, потому что мы широко используем эту библиотеку в этом руководстве. Я также включаю полезные ссылки для дальнейшего чтения этих концепций.

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

Структура этого руководства

Эта серия состоит из четырех разделов, разделенных на два поста, в которых мы проходим различные этапы проекта по обобщению текста. В первом посте (раздел 1) мы начинаем с введения метрики для задач суммирования текста — меры производительности, которая позволяет нам оценить, хорошее это резюме или плохое. Мы также представляем набор данных, который мы хотим обобщить, и создаем базовый уровень, используя модель без ML — мы используем простую эвристику для создания сводки из заданного текста. Создание этой базовой линии — жизненно важный шаг в любом проекте машинного обучения, поскольку он позволяет нам количественно оценить прогресс, которого мы достигнем, используя ИИ в будущем. Это позволяет нам ответить на вопрос «Действительно ли стоит инвестировать в технологию ИИ?»

Во втором посте мы используем модель, которая уже была предварительно обучена для создания сводок (раздел 2). Это возможно с современным подходом в ML, называемым трансферное обучение. Это еще один полезный шаг, потому что мы в основном берем готовую модель и тестируем ее на нашем наборе данных. Это позволяет нам создать еще одну базовую линию, которая помогает нам увидеть, что происходит, когда мы фактически обучаем модель на нашем наборе данных. Подход называется подведение итогов, потому что модель не подвергалась воздействию нашего набора данных.

После этого пришло время использовать предварительно обученную модель и обучить ее на нашем собственном наборе данных (раздел 3). Это также называется тонкая настройка. Это позволяет модели учиться на шаблонах и особенностях наших данных и медленно адаптироваться к ним. После обучения модели мы используем ее для создания сводок (раздел 4).

Подведем итоги:

  • Часть 1:
    • Раздел 1. Используйте модель без машинного обучения, чтобы установить базовый уровень
  • Часть 2:
    • Раздел 2. Генерация сводок с помощью нулевой модели
    • Раздел 3. Обучение модели суммирования
    • Раздел 4. Оценка обученной модели

Весь код для этого руководства доступен в следующем Репо GitHub.

Чего мы достигнем к концу этого урока?

К концу этого урока мы не будет иметь модель суммирования текста, которую можно использовать в производстве. У нас даже не будет хорошо модель обобщения (вставьте сюда эмодзи крика)!

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

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

Раздел 1. Используйте модель без машинного обучения, чтобы установить базовый уровень

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

Код для учебника можно найти в следующем Репо GitHub.

Данные, данные, данные

Каждый проект машинного обучения начинается с данных! Если возможно, мы всегда должны использовать данные, связанные с тем, чего мы хотим достичь с помощью проекта суммирования текста. Например, если нашей целью является обобщение патентных заявок, мы также должны использовать патентные заявки для обучения модели. Большое предостережение для проекта ML заключается в том, что обучающие данные обычно должны быть помечены. В контексте суммирования текста это означает, что нам нужно предоставить текст для суммирования, а также резюме (метку). Только предоставив и то, и другое, модель сможет узнать, как выглядит хорошее резюме.

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

Данные, которые мы используем, являются набор данных arXiv, который содержит рефераты статей arXiv, а также их названия. Для нашей цели мы используем аннотацию в качестве текста, который мы хотим резюмировать, и заголовок в качестве справочной информации. Все этапы загрузки и предварительной обработки данных доступны в следующем ноутбук. Нам требуется Управление идентификацией и доступом AWS (IAM) роль, которая разрешает загрузку данных в и из Простой сервис хранения Amazon (Amazon S3), чтобы успешно запустить этот ноутбук. Набор данных был разработан в рамках статьи Об использовании ArXiv в качестве набора данных и находится под лицензией Creative Commons CC0 1.0 Универсальное общественное достояние.

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

Естественно, на этом этапе часто возникает вопрос: сколько данных нам нужно? Как вы, наверное, уже догадались, ответ таков: это зависит. Это зависит от того, насколько специализирована область (обобщение патентных заявок сильно отличается от обобщения новостных статей), насколько точной должна быть модель, чтобы быть полезной, сколько должно стоить обучение модели и так далее. Мы вернемся к этому вопросу позже, когда будем фактически обучать модель, но суть в том, что нам нужно опробовать разные размеры наборов данных, когда мы находимся на экспериментальной стадии проекта.

Что делает хорошую модель?

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

При генерации текста это становится более сложной задачей. Резюме (метки), которые мы предоставляем в нашем наборе данных, — это только один из способов суммировать текст. Но есть много возможностей резюмировать данный текст. Таким образом, даже если модель не соответствует нашей метке 1:1, вывод все равно может быть достоверным и полезным резюме. Так как же нам сравнить сводку модели с той, которую мы предоставляем? Метрика, которая чаще всего используется при резюмировании текста для измерения качества модели, — это Оценка ROUGE. Чтобы понять механизм этой метрики, см. Окончательная метрика производительности в НЛП. Таким образом, показатель ROUGE измеряет перекрытие н-граммы (непрерывная последовательность n элементы) между сводкой модели (резюме-кандидатом) и эталонной сводкой (метка, которую мы предоставляем в нашем наборе данных). Но, конечно, это не идеальная мера. Чтобы понять его ограничения, ознакомьтесь с Ружиться или не румяниться?

Итак, как мы рассчитываем балл 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. «Сумма» в rougeLsum относится к тому факту, что эта метрика вычисляется по всей сводке, тогда как rougeL вычисляется как среднее значение по отдельным предложениям. Итак, какую оценку ROUGE мы должны использовать для нашего проекта? Опять же, мы должны попробовать разные подходы на этапе экспериментов. Для чего это стоит, оригинальная бумага 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 счет. Чтобы поместить эти цифры в контекст, мы можем обратиться к Модели Пегаса, который показывает оценки современной модели для различных наборов данных.

Заключение и что дальше

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

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

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


Об авторе

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

Отметка времени:

Больше от Машинное обучение AWS