Абстрактный

Создание диалога или разработка интеллектуального диалогового агента с использованием техники искусственного интеллекта или машинного обучения - интересная проблема в области обработки естественного языка. Агенты диалога / разговора преимущественно используются предприятиями, государственными организациями и некоммерческими организациями. Они часто используются финансовыми организациями, такими как банки, компании, выпускающие кредитные карты, такими предприятиями, как интернет-магазины и стартапы. Среди современных чат-ботов многие разработаны с использованием методов, основанных на правилах, простых алгоритмов машинного обучения или методов, основанных на поиске, которые не дают хороших результатов. В этом эксперименте я создал чат-бота с использованием архитектуры seq2seq без механизма внимания и с ним. Для кодировщика и декодера используется RNN-LSTM для сохранения, чтобы сохранить временную зависимость. Также использовался поиск луча, чтобы модель не всегда предсказывала только одну возможность на основе вероятности вывода.

Введение

Что такое Шабо

Chabot - это программное обеспечение с искусственным интеллектом (AI), которое может имитировать разговор (или чат) с пользователем на естественном языке через приложения для обмена сообщениями, веб-сайты, мобильные приложения или по телефону.

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

Как работает Шабо

Основные операции, происходящие во время взаимодействия человека и чат-бота, перечислены ниже:

1. Человек задал вопрос с помощью текста или речи.
2. Чат-бот должен понимать его содержание и намерения человека. Это самая важная часть.
3. Чат-бот дает ответ в той же среде. как поступил запрос.
4. Человек должен понимать ответ чат-бота. И цикл продолжается.

Типы чат-ботов

Ниже описаны в основном 2 типа ботов:

1. Генеративная. В генеративной модели чат-бот не использует никаких предопределенных репозиториев. Это продвинутая форма чат-бота, которая использует глубокое обучение для ответа на запросы.

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

Примеры использования чат-ботов:

1. Служба поддержки клиентов - поддержка веб-сайтов, ИТ-служба поддержки, поддержка из приложений и т. Д.

2. Продажи - резервирование и предварительный отбор потенциальных клиентов.

3. Маркетинг - рекомендации по продукту, начало активной консервации и т. Д.

Цели

Бизнес-проблема

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

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

Конечная цель

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

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

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

Ограничения

1. Работа с длинными и сложными предложениями.
2. Более быстрое время отклика.
3. Ограничение текущего НЛП для решения таких проблем, как смешение местного языка и сленга.

Как создать чат-бота

Есть много способов создать чат-ботов для более конкретного использования, а не для общего использования. Ниже приведены несколько способов создания чат-бота:

1. Сопоставление с шаблоном. Один из самых простых способов создания таких чат-ботов - использовать базу знаний, которая содержит документы, и каждый документ содержит определенный ‹pattern› и ‹template›. Когда бот получает ввод, соответствующий ‹pattern›, он отправляет сообщение, хранящееся в ‹template›, в качестве ответа. ‹Pattern› может быть такой фразой, как «Как вас зовут?» или шаблон «Меня зовут *», где «*» - регулярное выражение. Обычно эти пары ‹pattern› ‹template› вставляются вручную.

2. Обработка естественного языка - использование пакета слов (BOW) в неглубоких или глубоких сетях. BOW - это большие векторы, сохраняющие место для каждого слова, присутствующего в словаре. Затем закодируйте предложение с помощью 0 или 1, где 0 означает слово, отсутствующее в предложении, а 1 означает наличие. Этот метод подходит для ответов типа «Да» или «Нет». Немногочисленные проблемы связаны с фиксированным размером входной длины, который также является очень большим и разреженным, не сохраняется информация о последовательности и очень малый размер выходных данных.

Архитектура Seq2seq. Другой способ - использовать модели кодировщика-декодера. Этот метод может сохранить информацию о последовательности предложения. Использует встраивание, которое является обновлением кодировки BOW. Использование модели многие-ко-многим последовательностям, в которой размер входных и выходных данных различается. Поскольку веса для кодировщика и декодера одинаковы, поэтому даже при изменении размеров для ввода и вывода эта модель все еще может работать. Проблема с этой моделью в том, что если входной размер слишком велик, кодировщик не может сохранить контекст предложения. Модель внимания может справиться с этим, когда для генерации слова в декодере важно несколько определенных слов.

Использование глубокого обучения

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

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

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

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

Источник набора данных

Я использую набор данных службы поддержки Twitter для обучения чат-бота. Вы можете получить этот набор данных по ссылке ниже:



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

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

