Сквозная система ответов на вопросы с использованием Transformer

Введение

Система ответов на вопросы обычно используется в области обработки естественного языка. Он используется для ответов на вопросы в форме естественного языка и имеет широкий спектр применения.

Этот пост в блоге в основном посвящен системе ответов на вопросы, разработанной для определенной области, которая обычно использует модель под названием «Трансформеры» и использует несколько методов и механизмов, которые я представлю здесь. Документы, на которые я ссылаюсь в посте, предлагают более подробное и количественное описание.

Общая архитектура

В конце 2018 года исследователи Google AI Language опубликовали новую модель обработки естественного языка (NLP) под названием BERT (представления двунаправленного кодировщика от трансформеров). BERT превзошел другие модели в области НЛП и достиг современного уровня моделирования языковых задач.

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

Эта статья построена следующим образом:

  • До BERT, как люди работали в области НЛП? (РНН — ЛСТМ)
  • Что такое Трансформеры? Пять шагов, чтобы понять механизм внимания.
  • Почему Трансформеры?
  • Что такое БЕРТ?
  • Почему мы используем BERT для вопросов и ответов?
  • Как использовать BERT для ответа на вопрос
  • Что такое лонгформер?
  • Почему мы используем Longformer для вопросов и ответов?
  • Выполнение задания на ответы на вопросы.

Давайте вернемся к традиционной нейронной сети с последовательной информацией.

RNN и LSTM

Рекуррентная нейронная сеть — это обобщение нейронной сети с прямой связью, которая имеет внутреннюю память. RNN могут использовать свое внутреннее состояние (память) для обработки последовательностей входных данных.

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

Рекуррентные нейронные сети и модели долговременной памяти, касающиеся этого вопроса, почти идентичны по своим основным свойствам:

Последовательная обработка: предложения должны обрабатываться пословно.

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

Первое свойство является причиной того, что RNN и LSTM нельзя обучать параллельно. Чтобы закодировать второе слово в предложении, мне нужны ранее вычисленные скрытые состояния первого слова, поэтому мне нужно сначала вычислить это. Информация в RNN и LSTM сохраняется благодаря ранее вычисленным скрытым состояниям. Дело в том, что кодировка конкретного слова сохраняется только для следующего временного шага, а это означает, что кодировка слова сильно влияет только на представление следующего слова, ее влияние быстро теряется через несколько временных шагов. LSTM (а также GruRNN) может немного увеличить диапазон зависимостей, который они могут изучить, благодаря более глубокой обработке скрытых состояний с помощью определенных модулей (что связано с увеличением количества параметров для обучения), но, тем не менее, проблема по своей сути связана с рекурсией. Другой способ, с помощью которого люди смягчили эту проблему, заключается в использовании двунаправленных моделей, которые кодируют одно и то же предложение с двух сторон, от начала до конца и от конца к началу, что позволяет таким образом словам в конце предложения иметь более сильное влияние на создание скрытого представления, но это всего лишь обходной путь, а не реальное решение для очень длинных зависимостей.

LSTM МЕРТВ. Да здравствуют Трансформеры.

В документе «Внимание — это все, что вам нужно» описываются преобразователи и то, что называется архитектурой «последовательность к последовательности» (Seq2Seq). Sequence-to-sequence — это нейронная сеть, которая преобразует данную последовательность в другую последовательность для конкретной задачи.

Наиболее известным применением моделей Seq2Seq является перевод, при котором последовательность слов одного языка преобразуется в последовательность слов другого языка. Популярным выбором для этого типа модели является модель, основанная на долговременной памяти (LSTM). Однако для длинной последовательности LSTM имеет медленное время обучения и недостающую информацию (проблема дальней зависимости).

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

Пять шагов, чтобы понять механизм внимания

Это основная идея Трансформеров. Самовнимание — это механизм внимания, связывающий различные положения одной последовательности, чтобы вычислить представление этой последовательности.

Пример: когда модель обрабатывает слово «оно», внутреннее внимание пытается связать «оно» с «улицей» в одном предложении.

Итак, как получить отношение между словами?

Первый шаг: для каждого слова мы создаем 3 вектора Q, K, V, эти векторы создаются путем умножения вложения на три матрицы (WQ, Wk, WV), которые мы обучили.

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

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

Последний шаг: суммируйте V векторов, чтобы получить Z вектора внимания к слову. Затем повторите этот шаг, чтобы обратить внимание матрицы на предложение.

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

Что такое BERT?

BERT, что означает Bidirectional Eidirectional Encoder Rпредставления от Tтрансформаторов, разработанных исследователями Google в 2018 году, основан на Transformers, модели глубокого обучения, в которой каждый выходной элемент связан с каждым входным элементом, а весовые коэффициенты между ними рассчитываются динамически на основе их связи.

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

BERT размещает несколько энкодеров трансформатора друг над другом. Трансформер основан на известном модуле внимания с несколькими головками, который показал значительный успех как в задачах на зрение, так и в языковых задачах.

Почему BERT?

BERT помогает поисковой системе понять значение слов-трансформеров, таких как «для» и «для», в используемых ключевых словах.

Для системы ответов на вопросы BERT принимает два параметра, входной вопрос и переход в виде одной упакованной последовательности. Затем мы настраиваем вывод, чтобы отобразить ответ, существующий в отрывке.

Что такое лонгформеры?

В последнее время языковые модели на основе трансформеров лидируют в тестах НЛП. Такие модели, как BERT, RoBERTa, уже давно являются самыми современными. Однако одним из основных недостатков этих моделей является то, что они не могут «обслуживать» более длинные последовательности. Например, BERT ограничен максимальным количеством токенов 512 за раз. В классическом преобразователе вы не могли обработать длинный абзац за одно и то же время, поэтому вы должны были разделить абзац на куски и обработать каждый из них по отдельности, а затем сделать прогнозы. Однако недостатком является то, что модель не может установить конкретные связи между словом в этом фрагменте с другим фрагментом на нейронном уровне. Таким образом, если вы разделите ваши документы на отдельные образцы, они станут независимыми, и механизм внимания не сможет работать над ними за пределами этих фрагментов.

Чтобы преодолеть эти проблемы с длинной последовательностью, Longformer по существу объединяет несколько моделей внимания:

  1. Скользящее окно

Имя говорит само за себя. В этом подходе мы берем произвольный размер окна w, и каждый токен в последовательности будет обслуживать только некоторые w токенов (в основном w/2 слева и w/2 справа).

Чтобы понять работу этого паттерна внимания, давайте рассмотрим пример извилин. Скажем, мы берем ядро ​​размера w и пропускаем его через все фишки в последовательности. После этой операции у нас будут представления скрытого состояния всех токенов в последовательности при наличии w соседних токенов. Теперь, если мы проделаем то же самое для l слоев, каждый маркер в нашей последовательности будет сопровождать (l x w) смежных маркеров, то есть более или менее всю входную последовательность. Авторы называют это пространство рецептивным полем (досягаемость внимания для данной лексемы). Внимание скользящего окна имеет рецептивное поле (l x w).

2. Расширенное скользящее окно

Расширенное скользящее окно: мы пропускаем одно слово рядом, чтобы привлечь внимание. Идея состоит в том, чтобы создать гораздо большее окно внимания, размер окна |w| больше, поэтому вы можете быстрее включать информацию между слоями. это не повредит вычислению модели

3. Общее внимание (полное внимание к себе)

Рассмотрим тот же пример QA-задач. В случае Longformer мы можем иметь все жетоны вопросов, чтобы иметь глобальный шаблон внимания, т. е. чтобы они обращали внимание на все другие токены в последовательности. Более того, остальные жетоны тоже обслуживают все жетоны в вопросе вместе с жетонами в своем собственном окне. Это показано на рисунке выше.

Longformer применяет три приведенных выше шаблона внимания для обработки длинной последовательности.

Набор данных

Мы будем использовать Стэнфордский набор данных для ответов на вопросы (SQuAD 2.0) для обучения и оценки нашей модели. SQuAD — это набор данных для понимания прочитанного и стандартный эталон для моделей обеспечения качества. Набор данных находится в открытом доступе на сайте.

SQuAD2.0 объединяет 100 000 вопросов SQuAD1.1 с более чем 50 000 вопросов без ответа. Чтобы преуспеть в SQuAD2.0, системы должны не только отвечать на вопросы, когда это возможно, но также определять, когда ответ не поддерживается абзацем, и воздерживаться от ответа.

Давайте рассмотрим код!

Настройка

1. Установите Анаконду. "Установить"

2. Создайте среду anaconda с помощью Python версии 3.7.

conda install -c QAS_longformer python=3.7

3. Активируйте среду.

conda activate QAS_longformer

4. Мы рекомендуем использовать cuda для быстрого обучения.

#install pytorch with cuda version
pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html

5. Установите библиотеку Transformer.

pip install transformers
pip install simpletransformers

Подготовить набор данных

Загрузите набор данных SQuAD2.0. "Ссылка на сайт"

Каталог файлов должен быть таким:

|-TransformersQAS_Longformer
|---data
|-----train-v2.0.json
|-----dev-v2.0.json

Модель обучения

Создайте файл Python с кодом ниже.

import logging
import json
import queue
import sklearn
import multiprocessing as mp
from simpletransformers.question_answering import QuestionAnsweringModel, QuestionAnsweringArgs
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
#logging.basicConfig(level=logging.INFO)
#transformers_logger = logging.getLogger("transformers")
#transformers_logger.setLevel(logging.WARNING)
if __name__=='__main__':
    mp.freeze_support()
    #prepare training data
    with open('data/train-v2.0.json', 'r') as f:
        train_data = json.load(f)
    train_data = [item for topic in train_data['data'] for item in topic['paragraphs'] ]
    train_data = train_data[0:5001]
    
    with open('data/dev-v2.0.json', 'r') as d:
        eval_data = json.load(d)
    eval_data = [item for topic in eval_data['data'] for item in topic['paragraphs'] ]
    eval_data = eval_data[0:501]

    train_args = {
    'learning_rate': 3e-5,
    'num_train_epochs': 5,
    'max_seq_length': 384,
    'doc_stride': 128,
    'overwrite_output_dir': True,
    'reprocess_input_data': False,
    'train_batch_size': 2,
    'gradient_accumulation_steps': 8,
    }

    model_args = QuestionAnsweringArgs(overwrite_output_dir=True)
    model_args.evaluate_during_training = True

    model = QuestionAnsweringModel(
    "longformer", "allenai/longformer-base-4096", args=train_args,use_cuda=True
    )
    #train model
    model.train_model(train_data, eval_data=eval_data)


    # Evaluate the model
    result, texts = model.eval_model(eval_data)

Тестирование

import logging
import json
import queue
import sklearn
import time
import sys
import multiprocessing as mp
from simpletransformers.question_answering import QuestionAnsweringModel, QuestionAnsweringArgs
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
#logging.basicConfig(level=logging.INFO)
#transformers_logger = logging.getLogger("transformers")
#transformers_logger.setLevel(logging.WARNING)
#if __name__=='__main__':
    #mp.freeze_support()


model_args = QuestionAnsweringArgs(overwrite_output_dir=True,doc_stride=80)
model_args.evaluate_during_training = True
    
    #after training. replace the model outputs it generate when training by path like below. 
model = QuestionAnsweringModel(
    "longformer", "./outputs",use_cuda=True,args=model_args
    )

def predictset():
#     input_question=sys.argv[1]

#     start = timeit.default_timer()

    phrase = "break"
    input_question = input("question: ")
    if input_question == phrase:
        print("QAS: good bye!")
    else:
        to_predict1 = [{
        "context": "<input your context here>",
        "qas": [
                        {
                "question": input_question,
                "id": "0",
                        }

                    ]
                }]
    start_time = time.time()     
    answers, probabilities = model.predict(to_predict1)
    print("--- %s seconds ---" % (time.time() - start_time))
    dict_ans = answers[0]
    real_answer = print(dict_ans["answer"][0])

    return print(real_answer),predictset()
    
        
predictset()

Вы можете заменить контекст и заданный вопрос относится к этому контексту.

Результат

В результате я создал пользовательский интерфейс и задал системе несколько вопросов. Это правильно!!

Заключение

В этом сообщении в блоге я объяснил, что такое модель Transformers и ее модифицированная версия, такая как BERT (Longformer), в наборе данных SQuAD для решения задачи ответа на вопрос по любому тексту.

Мы видели еще одну модель, в которой используется модифицированная форма внимания для оптимизации производительности традиционной архитектуры Transformer. Longformer обеспечивает эффективность вычислений и памяти. Кроме того, он также обеспечивает поддержку нескольких последующих задач NLP, в отличие от других архитектур преобразования длинных документов.

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

Недостатки этой системы на самом деле, не все документы и ответы похожи на вопрос таким образом, поэтому для многих вопросов по-прежнему необходимы предметно-специфические лексические знания, и набор данных SQuAD также не охватывает все случаи.

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

Читайте оригинальную и последнюю статью по адресу:

https://www.neurond.com/blogs/question-answering-system-using-transformer-youve-got-questions-weve-got-answers

NeurondAI — это трансформационный бизнес. Свяжитесь с нами по адресу:

Веб-сайт: https://www.neurond.com/