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

На рисунке ниже вы увидите два наиболее распространенных изображения, объясняющих RNN. Я уверен, что все вы видели эти два рисунка.

В левом RNN - это поле, и это поле получает два входа, один из них - входные выборки (X), а другой - выход из самого себя. Но как?

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

Попробуем объяснить это по-другому:

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

Поскольку я объясню это с помощью матриц, многие числа могут сбивать с толку, поэтому я изменил таблицу с терминами. Вот:

Мы устанавливаем Простую RNN с 6 «узлами». Я не использую слово «слой» специально. Потому что, насколько я понимаю, это однослойная сеть с 6 узлами. С Керасом это будет выглядеть следующим образом:

model = Sequential()

model.add(SimpleRNN(6, activation='relu', input_shape=(n_input, n_features), return_sequences = False))

model.add(Dense(1, activation='relu'))

В этой модели слой SimpleRNN дает выходную матрицу [1 X 6], а выход последнего плотного слоя представляет собой матрицу [1 X 1], которая представляет собой одно число (прогноз для количества велосипедов).

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

Пришло время объяснить каждый шаг.

Шаг 1: Временной шаг в нашем примере входит в RNN в качестве входных данных. Это строка данных за день 1. Инициализированная матрица весов ожидает ввода. Затем их умножение входит в функцию активации в качестве входных данных, а затем создается выходная матрица для дня 1. До сих пор то же самое и со стандартными нейронными сетями. Если бы это был MLP, это была бы одноуровневая сеть с 6 узлами.

Шаг 2: Выходная матрица для дня 1 запускает обратный путь к началу RNN, чтобы снова использовать его в качестве входных данных и не забывать :).

Шаг 3: Выходная матрица для дня 1 и входная матрица для дня 2 теперь являются двумя входными матрицами для слоя RNN. Здесь начинается магия последовательных нейронных сетей. Пока он производит вычисления для дня 2, он также может использовать воспоминания из дня 1.

Шаг 4: Здесь есть 2 умножения матриц. Один из них совпадает с Шагом-1, а другой - это умножение выходной матрицы первого дня на новую весовую матрицу для воспоминаний (прошлые значения). Это показывает, что слой RNN имеет 2 весовые матрицы, а не 1, как у обычных слоев нейронной сети.

На этот раз эти две матрицы результатов умножения (temp-1 и temp-2) вместе входят в функцию активации. Затем в качестве выходных данных создается выходная матрица для дня 2.

Шаг 5: Выходная матрица для дня 2 начинает обратный путь к началу слоя.

Шаг 6: тот же рисунок, что и на Шаге 3. Единственное отличие - это входные матрицы. Здесь входной день 3 и выходной день 2 будут использоваться в качестве входных матриц.

Шаг 7: Выходная матрица для дня 3 создается в качестве выходных данных, и история продолжается до конца выборочных данных.

Я попытался объяснить, как RNN работает и использует прошлые данные. Надеюсь, это будет полезно для людей, интересующихся этой темой.