Глубокое обучение

Три типа рекуррентных нейронных сетей

Давайте посмотрим на RNN, LSTM и GRU.

Рекуррентные нейронные сети — это нейронные сети, предназначенные для данных последовательности. Данные последовательности — это любые данные, поступающие в форме, в которой предыдущие точки данных влияют на более поздние точки данных. RNN можно применять к данным изображений, данным временных рядов и, что чаще всего, к языковым данным. В этом посте мы рассмотрим три наиболее известных типа рекуррентных нейронных сетей и способы их реализации в Keras на TensorFlow.

Три типа рекуррентных нейронных сетей

Тремя наиболее известными типами рекуррентных нейронных сетей являются простая RNN, нейронная сеть с долговременной кратковременной памятью и нейронная сеть с рекуррентными блоками. Архитектура RNN приписывается статье Дэвида Румельхарта 1986 года. Спустя более десяти лет в статье Хохрайтера и Шмидхубера в 1997 году были показаны преимущества точности ячеек долговременной памяти. Почти два десятилетия спустя Чо Кьюнг Хён и др. продемонстрировали улучшения для определенных типов данных с помощью Gated Recurrent Unit.

Простые рекуррентные нейронные сети

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

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

Нейронные сети с долговременной кратковременной памятью

Долгосрочная кратковременная память на самом деле относится к типу ячеек в RNN. Архитектура всей сети остается прежней. Конечно, могут быть изменения и в архитектуре, но главное новшество здесь — тип ячейки. Ячейки LSTM вводят в ячейку три дополнительных «ворота».

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

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

Нейронная сеть закрытого рекуррентного блока

Как и LSTM, Gated Recurrent Units также относится к типу ячейки. Разница между ячейкой GRU и ячейкой LSTM заключается в том, что в ячейках GRU отсутствует выходной вентиль. Это снижает сложность обучения ГРУ. Уровень GRU имеет в три раза больше параметров, чем простая RNN, по сравнению с LSTM, имеющими в четыре раза больше параметров.

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

Python-реализации RNN, LSTM и GRU

Мы можем использовать Keras в TensorFlow, чтобы легко создавать модели RNN, LSTM и GRU. Помните, что основное различие между RNN, LSTM и GRU заключается в типе ячейки. В наивном смысле любая нейронная сеть с рекуррентным слоем — это RNN, а любая нейронная сеть с ячейками LSTM или GRU — это такие модели соответственно.

Создавать нейронные сети в Keras просто. Все, что нам нужно сделать, это инициализировать тип модели и добавить слои. В нашем случае мы создаем Sequential моделей. Для трех приведенных ниже примеров мы создадим трехслойные нейронные сети для каждого типа RNN. В приведенных ниже примерах вы заметите, что код почти такой же. Это потому, что единственное, что нам нужно изменить между ними, — это тип ячейки.

Обратите внимание, что мы можем изменить форму первого слоя по своему усмотрению. Причина, по которой мы делаем 28x28, заключается в том, что через мгновение мы будем обучать их на наборе данных MNIST.

Керас РНН

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential()
model.add(layers.SimpleRNN(64, input_shape=(28, 28)))
model.add(layers.BatchNormalization())
model.add(layers.Dense(10))
print(model.summary())

Керас ЛСТМ

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential()
model.add(layers.LSTM(64, input_shape=(28, 28)))
model.add(layers.BatchNormalization())
model.add(layers.Dense(10))
print(model.summary())

Керас ГРУ

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential()
model.add(layers.GRU(64, input_shape=(28, 28)))
model.add(layers.BatchNormalization())
model.add(layers.Dense(10))
print(model.summary())

Сравнение RNN, LSTM и GRU в наборе цифр MNIST

Мы можем обучить вышеупомянутые нейронные сети на наборе данных MNIST, добавив следующий блок кода:

mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train/255.0, x_test/255.0
x_validate, y_validate = x_test[:-10], y_test[:-10]
x_test, y_test = x_test[-10:], y_test[-10:]
model.compile(loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), optimizer="sgd", metrics=["accuracy"],)
model.fit(x_train, y_train, validation_data=(x_validate, y_validate), batch_size=64, epochs=10)

Результаты обучения этих нейронных сетей на наборе данных MNIST следующие.

RNN в 10 эпох.

LSTM за 10 эпох.

ГРУ за 10 эпох.

Сводка по RNN, LSTM и GRU

В этой статье мы узнали о RNN, LSTM и GRU. Мы рассмотрели краткую историю каждого из них, начиная с RNN в 1980-х, LSTM в 1990-х и GRU в 2010-х. Затем мы рассмотрели, как реализовать каждый из них на Python с помощью Keras и библиотеки TensorFlow. Наконец, мы рассмотрели сравнение их производительности с набором данных MNIST. Для более глубокого анализа см. Сравнение RNN, LSTM и GRU.

Если вам понравилась эта статья, поделитесь ею в Твиттере! Чтобы получить неограниченный доступ к статьям Medium, зарегистрируйтесь, чтобы стать Medium Member сегодня! Не забудьте подписаться на меня, Юйцзянь Тан, чтобы получать больше статей о технологиях, обработке естественного языка и росте!

Дальнейшее чтение