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

Прежде чем мы поговорим о том, что именно такое RNN, позвольте мне сначала сказать: Почему RNN ??? (Я большой поклонник Simon sinek, поэтому начну с того, почему.)

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

Фактически, это и есть большая часть машинного обучения (контролируемого).

но что, если порядок данных имеет значение ????? только представьте, что если порядок всех независимых переменных имеет значение ???

Позвольте мне объяснить визуально (я называю это теорией рекурсии).

Просто предположите, что каждый муравей является независимой переменной, если один муравей идет в другом направлении, для других это не имеет значения, верно?

Но что, если порядок муравьев имеет значение?

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

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

Итак, какой порядок данных имеет значение в нашем пространстве машинного обучения ????

  1. Данные естественного языка, в которых порядок слов имеет значение
  2. Речевые данные
  3. Данные временного ряда
  4. Данные видео / музыкальных последовательностей
  5. Данные фондовых рынков

так далее….

Итак, как RNN решает данные «весь порядок имеет значение» ??????

Примечание. Я беру естественные текстовые данные в качестве примера для объяснения RNN.

Допустим, я провожу анализ мнений пользователей по отзывам пользователей о фильме.

«Этот фильм хороший» → Положительный «Этот плохой фильм» → отрицательный

Мы можем классифицировать их, используя простую модель «Мешок слов», и мы можем предсказать (положительный или отрицательный), но подождите ...

что, если отзыв будет «Этот фильм нехороший»

Модель BOW может сказать, что это положительный знак, но на самом деле это не так.

RNN понимает это и прогнозирует, что это отрицательно.

Как??????

Во-первых, давайте признаем, что здесь порядок текста имеет значение. Круто? Ладно

RNN имеет следующие модели

  1. Один ко многим

RNN принимает один вход, например изображение, и генерирует последовательность слов.

2. от многих к одному

RNN принимает последовательность слов в качестве входных данных и генерирует один выход.

3. от многих ко многим

RNN принимает последовательность слов на входе и генерирует последовательность слов на выходе. (допустим языковые переводы).

В настоящее время мы ориентируемся на вторую модель «Многие к одному».

во Вводе RNN рассматривается как временные шаги.

пример: input (X) = [«это», «фильм», «есть», «не», «хорошо»]

Отметка времени для «это» - x (0), «фильм» - это x (1), «is» - это x (2), «not» - это x (3) и «good» - x (4).

Сначала давайте разберемся, что содержит ячейка RNN!

Я надеюсь и предполагаю, что вы знакомы с Feed Forward NN или можете прочитать мою предыдущую историю здесь NN. Резюме FFNN составляет

В нейронной сети прямого распространения у нас есть X (вход), H (скрытый) и y (выход).

у вас может быть столько скрытых слоев, сколько вы хотите, но веса (W) для каждого скрытого слоя различаются.

Выше Wh1 и Wh2 разные.

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

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

В отличие от FFNN, здесь мы вычисляем значения скрытого слоя не только из входных значений, но и из значений предыдущего временного шага, а веса (W) на скрытых слоях одинаковы для временных шагов.

Вот полная картина для RNN, и это Math.

На рисунке мы вычисляем значения временного шага (t) скрытого слоя, поэтому

Ht = Активировать функцию (ввод * Hweights + W * Ht-1)

yt = softmax (Hweight * Ht)

Ht-1 - это предыдущий временной шаг, и, как я уже сказал, W одинаковы для всех временных шагов.

Функция активации может быть Tanh, Relu, Sigmoid и т. Д.

Выше мы рассчитали только для Ht, аналогично мы можем рассчитать и для всех других временных шагов.

Шаги:

  1. Рассчитайте Ht-1 из U и X
  2. Вычислить yt-1 из Ht-1 и V
  3. Рассчитайте Ht из U, X, W и Ht-1.
  4. Вычислить yt из V и Ht и так далее…

Примечание :

1. U и V - весовые векторы, разные для каждого временного шага.

2. Мы даже можем сначала вычислить скрытый слой (все временные шаги), а затем вычислить значения y.

3. Весовые векторы изначально случайны.

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

мы используем перекрестную энтропию как функцию стоимости (предположим, вы знаете, поэтому не вдаваться в подробности)

BPTT (обратное распространение во времени)

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

Нам нужно рассчитать следующие сроки

  1. насколько изменится общая ошибка по отношению к выходным данным (скрытые и выходные блоки)? (или насколько изменится вывод)
  2. насколько сильно изменится вывод по отношению к весам (U, V, W)? (или насколько изменились веса)

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

Помните, что BP для RNN такой же, как BP для нейронных сетей.

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

если мы применим цепное правило, которое выглядит так

W одинаковы для всех временных шагов, поэтому цепное правило расширяется все больше и больше.

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

Итак, Et то же самое, что и наш J (θ)

U, V и W должны обновляться с использованием любых алгоритмов оптимизации, таких как градиентный спуск (взгляните на мою историю здесь GD).

Теперь, если мы вернемся и поговорим о нашей проблеме настроений, вот RNN для этого.

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

Он запоминает что-то вроде «не» + положительное слово = отрицательное.

Я надеюсь, вы это поняли.

Проблемы с RNN → Задача исчезающего / взрывающегося градиента

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

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

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

Предложения / вопросы приветствуются.

Фотографии созданы с использованием Paint в Windows.

Увидимся!