Нейронные сети и Amelie Bot

Нейронные сети и Amelie Bot

AmeliePick


Вместо предисловия

Далее будет много букв, которые описывают алгоритмы машинного обучения, алгоритмы и код Amelie Bot.


Что это такое?!

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

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

Программная или искуственная нейросеть(ИНС) всего лишь имитирует работу человеского мозга.

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

Итак, как же это работает? Как было сказано выше, ИНС имитирует наш мозг и представляет собой массив минипроцессоров, которые поделены на три группы:


Точки входа - нейроны, через которые подаётся информация.

Скрытый слой - нейроны этого слоя повышают степень нелинейности отображения входов в выходы.

Точки выхода - нейроны, через которые выдаётся конечный результат.

Графическое представление ИНС


Способы Машинного обучения

Обучение с учителем (Supervised learning) — способ хорош, если необходимо машину научить чему-то конкретному. Машине даётся огромная выборка данных, с которыми происходит происходит работа до тех пор, пока не получится ожидаемый результат. Обучение с учителем применяется для задач классификации и прогнозирования.


Обучение без учителя (Unsupervised learning) — При обучении без учителя машина исследует набор данных и выявляет скрытые закономерности и взаимосвязи между переменными. Способ хорош в задачах кластеризации.


Обучение с частичным привлечением учителя (Semi-Supervised learning) — в данном способе, учитель, разметив часть данных, даёт машине понять, каким образом обработать оставшиеся данные.


Обучение с подкреплением (Reinforcement learning) — похоже на дрессировку животного. За каждое верное решение, принятое машиной, её "вознаграждают", таким образом если автоматизировать подсчёт вознаграждений, машина может самостоятельно обучаться. 


Глубинное обучение (Deep learning) — может проходить без учителя или с подкреплением. При глубинном обучении частично имитируются принципы обучения людей — когда используются нейронные сети для все более подробного уточнения характеристик набора данных.


Задачи машинного обучения

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

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

Задача кластеризации – задача разбиения заданной выборки объектов на непересекающиеся подмножества, называемые кластерами, так, чтобы каждый кластер состоял из схожих объектов, а объекты разных кластеров существенно отличались. Это метод обучения без учителя, который можно использовать для решения задач классификации.

Задача уменьшения размерности – сведение большого числа признаков к меньшему (обычно 2–3) для удобства их последующей визуализации.

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


Переходим к боту Amelie


В интернете полно гайдов как написать своего чат-бота. Проблема у всех гайдов одна - автор каждого блога использует уже готовые технологии. И вся работа сводится к простой связке, которая не требует ни скилла, ни понимания всей работы программы и весь готовый код занимает максимум строк 20 кода. Ну и к тому же, нам не понятно, что находится в коде используемых технологий. Я же кратко постараюсь описать принцип работы своего чат бота Amelie без использования готовых технологий, для создания ботов.

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

Кхм, начнём!

В основе бота лежит нейросеть, которая классифицирует входные данные.


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

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

Итак, нейросеть классифицирует входные данные согласно модели БД. 

Например:

Привет Амели @ Приветствие


Бот может понимать нас, но не может ответить. Для возможности ответа был создан ещё один файл для ответов на разные типы запросов.




Теперь алгоритм бота выглядит примерно так:

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

В итоге на запрос: 

Как звали создателя Eliza?

Бот ответит:

Вот, что я нашла на ваш вопрос.

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

Для того, что бы бот умел это нам понадобится что-то наподобие следующего алгоритма:

Если запрос Поиск - открыть браузер и вставить в запрос ввод пользователя.

Тут есть один нюанс. Дело в том, что видеть в запросе браузера такой же текст, что и в запросе к боту, не совсем приятно. Ведь мы просили бота о чём то конкретном. Для этого надо отформатировать пользовательский ввод. И если в английском языке с этим чуть проще, то для русского языка нам понадобится стемминг. Стемминг приводит слова к одной форме, так слова: топора, топорика, будут приведены к слову топор.


После применения стемминга запрос типа:

Найди музыку,

будет приведен к запросу:

Найди музыка.

Теперь надо выделить смысл запроса и отсеять "ненужные" слова. Эти "ненужные" слова будут для нас ключевыми.


