Введение

Рекуррентные нейронные сети (RNN) были очень популярными моделями до появления моделей на основе Transformer. Они показали отличные результаты во многих задачах НЛП.

Чтобы понять RNN, мы сначала посмотрим, какие проблемы они решают, как они работают в теории и как обучается модель. Мы также создадим ванильную модель в Pytorch.

Какую проблему решает RNN?

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

RNN хороши для распознавания закономерностей в последовательностях данных:

  • Временные ряды
  • Текстовые данные
  • Геномы
  • Произнесенное слово

Теория

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

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

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

Здесь xi — входные тексты, и, поскольку мы не можем передавать в сеть обычный текст, нам нужно использовать вложения для кодирования слов в векторы. (Другие подходы, такие как горячий вектор, также могут работать, но встраивание — лучший выбор.)

Цикл обучения:

  • Пример входного текста из набора данных
  • Преобразуйте входной текст во вложения.
  • Подайте входные данные в сеть, которая будет выполнять сложные вычисления с использованием случайно инициализированных переменных.
  • Генерирует прогноз в качестве вывода
  • Проверьте, насколько отличается прогноз от исходного значения
  • Подсчитайте потери.
  • Сделайте обратное распространение и настройте переменные.
  • Повторите вышеуказанные шаги.
  • Выполнение прогнозов для невидимого/тестового набора данных.

Математические уравнения:

Уравнение 1: информация из предыдущей отметки времени в последовательности распространяется на текущее слово. Ht вычисляется из вектора h(t-1) и текущего вектора. Также применяется функция активации. Вы также можете думать о Ht как о векторе памяти. Он хранит всю информацию, которая может быть полезной, например. частота положительных/отрицательных слов и т. д.

Уравнение 2: вычисляет распределение вероятностей и дает нам индекс наиболее вероятного следующего слова. Функция softmax создает векторную сумму, равную 1.

Уравнение 3. Это кросс-энтропийная потеря, которая вычисляет потерю в конкретный момент времени t. Он рассчитывается на основе разницы между предсказанным и фактическим словом.

Код в Pytorch

Недостатки

Было много проблем с ванильными RNN, как мы можем видеть из

  • Память перезаписывается на каждом шагу
  • Градиенты имеют тенденцию исчезать или взрываться

Поскольку RNN склонны к исчезновению или взрыву градиентов, мы будем реализовывать отсечение градиента, чтобы предотвратить «взрыв» градиента, что означает, что если вычисленный градиент больше определенного порога, мы уменьшим его до порога.

  • Трудно зафиксировать долгосрочные зависимости
  • Трудно обучать

Различные варианты RNN

Один к одному: нейронная сеть с прямой связью

Один ко многим: например. Подпись к изображению -> последовательность слов

Многие к одному: например. Классификация настроений (последовательность слов -> настроение)

Многие ко многим: например. Машинный перевод (последовательность слов -> последовательность слов) или .g. Классификация видео на уровне кадра

Пример: машинный перевод

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

Заключение

Надеюсь, вы понимаете основную концепцию RNN, какую проблему она решает и как работает. Реализация Pytorch дает обзор с точки зрения кодирования. Хотя ванильные RNN мало используются в промышленности, и есть лучшие варианты, т.е. LSTM и GRU, о которых мы расскажем в следующих постах.

Ссылки: