Разговор с самим собой: получение знаний из моделей преобразователей для генерации текста

Кому нужен словарь, когда у вас есть модель Трансформер?

Модели Transformer для генерации текста действительно впечатляют. Они впервые привлекли внимание общественности, когда OpenAI посчитал одну из своих моделей слишком опасной для выпуска, названную GPT-2. Они неизбежно выпустили эту модель, включая ее самую большую версию, которую теперь можно использовать всего несколькими строками кода. С тех пор эти модели значительно выросли в размерах и возможностях. Теперь последняя модель OpenAI, получившая название GPT-3, может выполнять основную арифметику и генерировать реалистичные новостные статьи.

Эта статья будет посвящена одному из последних приложений моделей Transformer генерации текста - генерации знаний. На высоком уровне эти модели довольно просты; они пытаются продолжить предоставленный вами текст. А что, если вы зададите модели вопрос? Что ж, модель будет продолжать текст и, как следствие, обычно пытается ответить на вопрос. Поступая таким образом, они будут использовать знания, полученные во время обучения, для получения информации. К концу статьи вы узнаете, как реализовать современные модели искусственного интеллекта для выполнения этой задачи с минимальным объемом кода Python.

Открытие

Институт ИИ Аллена (AI2) был первым, кто обнаружил это применение моделей трансформаторов и назвал его разговор с самим собой [1]. Моя студенческая проектная группа Capstone независимо обнаружила метод, очень похожий на метод, предложенный AI2, до того, как узнал об их статье. Итак, у меня есть идеи, которыми я могу поделиться как из моего проекта, так и из статьи AI2.

Базовая реализация

В этом руководстве мы реализуем немного упрощенную версию разговора с самим собой. Мы будем использовать мой собственный пакет Python Happy Transformer, который представляет собой оболочку поверх библиотеки Transformers Hugging Face. Happy Transformer позволяет вам реализовать и обучить модели Transformer с помощью всего нескольких строк кода, включая модели генерации текста, которые мы будем использовать в этом руководстве.

Установка

Во-первых, Happy Transformer доступен на PyPI, поэтому мы можем установить его с помощью одной строчки кода.

pip install happytransformer

Скачать модель

Теперь мы собираемся импортировать класс HappyGeneration из Happy Transformer, чтобы загрузить модель генерации текста.

from happytransformer import HappyGeneration

Отсюда мы можем загрузить полностью открытую версию GPT-3 под названием GPT-Neo. В настоящее время в сети распространения моделей Hugging Face доступны три модели GPT-Neo разных размеров. Мы будем использовать вторую по величине (или вторую по величине, если вы настроены пессимистично) модель, которая имеет 1,3 млрд параметров. Вот ссылка на другие модели, если вы хотите их использовать.

Чтобы создать объект HappyGeneration, мы должны указать тип модели для его первого параметра позиции и имя модели для второго. В данном случае тип модели - GPT-NEO, а название модели - EleutherAI / gpt-neo-1.3B, как показано в верхнем левом углу веб-страницы модели.

happy_gen = HappyGeneration("GPT-NEO", "EleutherAI/gpt-neo-1.3B")

Алгоритм создания текста

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

Чтобы изменить настройки, мы должны импортировать класс GENSettings. Затем мы можем изменить различные параметры, чтобы выбрать и изменить алгоритм, который мы хотим использовать.

from happytransformer import GENSettings
beam_settings = GENSettings(num_beams=5, max_length=50, no_repeat_ngram_size=3)

AI2 использовал алгоритм, называемый выборкой top-p со значением p, равным 0,5, для генерации ответов. В отличие от поиска лучей, этот алгоритм не является детерминированным, то есть каждый раз, когда вы его запускаете, он производит другой текст.

top_p_settings = GENSettings(do_sample=True, top_k=0, top_p=0.5, max_length=50)

Получить знания

Теперь мы можем начать генерировать знания! Давайте создадим вопрос, а затем воспользуемся моделью генерации текста, чтобы ответить на него. Для этого мы вызовем метод generate () happy_gen.

question = "What is a dog?" 
result = happy_gen.generate_text(question, args=beam_settings) 
print(result.text)

Результат: собака является членом семейства Canidae, в которое входят собаки, волки, койоты, лисы и шакалы. Собак приручили более 10 000 лет назад. Они были впервые одомашнены

Неплохо! Теперь, если бы вы вместо этого использовали настройки top-p, это приводило бы к исходному результату каждый раз, когда вы выполняли логический вывод. Вот пример использования вместо этого алгоритма top-p.

result = happy_gen.generate_text(question, args=top_p_settings) 
print(result.text)

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

Включить контекст

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

input_no_context = "What is a library?" 
result_no_context = happy_gen.generate_text(input_no_context, args=beam_settings) 
print(result_no_context.text)

Результат. Библиотека - это собрание книг и других материалов, которые можно использовать для различных целей, например для исследований, обучения или развлечений. В чем разница между библиотекой и книжным магазином? Книжный магазин - это

input_with_context = "Happy Transformer is an open-souce Python package. What is a library?" 
result_with_context = happy_gen.generate_text(input_with_context, args=beam_settings) 
print(result_with_context.text)

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

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

Автоматически создавать вопросы

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

Моя команда проекта Capstone использовала распознавание именованных сущностей, чтобы идентифицировать существительные в контексте, а затем создавать вопросы для каждого из них. Например, если в тексте было слово «банан», то вопрос «Что такое банан?» будет сгенерирован. Мы сочли этот метод эффективным, но команда AI2 предложила более сложный подход для генерации вопросов с использованием модели генерации текста.

Мы обсудим, как использовать метод, предложенный AI2, для генерации вопросов. Они создали подсказки, а затем использовали модель генерации текста, чтобы продолжить подсказки, чтобы задать вопросы. Например, они применили разговор с самим собой к задаче под названием Winograd Schema Challenge, которая, если кратко описать, включает в себя предсказание, к какому существительному относится неоднозначное местоимение. Так, например, учитывая предложение «Молоток не поместился в ящик для инструментов, потому что он слишком велик», модель должна определить, он относится к «молотку». »Или« набор инструментов ». Ниже приведена часть подсказок, которые AI2 использовал для выполнения задания. [1]

Затем они добавили приглашение к контексту и заставили модель выдать текст. Создавая текст, модель потенциально может породить жизнеспособный вопрос, связанный с контекстом. Ниже приведен пример этого процесса в коде. Мы будем использовать выборку top-p со значением p, равным 0,2, и, самое большее, сгенерировать 6 токенов, как предлагается в статье AI2.

question_generation_settings = GENSettings(do_sample=True, top_k=0, top_p=0.2, max_length=6)
context = "The hammer did not fit into the toolbox because it is too big"
prompt = "What is the definition of"
input = context + prompt
q_g_result = happy_gen.generate_text(input, args=question_generation_settings)
print(q_g_result.text)

Результат: набор инструментов? О:

Теперь мы можем выделить сгенерированный вопрос с помощью следующей строки кода.

# Get the location of the question mark if it exists.
# Results in -1 if not present 
q_m_location = q_g_result.text.find("?")
full_question= ""
question_ending = ""
if q_m_location != -1:
   question_ending = q_g_result.text[:q_m_location+1]
   full_question = question_prompt + question_ending
   print(full_question)
   
else:
  print("question not generated. Try a different prompt.")

Результат: что такое трофей?

Префикс ответа

AI2 вручную создал префикс ответа для каждого префикса вопроса, чтобы помочь модели ответить на вопрос. Ниже приведена диаграмма, на которой показаны различные комбинации префиксов вопросов и ответов. [1]

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

subject = question_ending[:-1] 
print(subject)

Результат: набор инструментов

Подсказку можно разбить на три компонента: текст, который следует за темой, тема и текст, следующий за темой. Итак, эти компоненты можно комбинировать, как показано ниже.

answer_prefix = " The definition of" + subject + " is" 
print(answer_prefix)

Результат. Набор инструментов определяется

Собираем все вместе

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

final_input = context + full_question + answer_prefix 
print(final_input)

Результат. Молоток не поместился в ящик для инструментов, потому что он слишком большой. Что такое набор инструментов? Определение набора инструментов:

AI2 рекомендует использовать выборку top-p со значением p 0,5 для генерации 10 токенов. Давайте определим эти настройки.

answer_generation_settings = GENSettings(do_sample=True, top_k=0, top_p=0.5, max_length=10)

Теперь у нас есть все необходимое для создания окончательного результата.

answer_suffix = happy_gen.generate_text(final_input, args=answer_generation_settings).text
print(answer_suffix)

Результат: ящик для хранения и транспортировки инструментов. Это

Последний шаг - объединить наш префикс и суффикс для ответа.

final_result = answer_prefix + answer_suffix 
print(final_result)

Результат: набор инструментов - это ящик для хранения и транспортировки инструментов. Это

Это очень хорошо!

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

Отличия

Основное различие между методом, описанным в этой статье, и методом, описанным AI2, заключается в объеме фоновой информации, создаваемой для каждого контекста. Для каждого контекста они использовали не менее 5 префиксов вопросов. Затем для каждого префикса вопроса они сгенерировали 5 вопросов. И, наконец, на каждый вопрос они дали 10 ответов. Это означает, что для каждого контекста они дали как минимум 250 ответов - это много справочной информации!

Заключение

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

Ресурсы

Подпишитесь на мой канал на YouTube или подпишитесь на мою информационную рассылку, чтобы получать больше информации о предстоящем разговоре с самим собой!

Код, использованный в этом уроке

использованная литература

[1] В. Шварц, П. Уэст, Р. Брас, К. Бхагаватула1 и Ю. Чой, Ответ на здравый смысл без учителя с помощью разговора с самим собой (2020), EMNLP 2020

Атрибуции

Тед Браунлоу, Уилл Макдональд и Райли Уэллс были частью моей проектной команды.

Первоначально опубликовано на https://www.vennify.ai 7 августа 2021 г.