Прохождение исследовательской работы

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

Системы ответов на вопросы с открытым доменом в значительной степени полагаются на эффективные методы поиска отрывков. Этот шаг помогает выбрать релевантные контексты-кандидаты для ответа на любой вопрос. Системы ответов на вопросы с открытым доменом обычно следуют двухэтапному конвейеру:

  1. Поиск контекста:Поиск контекста отвечает за получение небольшого подмножества отрывков, которые имеют отношение к вопросу и могут содержать ответы.
  2. Машинный ридер.Машинный ридер отвечает за последующее определение правильного ответа из этих наборов отрывков.

В этом блоге мы в основном обсуждаем улучшения в части конвейера извлечения контекста.

Традиционные системы моделируют некоторую логику TF-IDF и BM25 в своих ретриверах, которые в целом работают довольно хорошо, но вопрос в том, можем ли мы сделать лучше? Я не буду вдаваться в подробности того, как TF-IDF и BM25 работают, не стесняйтесь проверить это и это для того же. Короче говоря, они выполняют своего рода разреженное векторное сходство между взвешенным представлением мешка слов двух текстовых фрагментов. Очевидное ограничение, связанное с такими системами, заключается в невозможности извлечения контекста, в котором слова не совпадают как есть. В последнее время, несмотря на всю шумиху вокруг моделирования семантики в обработке естественного языка, которое противоречит представлению в виде мешка слов, эта работа Facebook AI, Вашингтонского и Принстонского университетов показывает, что поиск может может быть эффективно реализован на основе плотных векторных представлений, а также заметно превосходит традиционные методы со значительным отрывом.

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

На изображении ниже показана тенденция точности top-k по мере того, как мы масштабируем значение k для моделей, обученных на наборах наземных данных разного размера. Таким образом, здесь точность top-k означает, что для данного запроса (q) сколько отрывков с наибольшим количеством очков являются правильными и могут дать правильный ответ.

Ясно видно, что всего с 10 000 обучающих выборок золотых пар вопросов и проходов предлагаемый метод может улучшить показатели точности почти на 7–9 % по сравнению с методом BM25. Здесь значение «k» может варьироваться от очень меньшего, например, 5, до значительно большего, например, 100. Удивительно, но если вы заинтересованы в получении только 10–20 отрывков для данного вопроса, то даже обучение с использованием всего лишь 1000 образцов золота показывает улучшение близка к 2–4% точности top-k по сравнению с методом BM25.

Ретривер плотного прохода (DPR)

Средство извлечения плотных проходов (DPR) отвечает за выборку релевантных отрывков по отношению к заданному вопросу на основе сходства между высококачественным низкоразмерным непрерывным представлением отрывков и вопросов. Кроме того, поскольку вся система должна достаточно быстро обслуживать запросы пользователя, предварительно вычисляется и поддерживается индекс, содержащий эти представления. Теперь, во время логического вывода, для любого нового запроса/вопроса, который возникает, мы можем эффективно извлечь некоторые лучшие k отрывков, а затем запустить наш компонент чтения только для этого меньшего подмножества. Авторы в статье использовали Facebook AI Similarity Search (FAISS), библиотеку, которая позволяет нам быстро (аппроксимировать ближайших соседей) искать мультимедийные документы, похожие друг на друга. Здесь размер k зависит от нескольких факторов, таких как ожидаемая задержка в конвейере, доступные вычисления, отзыв и т. д. Но, вообще говоря, любое значение k между 10–50 служит цели.

Сходство между вложениями вопроса и прохода представлено путем вычисления скалярного произведения между ними. Авторы экспериментировали и с другими подобными методами, но в итоге выбрали скалярное произведение из-за его простоты. Чем выше показатель сходства(или меньше расстояние), тем более релевантен отрывок вопросу. Математическое представление показано ниже —

Здесь q, p, Eq и Ep — это текст вопроса, текст отрывка, модель BERT, которая выводит представление вопроса, и модель BERT, которая выводит представление прохода. Авторы используют размерность 768 представления маркера CLS в качестве окончательного представления части входного текста.

Для обучения модели набор данных представляется как D={‹q1,p1,p2,p3..pn›,‹q2,p2,p1,p3..pn›…},здесь qi является i-м вопросом, и каждому вопросу соответствует свой положительный пример и несколько отрицательных примеров. Для простоты 1-й индекс каждого приведенного выше примера — это положительный переход к вопросу qi, а остальные — отрицательные. И они оптимизируют функцию потерь как отрицательную логарифмическую вероятность положительного прохода. На изображении ниже показано математическое представление того же -

Здесь qi, pi(+) и pi(-) — это i-й вопрос, i-й соответствующий отрывок (положительный образец) и i-й отрывок, который не имеет отношения к делу (отрицательный образец) соответственно. Цель оптимизации — максимизировать сходство между qi и pi(+) и уменьшить сходство между нерелевантными, т. е. qi и pi(-).

Часто в сценариях поиска получить положительные примеры несложно (вы получите их с обучающими данными, где дается вопрос и соответствующий отрывок), в то время как вам, возможно, придется подумать об эффективном выборе отрицательных примеров. Авторы в статье экспериментируют с тремя видами методов генерации негатива: (1) Случайный: любой случайный переход из корпуса; (2) BM25: лучшие отрывки, возвращенные BM25, которые могут не обязательно содержать ответ, но соответствовать большинству токенов вопросов (3) Золотой: положительные отрывки в сочетании с другими вопросами, которые появляются в обучающий набор (особенно те, которые присутствуют в одном мини-пакете). И нашел какое-то сочетание пунктов 3 и 2, чтобы работать лучше всего.

