Рубрики
Без рубрики

Чат-боты? Мой первый опыт машинного обучения

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

Автор оригинала: Matt Hope.

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

Теперь перейдем к хорошему. Я решил пойти дальше и поставил перед собой задачу заставить свой компьютер говорить, а именно разработать чат-бота, используя исключительно методы ML. Конечно, сначала мне нужно было найти что-то существенное, чтобы основать свою диссертацию, я пошел дальше и решил “Решить проблему с современными чат-ботами”.

Проблема с чат-ботами

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

Я знаю, что этот вопрос не кажется слишком важным, но, тем не менее, это был вызов, и я был полон решимости найти решение!

Мое “решение”

Конечно, я хотел окунуться в удивительный мир ML, поэтому я пошел прямо вперед и сделал именно это, после тонны и тонны поздних ночных исследований я нашел интересный подход к переводу, который я раньше не видел. NTM (Neural Translation Machine) – это распространенный метод, используемый для многоязычного перевода, например, с английского на испанский. Конечно, я, будучи немного наивным в то время, решил, что если перевод одного языка на другой с помощью этой техники так прост, то перевод одного языка обратно на себя не может быть намного сложнее, верно? О, неужели я ошибся?..проблема с этим подходом заключается в том, что существует бесчисленное количество приемлемых ответов при попытке перевести что-то вроде “привет, как дела?” обратно на тот же язык. В то время как это прекрасно работает при переводе на другой язык, так как всегда будет только небольшой набор подходящих переводов.

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

Прежде чем приступить к моей реализации, важно понять основные концепции NTM. Существует две основные части NTM: кодер и декодер. Кодер принимает входной текст и кодирует его в большую матрицу, которая может быть прочитана машиной. Затем декодер принимает эту большую матрицу и пытается декодировать ее обратно в текст. Это крайнее упрощение НТМ, и оно становится гораздо более сложным при рассмотрении реальных деталей этой модели. Тем не менее, это не является целью этой статьи, и есть много официальных документов, объясняющих эту концепцию намного лучше, чем я когда-либо мог.

После еще нескольких исследований я пошел прямо вперед и начал реализовывать свою собственную NTM с использованием Keras и Tensorflow. После разработки основных частей NTM я оказался в довольно неловкой ситуации. У меня было больше данных для обучения модели, чем позволяло мое оборудование. К счастью, мне удалось наткнуться на замечательную функцию в Keras, которая позволяет вам создать свой собственный “генератор данных”. Это дало мне возможность капельно передавать моему NTM огромный набор данных, который у меня был на диске, не выходя за рамки моих аппаратных ограничений.

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

Что нужно улучшить

Сам чат-бот не совсем “умный”, он может отвечать на большинство предложений, но большинство ответов в конечном итоге представляют собой мешанину слов, которые являются чистой бессмыслицей. Это было исключительно по моей вине и из-за плохих наборов данных, которые я предоставил на этапе обучения. Я обнаружил, что самая трудная часть этого проекта заключалась даже не в том, чтобы создать модель и заставить ее работать, а в том, чтобы просто найти правильные данные для обучения моей модели. Если бы мне пришлось вернуться и переделать этот проект, я бы потратил больше времени на изучение данных обучения, поскольку это, по-видимому, было ключом к успеху.

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

Попробуйте сами!

Я все еще размещаю его в azure вместе с веб-проектом, который я прототипировал, если вам интересно, следующие ссылки будут полезны: • https://github.com/AtLeastITry/seq2seq-keras-chatBot/ (исходный код) • https://ce601-chatbot.azurewebsites.net (веб-API) • https://ce601-ui.azurewebsites.net (веб-приложение)