Заведём ещё один файл в нашей БД, где будут храниться такие ключевые слова как: Найди, Найди на, Расскажи, Найди на YouTube и т.д.


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

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

Найди музыку = музыку.

Далее для русского языка проводим стемминг.

музыку = музыка.

Теперь можно открывать браузер и вставлять в запрос слово музыка, а не весь тот текст, что мы передали боту (Найди музыку).

Бот умеет искать информацию в интернете. Однако тут мы сами вольны выбирать поисковую систему. В моём случае бот ищет информацию в Google. 

Для этого в URL https://www.google.ru/search?q=

После знака равно мы добавляем ввод пользователя.

Код откыртия браузера с редактированным вводом


Если вы часто смотрите YouTube, можно завести отдельный тип запроса, который будет искать информацию только на ютубе.

Например: Найди на Ютубе музыку.

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

Так URL ютуба: https://m.youtube.com

Для осуществления поиска на ютубе нужен такой URL: https://m.youtube.com/results?search_query=

Где после занака равно мы вставляем нужный запрос.

И в итоге запрос

Найди на ютубе 8D Tunes

будет иметь такой вид:

https://m.youtube.com/results?search_query=8D Tunes

Код:


И ютуб выдаст нам список искомых видео.



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

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

Правда данная проблема решилась парсингом реестра, но это не принесло должных результатов. Парсинг реестра на моей машине с i5 4460 занимал по времени 10-15 секунд, что довольно долго. Более того, эту процедуру необходимо было проделывать каждый запуск бота. Ибо если пользователь удалил или установил новую программу, то бот должен был знать об этом. Сразу с этой проблемой возникла и другая, а именно поиск конкретного .exe. Ведь не каждый пользователь знает название исполняемого файла той или иной программы. В итоге был найден не очень красивый, но тем не менее рабочий способ: Предоставить пользователю самому указать путь до программы и указать то название, через которое он – юзер будет запускать приложение.

Так появились потребность в создании ещё одного файла в БД, где хранится информация о приложениях.

И выглядит это следующим образом:


Program name= "path to file"


Теперь если юзер попросит бота открыть Origin, бот обратится к файлу по пути и просто его запустит, при этом уведомив пользователя, выдав какой либо ответ, например: Приложение открыто!


Итак, как выглядит сам алгоритм:

Если запрос Открыть --- Редактировать запрос от юзера --- Поиск названия приложения в БД и если такое приложение есть --- открыть .exe по пути, указанному в файле БД --- Выдать ответ.


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


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

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

Далее выдаётся какой-нибудь ответ.

Всё бы хорошо, но этот метод имеет недостаток. Это необходимость указывать путь до .exe, что приводит к потере времени, ведь пока юзер узнает путь, даст его боту, указав при этом имя программы, то юзеру в данном случае проще самому запустить программу. Даже несмотря на то, что при следующем запуске бота, Амели без проблем откроет это приложение, всё равно такой метод не удобен, имхо и в дальнейшем этот метод будет изменён.


Итак, основные функции: поиск информации в интернете, открытие приложений готовы. Осталось сделать голосовое управление ботом, да и самому боту дать голос. 

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

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

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

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

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


Важное замечание! Так как при использовании Google Speech мы получаем mp3 файлы, то их необходимо удалять иначе мы рискуем забить ими весь диск.

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

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

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


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


Осталось сделать возможность вкл/выкл синтеза речи и выбора языка.

Для этого создадим две функции. Первая для создания файла настроек, другая для получения значения параметра language.


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

Так выглядит файл settings.ini

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

Теперь нужно всё это обрабатывать


Так в нужных местах кода мы просто будем вызывать функцию. Исходя из выбора языка, выдавать нужное сообщение по его id.


Например для сообщения о том, что микрофон не подключен id = errMicro.


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


В статье было освщена работа Amelie Bot в общем и некоторые моменты были опущены. Весь исходный код находится на GutHub.

Что в разработке: имитация общения, получение обновлений.


У CS50 есть видео, где довольно подробно разбирается код первого чат бота Eliza, так же подробно рассказывается об обработке естественного языка: https://youtu.be/VT4hguEycoY


На этом я заканчиваю своё повествование и помни: Неважно что будет впереди — даже если сейчас это не понятно для тебя - не смей останавливаться!

Peace of mind

Report Page