Узнайте об искусственных нейронных сетях, глубоком обучении, рекуррентных нейронных сетях и LSTM, как никогда раньше, и используйте NLP для создания чат-бота!

Вы когда-нибудь мечтали о том, чтобы у вас был личный помощник, который отвечал на любые вопросы, которые вы могли задать, или с которым можно было поговорить? Что ж, благодаря машинному обучению и глубоким нейронным сетям этого не так уж далеко. Подумайте об удивительных возможностях Siri от Apple или Alexa от Amazon.

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

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

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

Выполнено? Тогда давай займемся этим!

Начало - искусственные нейронные сети

Для построения модели нейронной сети, которая будет использоваться для создания чат-бота, Keras будет использоваться очень популярная библиотека Python для нейронных сетей. Однако, прежде чем идти дальше, мы сначала должны понять, что такое искусственная нейронная сеть или ИНС.

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

Перцептрон

Простейшая модель ИНС состоит из одного нейрона и носит название Персептрон, которое звучит в Star Trek. Он был изобретен в 1957 году Фрэнком Россенблаттом и состоит из простого нейрона, который принимает взвешенную сумму своих входных данных (которые в биологическом нейроне будут дендритами), применяет к ним математическую функцию и выдает свой результат (выходные данные будет эквивалентом аксона биологического нейрона). Мы не будем вдаваться в подробности о различных функциях, которые можно здесь применить, поскольку цель публикации - не стать экспертом, а скорее получить общее представление о том, как работает нейронная сеть.

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

Когда сети построены таким образом, нейроны, которые не принадлежат входному или выходному слоям, считаются частью скрытых слоев, отображая своим именем одну из основных характеристик ИНС: они модели почти черного ящика; мы понимаем математику, лежащую в основе того, что происходит, и как бы интуитивно понимаем, что происходит внутри черного ящика, но если мы возьмем вывод скрытого слоя и попытаемся разобраться в нем, мы, вероятно, сломаем себе голову и не добьемся успеха. положительные результаты.

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

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

Что же тогда такое глубокое обучение?

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

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

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

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

Для традиционных алгоритмов машинного обучения (линейная или логистическая регрессия, SMV, случайные леса и т. Д.) Производительность увеличивается по мере обучения моделей с большим количеством данных до определенного момента, когда производительность перестает расти, когда мы загружаем модель дополнительными данными. . Когда эта точка достигнута, это похоже на то, что модель не знает, что делать с дополнительными данными, и ее производительность больше не может быть улучшена путем подачи большего количества данных.

С другой стороны, с нейронными сетями этого никогда не происходит. Производительность почти всегда увеличивается с данными (если, конечно, эти данные хорошего качества), и это происходит быстрее, в зависимости от размера сети. Следовательно, если мы хотим получить максимально возможную производительность, нам необходимо находиться где-нибудь на зеленой линии (Большая нейронная сеть) и справа от оси X ( большой объем данных).

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

Другой важный специалист в этой области, Джефф Дин (один из инициаторов внедрения Deep Learning в Google), говорит о глубоком обучении следующее:

Когда вы слышите термин «глубокое обучение», просто представьте себе большую глубокую нейронную сеть. Глубокий обычно относится к количеству слоев, поэтому это популярный термин, принятый в прессе. Я считаю их в целом глубокими нейронными сетями.

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

Хорошо, отлично, я все это понял, но как на самом деле нейронные сети учатся?

Что ж, вы, наверное, уже догадались: они учатся на данных.

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

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

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

Изучение последовательных данных - Рекуррентные нейронные сети

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

Рекуррентные нейронные сети - это особый вид нейронных сетей, которые предназначены для эффективной работы с последовательными данными. Этот тип данных включает временные ряды (список значений некоторых параметров за определенный период времени), текстовые документы, которые можно рассматривать как последовательность слов, или audio, который можно рассматривать как последовательность звуковых частот.

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

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

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

Нам нужна какая-то долговременная память, как раз то, что предоставляют LSTM.

Улучшение нашей памяти - Сети долгосрочной краткосрочной памяти

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

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

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

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

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

Заключение

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

Да, кстати, помните этот образ?

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

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

Безумно, правда?

Если вы хотите узнать, как использовать Deep Learning для создания классного чат-бота, подписывайтесь на меня на Medium и следите за моей следующей публикацией!

А пока будьте осторожны и наслаждайтесь искусственным интеллектом!

Дополнительные ресурсы:

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

Хорошо, это все, надеюсь, вам понравился пост. Не стесняйтесь связываться со мной в LinkedIn или подписывайтесь на меня в Twitter на @jaimezorno. Также вы можете ознакомиться с другими моими постами по Data Science и Machine Learning здесь. Приятного чтения!

Наконец, ознакомьтесь с другими моими статьями о глубоком обучении для НЛП:





Кроме того, чтобы узнать больше о машинном обучении и искусственном интеллекте, посетите следующий репозиторий: