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

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

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

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

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

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

Первый и последний слой являются входным и выходным слоями. Средний слой — это скрытый слой, и их может быть сколько угодно.

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

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

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

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

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

В центре внимания этой серии статей будет представление некоторых вариантов нейронных сетей, которые широко используются сегодня, то есть рекуррентных нейронных сетей (RNN), долговременной кратковременной памяти (LSTM) и Gated Recurrent Units (GRU). Имейте в виду, что все может стать довольно странным и математическим, но не беспокойтесь об этом. Вы прекрасно справитесь, даже если вы не волшебник математики.

Я начну с рекуррентных нейронных сетей.

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

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

Эта диаграмма прекрасно показывает, как возникает повторение. Здесь у вас есть скрытое состояние, которое вы можете представить как память сети. На диаграмме видно, как на каждом шаге по времени «t» выход на этом шаге зависит не только от ввода на этом шаге, но и от «памяти» предыдущего шага.

Параметры «U», «V» и «W» — это веса, связанные с входами, выходами и скрытым состоянием соответственно.

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