Сопутствующие работы

В последнее время было много разработок и экспериментов с диалоговым агентом.

система. многие продвинутые чат-боты используют передовые методы обработки естественного языка (NLP) и методы глубокого обучения, такие как Deep Neural Network (DNN)

Десятиминутное введение в последовательное обучение в Керасе

Автор: Франсуа Шоле

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

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

Эта модель состоит из 2 частей: кодировщика и декодера. Они состоят из слоя RNN (рекуррентной нейронной сети), который полезен для хранения последовательной информации о заданном тексте в качестве ввода.

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

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

Чат-бот, использующий модели Seq2Seq LSTM

Это из Google Colab. Это ноутбук для ipython с полным кодом от начала до прогнозирования.

Официальное описание: «В этой записной книжке мы соберем модель seq2seq LSTM с использованием Keras Functional API, чтобы создать работающего чат-бота, который будет отвечать на заданные ему вопросы. Платформы обмена сообщениями, такие как Allo, реализовали сервисы чат-ботов для привлечения пользователей. Знаменитые Google Assistant, Siri, Cortana и Alexa могли быть созданы с использованием аналогичных моделей ».

Объясняя архитектуру ниже:

Во-первых, предварительная обработка данных: построение пары вопросов и ответов. Удалите ненужные типы данных, которые создаются при анализе данных. Добавьте ‹START› и ‹END› ко всем ответам. Создайте токенизатор и загрузите в него всю лексику (вопросы + ответы).

Во-вторых, модель Seq2seq: модель требует трех массивов, а именно входных данных кодировщика, входных данных декодера и выходных данных декодера. Модель будет иметь слои Embedding, LSTM и Dense.

encoder_input_data: токенизируйте вопросы. Набейте их на максимальную длину. Для decoder_input_data: токенизируйте ответы. Набейте их на максимальную длину. Для decoder_output_data: токенизируйте ответы. Удалите первый элемент из всех tokenized_answers. Это элемент ‹START›, который мы добавили ранее.

Наконец, модель интерференции: создавайте модели вывода, которые помогают предсказывать ответы. Модель вывода кодировщика: принимает вопрос в качестве входа и выводит состояния LSTM (h и c). Модель вывода декодера: принимает 2 входа, один - это состояния LSTM (выход модели кодировщика), второй - последовательности входных ответов (те, которые не имеют тега ‹start›). Он выведет ответы на вопрос, который мы передали модели кодировщика, и значения его состояния.

Архитектура

Мы будем использовать двунаправленную модель seq2seq «многие ко многим» для создания нашего чат-бота.

Seq2seq модель

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

Существуют различные модели seq2seq, такие как:

1. Один ко многим: он имеет дело с фиксированным размером информации на входе, который дает последовательность данных на выходе. Пример: Image Captioning принимает изображение в качестве входных данных и выводит предложение слов.

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

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

4. Двунаправленный «многие-ко-многим»: синхронизированный ввод и вывод последовательности. Обратите внимание, что в каждом случае нет заранее заданных ограничений на последовательности длин, потому что рекуррентное преобразование (зеленый цвет) является фиксированным и может применяться столько раз, сколько мы захотим. Пример: классификация видео, в которой мы хотим пометить каждый кадр видео.

Эта архитектура состоит из 2 компонентов: i. Кодировщик ii. Декодер.

Кодировщик принимает входные данные и возвращает скрытые состояния для этой конкретной временной метки, а в конце предложения он передает скрытые состояния декодеру, который будет действовать как контекст для всей данной входной последовательности. Декодер обучен предсказывать следующие символы целевой последовательности, учитывая предыдущие слова целевой последовательности. Оба они состоят из RNN LSTM.

RNN и LSTM

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

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

Сети LSTM состоят из 4 основных компонентов:

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

2. Входной шлюз: для обновления состояния ячейки есть входной шлюз. Передайте предыдущее скрытое состояние и текущий ввод в сигмовидную функцию. Это решает, какие значения будут обновлены, путем преобразования значений между 0 и 1. 0 означает не важно, а 1 означает важное. Также передайте скрытое состояние и текущий ввод в функцию tanh, чтобы сжать значения от -1 до 1, чтобы помочь регулировать сеть. Умножьте выход tanh на выходной сигнал сигмоида. Выход сигмоида решит, какую информацию важно сохранить в выходном сигнале tanh.

3. Состояние ячейки: вычислить состояние ячейки, сначала состояние ячейки точечно умножается на вектор забывания. Это имеет возможность отбрасывать значения в состоянии ячейки, если оно умножается на значения, близкие к нулю. Затем возьмите выходной сигнал из входного вентиля и выполните точечное сложение, которое обновляет состояние ячейки до новых значений, которые нейронная сеть считает релевантными. Это дает нам новое состояние клетки.

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

Механизм внимания

Проблема с моделями seq2seq заключается в том, что вся информация о входном предложении закодирована в вектор фиксированной длины. Это вызывает проблемы с переводом длинных предложений. Если вы посмотрите, как люди переводят, мы увидим, что мы, люди, не берем в уме сразу все предложение, а затем пытаемся перевести его целиком. Обычно мы переводим небольшую часть входных данных, а затем снова возвращаемся к исходным входным данным. Итак, есть структура туда-сюда. Чтобы решить эту проблему, они ввели механизм внимания с моделями кодировщика-декодера.

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

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

Вектор контекста зависит от объединенных скрытых состояний кодировщиков и альфы некоторого количества слов Tx. Здесь Tx - гиперпараметр. Таким образом, вектор контекста - это взвешенная сумма альфа и скрытых состояний.

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

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

Может рассчитывать веса внимания, применяя слой Softmax по счету. Учитывая вектор выравнивания как веса, вектор контекста ct вычисляется как средневзвешенное значение по всем скрытым состояниям источника.

СИНЯЯ оценка - это мера перевода. Из графика видно, что две модели, не основанные на внимании, RNNenc-30 и RNNenc-50 хорошо работают для 20–30 слов для входных данных, после чего их производительность снижается. Для модели RNNsearch-30, основанной на внимании, есть небольшое улучшение, и RNNsearch-50 работает стабильно для любого количества входных слов.

Вот несколько хороших тепловых карт для лучшей визуализации:

Каждый пиксель на приведенной выше тепловой карте показывает весовые альфа, белые и светлые блоки имеют высокое значение альфа, а черные и темные пиксели имеют более низкую альфа. Ось X графика предназначена для английских слов, а ось Y - для французских слов. Чтобы перевести слово вместе с правильным словом, модель обращает внимание на некоторые другие слова для получения правильного прогноза.

В заключение я собираюсь использовать модель seq2seq с двунаправленным LSTM и для улучшения результата добавлю в модель механизм внимания. Для функции интерференции использование лучевого поиска вместо жадного поиска также будет обрабатывать слова вне словаря.

Показатели эффективности:

Категориальная перекрестная энтропия: чтобы обучить модель с помощью настраиваемой функции потерь, чтобы игнорировать потерю отступов.

Оценка BLEU: для проверки производительности модели.

Исследовательский анализ данных

Теперь, когда мы определились с моделью и метриками. Давайте подробно проверим данные и исследуем их, выполнив базовый EDA.

# Loading the data into dataframe
tweets_df = pd.read_csv('twcs.csv', encoding='utf-8')

# Check the size of the data
tweets_df.shape
out: (2811774, 7)

Подробная информация обо всех столбцах и типах данных.

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

# Final shape of our data after making it question-answer conversations
data.shape
(794299, 6)

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

Статистика:

Нам нужно проверить статистику различных подсчетов как для вопросов, так и для ответов, а затем визуализировать их с помощью pdf и boxplot.

Сделаем для этого служебные функции.

Pdf и Boxplot:

Количество предложений в каждом твите:

# Sentences in question
data[‘qsn_len’] = data[‘question’].astype(‘str’).apply(lambda x:len(TextBlob(x).sentences))
# No of sentences in answer
data[‘ans_len’] = data[‘answer’].astype(‘str’).apply(lambda x:len(TextBlob(x).sentences))

Вопросы:

  1. Количество предложений в вопросах начинается с 1 по 107.
  2. Большая часть текста состоит менее чем из 5 предложений. То есть 99% процентиля строк содержат 5 или меньше предложений.
  3. В нескольких строках есть 107 предложений, что необычно. Но поскольку данные ограничены 140 словами, нам не о чем беспокоиться.

Ответы:

  1. В ответ количество отправленных начинается с 1 по 11.
  2. В большинстве строк меньше 5 предложений
  3. Максимальное количество предложений также 11. Это нормально.

Количество слов в каждом твите:

# Word counts in question
data['qsn_words'] = data['question'].astype('str').apply(lambda x: len(x.strip().split()))
# Word counts in answer
data['ans_words'] = data['answer'].astype('str').apply(lambda x: len(x.strip().split()))

Вопросы:

1. Минимальное значение счетчика - 1, что означает 1 слово в строке.
2. Максимальное количество слов - 112. Предложение состоит из маленьких символов
3. В большинстве строк количество слов меньше, чем 50
4. В pdf мы видим, что значение находится в строке от 0 до 60 слов. IQR 14–24

Ответы:

1. Минимальное значение равно 1, а максимальное - 66. Мы можем заметить, что столбец с ответами намного разумнее, чем столбец вопросов.
2. Большинство строк содержат значения менее 46 слов.
3. В формате pdf большинство слов 0–50 имеют высокий процент встречаемости.
4. Значение IQR составляет 14–24. То же, что и вопрос. Так что оба данных в чем-то похожи по структуре.

Количество упоминаний

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

# Mentions in questions
data['qsn_mention'] = data['question'].apply(lambda x: len(re.findall(r"@\S+", x)))
# Mentions in answers
data['ans_mention'] = data['answer'].apply(lambda x: len(re.findall(r"@\S+", x)))

1. Максимальное количество упоминаний в вопросе - 25, а ответов - 16.
2. Как правило, пользователи используют больше упоминаний, чем руководитель службы поддержки клиентов.

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

Количество слов с хэштегами «#»

У нас есть много слов с хэштегами для создания трендов в твитерах. Давай проверим их статистику

  1. Максимальное значение в вопросах - 19, а в ответах - 6.
  2. Использование хэштегов немного меньше, чем использование упоминаний в твиттере.
  3. Но есть люди, которые пишут в твитах, используя только слова хэштега и ставя хэштеги перед всеми словами в своих твитах.
  4. Поэтому мы не будем удалять слова из хэштегов, поскольку они, как правило, являются частью разговора и имеют какое-то значение.

Очистка данных

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

Приступим к очистке наших данных -

Разъединение

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

Удаление смайлов

Смайлы очень часто используются в любых публикациях в социальных сетях. В этих данных также очень много смайликов. Есть также смайлики, которые не являются каким-либо специальным символом, а являются символами, доступными на клавиатуре, и мы обычно создаем с ними смайлики, например::): D и многие другие. Мы должны их удалить. Нижеприведенный фрагмент кода может выполнить эту задачу.

Теперь мы можем очистить все данные, используя функцию ниже

Как обсуждалось во время EDA, нам нужно проверить еще несколько статистических данных, так что давайте приступим к этому.

Количество слов в тексте

  1. Таким образом, максимальное количество слов - 68 в вопросах и 63 в ответах.
  2. В вопросах больше слов, чем в ответах
  3. В вопросах наибольший объем имеют слова 5–25, а в ответах - 10–25.
  4. Мы можем использовать max_len для нашего текста = 50, который охватывает более 99 процентилей значений.

Подсчет общих слов

1. Между вопросами и ответами не так много общих слов.

2. Есть много 0 общих слов, что означает отсутствие общих слов. Также 1 и 2 тоже довольно много.

3. У нас нет слов 3–5 заметно.

Частота слов в корпусе

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

1. Ищем наиболее частые слова в вопросах и ответах.

2. Посмотрев слова, мы увидим, что большинство слов встречается очень мало раз. Есть слова, которые присутствуют огромное количество раз

3. Установлено, что 25 самых популярных слов - это все игнорируемые слова, а среди 50 самых распространенных слов всего 45 слов являются стоп-словами.

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

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

Увидев несколько точек данных и проверив длину словаря, я обнаружил, что есть много орфографических ошибок, из-за чего размер словаря составляет около 150 000+ на вопрос. Чтобы получить хороший результат, нужно исправить слова с ошибками.

# Using symspell to correct spelling
import pkg_resources
from symspellpy import SymSpell, Verbosity
sym_spell = SymSpell(max_dictionary_edit_distance=2, prefix_length=7)
dictionary_path = pkg_resources.resource_filename("symspellpy", "frequency_dictionary_en_82_765.txt")
bigram_path = pkg_resources.resource_filename("symspellpy", "frequency_bigramdictionary_en_243_342.txt")
sym_spell.load_dictionary(dictionary_path, term_index=0, count_index=1)
sym_spell.load_bigram_dictionary(bigram_path, term_index=0, count_index=2)
# utility function
def correct_spellings(text):
    " For a given sentence this function returns a sentence after correcting spelling of words "
    suggestions = sym_spell.lookup_compound(text, max_edit_distance=2)
return suggestions[0]._term

После исправления орфографии объем словарного запаса вопросов уменьшился до 50 000, а количество ответов - до 28 000. Также может справиться с проблемой редких слов в наборе данных.

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

# Adding start and end tokens to decoder input
data['clean_answer'] = '<start> ' + data['clean_answer'].astype(str) + ' <end>'

Выбор максимальной длины 95 процентного значения, равного 39. И создание наборов данных ввода кодера, ввода декодера и вывода декодера. Необходимо разметить и дополнить текст до максимальной длины.

# Taking data less and equal 39 words
data = data[(data[‘qsn_len’]>2) & (data[‘qsn_len’] <= MAXLEN)]
data = data[(data[‘ans_len’]>2) & (data[‘ans_len’] <= MAXLEN)]
# Decoder output data
data['answer_out'] = data['clean_answer'].apply(lambda x: " ".join(x.split()[1:]))
# Selecting necessary columns
data = data[['clean_question', 'clean_answer', 'answer_out']].copy()
data.rename(columns={'clean_question':'question', 'clean_answer':'answer_inp'}, inplace=True)

Теперь нам нужно преобразовать этот текст в числа. Для этого я использую tf keras Tokenizer (). А затем для повышения производительности мы можем загрузить предварительно обученные векторы внедрения. Использование модели Fasttext для генерации векторов встраивания каждого слова. Преимущество этого заключается в том, что мы также можем получать векторы слов вне словаря.

Модель здания

Теперь, когда у нас есть все данные и предварительно обученная матрица встраивания, мы должны перейти к построению модели. Я буду использовать модели подкласса, в которых будут Encoder, Attention, Decoder и еще один класс для вызова окончательной модели.

Кодировщик

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

Внимание

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

OneStepDecoder

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

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

Декодер

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

Encoder_decoder

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

Пользовательская функция потерь

loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True, reduction='none')
 
def custom_lossfunction(real, pred):
    # Custom loss function that will not consider the loss for padded zeros.
    # Refer https://www.tensorflow.org/tutorials/text/nmt_with_attention#define_the_optimizer_and_the_loss_function
    mask = tf.math.logical_not(tf.math.equal(real, 0))
    loss_ = loss_object(real, pred)
 
    mask = tf.cast(mask, dtype=loss_.dtype)
    loss_ *= mask
 
    return tf.reduce_mean(loss_)

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

Как мы видим, потери все еще уменьшаются, поэтому давайте еще раз потренируемся еще 10 эпох:

Вмешательство

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

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

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

Анализ результатов

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

Средний балл BLEU: 0,4310485454195498

Оценка BLEU не такая высокая, теперь мы проведем некоторый анализ результатов и попытаемся выяснить возможные причины, по которым модель не дает более высоких оценок.

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

  1. Разделите данные на хорошие, средние и плохие на основе оценки предложения BLEU.
  2. Проверьте, влияет ли количество слов в предложении на производительность.

3. Не будет изучать общие слова, присутствующие в вопросе и ответе, вопросе и предсказании, и не будет ли это иметь какое-либо влияние.

4. Частота слов в корпусе как вопроса, так и ответа.

5. Количество очень часто встречающихся слов в предложении.

Предоставление нескольких графиков EDA, которые влияют на производительность модели.

  • Количество слов в предложении для ответа

  • Частота слов в вопросах

График частоты в логарифмическом масштабе трудно представить себе.

  • Часто используемые слова в предложениях

Я подробно проработал EDA по всем упомянутым выше функциям, вы можете проверить блокнот в моем GitHub.

Вывод:

Чтобы завершить наш EDA и объяснить факторы, влияющие на производительность модели, мы приводим ниже подробные сведения:

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

2. Один из основных факторов производительности модели. При большем количестве слов в словарном запасе и вопрос, и ответ снижают его оценку BLEU. В словарном запасе 80% редких слов, которые модель не может выучить. И еще 5% частых слов, которые сильно влияют на результат.

3. Модель способна предсказать только 15% слов из всего словаря ответов, а затем для всех слов она не может предсказать замену часто встречающимися словами.

4. Отсутствие частых слов в ответе, когда количество часто используемых слов в прогнозируемых предложениях уменьшается, тогда модель дает «плохие» оценки BLEU.

Будущая работа

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

Обучите модель на большее количество эпох.

Больше очищайте данные и удаляйте больше редких и частых слов.

Выберите другой набор данных, в котором нет этих редких слов.

Используйте новейшие и лучшие методы, такие как трансформаторы.

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













GitHub

Вы можете найти всю мою работу, все коды и записные книжки ipython в этом профиле github.



LinkedIn