На этом мы завершаем теоретическое понимание предлагаемой модели. А теперь переходим к созданию чего-то своего —

Шаблон кода

Мы будем использовать библиотеку Python Simple Transformers для настройки шаблона для реализации модели DPR. Simple Transformers разработан для упрощения использования моделей Transformer без ущерба для полезности. Он построен на потрясающей работе Hugging Face и его библиотеке Трансформеры. В нем есть поддержка различных задач в НЛП, не стесняйтесь ознакомиться со всем списком здесь. Итак, вы можете установить то же самое с помощью приведенной ниже команды -

>> pip install simpletransformers

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

from simpletransformers.retrieval import RetrievalModel, RetrievalArgs
import torch
### loading pre-trained weights of passage and question encoder ###
Eq = "bert-base-uncased"
Ep = "bert-base-uncased"
model_args = RetrievalArgs()
#model_args.retrieve_n_docs
#model_args.hard_negatives
#model_args.max_seq_length
#model_args.num_train_epochs
#model_args.train_batch_size
#model_args.learning_rate

Здесь Eq и Ep содержат модель, которая будет использоваться для кодирования вопросов и отрывков. Вы также можете начать с некоторого открытого предварительно обученного кодировщика DPR как для контекста, так и для прохода (пример одного из контекстов: facebook/dpr-question_encoder-single-nq-base, проход: facebook/dpr-ctx_encoder -single-nq-base"). Если параметру "hard_negatives" присвоено значение True, модель также учится на отрицательных примерах, созданных с использованием таких методов, как BM25 и т. д., поверх негативов в пакете. Как обсуждалось выше, в документе также предлагается концепция пакетных негативов, а также получение негативных образцов на основе BM25 или аналогичного метода. Остальные параметры, упомянутые выше, говорят сами за себя. Библиотека предоставляет фрагмент кода для создания этих жестких негативов. Пожалуйста, не стесняйтесь проверить это «здесь.

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

import pandas as pd
train_data = [
    {
        "query_text": "Who is the protaganist of Dune?",
        "gold_passage": 'Dune is set in the distant future amidst a feudal interstellar society in which various noble houses control planetary fiefs. It tells the story of young Paul Atreides, whose family accepts the stewardship of the planet Arrakis. While the planet is an inhospitable and sparsely populated desert wasteland, it is the only source of melange, or "spice", a drug that extends life and enhances mental abilities. Melange is also necessary for space navigation, which requires a kind of multidimensional awareness and foresight that only the drug provides. As melange can only be produced on Arrakis, control of the planet is a coveted and dangerous undertaking.',
    },
    {
        "query_text": "Who is the author of Dune?",
        "gold_passage": "Dune is a 1965 science fiction novel by American author Frank Herbert, originally published as two separate serials in Analog magazine.",
    }
    ...
]
train = pd.DataFrame(
    train_data
)

При этом вы можете продолжить обучение модели DPR, но если вы установили для hard_negatives значение True, вам потребуется еще один ключ (hard_negative) для каждой точки данных в вышеупомянутом формате.

cuda_available = torch.cuda.is_available()
model = RetrievalModel(
    model_type = "dpr",
    context_encoder_name = Ep,
    query_encoder_name = Eq,
    args = model_args,
    use_cuda = cuda_available
)
model.train_model(train, eval_data = eval, \
                output_dir = 'model/', \
                show_running_loss = True)
model.eval_model(test, verbose=True)

Далее мы передаем в нашу модель все необходимые параметры и обучаем, указав выходную директорию, куда будет сохранена модель. Формат фрейма данных «eval» и «test» точно такой же, как и у «train». Здесь train, eval и test — это панды DataFrame, которые содержат 2–3 столбца — query_text, gold_passage, hard_negative (необязательно)

  • query_text: Текстовая последовательность запроса/вопроса
  • gold_passage: Последовательность текста золотого отрывка
  • hard_negative: текстовая последовательность жесткого отрицательного отрывка из BM25 (необязательно)

Вывод с обученной моделью DPR

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

questions = [
    'What year did Dune release?'
]
predicted_passages, _, _, _ = model.predict(questions, retrieve_n_docs=2)

Заключительные мысли

Очень интересно наблюдать за внедрением новых технологий и их применением в таких практических случаях. В этой статье мы рассказали о том, что такое DPR, как он работает и как его использовать. Мы также реализовали это с помощью библиотеки Python Simple Transformers. Не стесняйтесь ознакомиться с другими спецификациями, которые вы можете использовать для обучения эффективной модели. Надеюсь, вам понравилась статья. Кроме того, если вы предпочитаете смотреть видео, а не читать текст, вы можете ознакомиться с пояснениями к видеодокументу по адресу это. Хотя вы не найдете там реализации, которая здесь эксклюзивна ;)

Кроме того, если вы хотите поддержать меня как писателя, рассмотрите возможность подписки стать участником Medium. Всего 5 долларов в месяц, и вы получаете неограниченный доступ к Medium.