Это серия из трех частей, в которых я расскажу

  1. Введение в RNN и LSTM. (Эта почта)
  2. Создание персонажа по модели языка персонажей с использованием тензорного потока.
  3. Построение пословной языковой модели с помощью Keras.

Прежде всего, давайте мотивируемся изучать рекуррентные нейронные сети (RNN), зная, что они могут делать и насколько надежными, а иногда и удивительно эффективными они могут быть. Этот замечательный блог Андрея Карпати поможет вам начать работу.

Языковое моделирование

Наша цель - создать нейронную сеть, которая может изучать структуру и синтаксис языка. Мы предоставим огромный набор диалогов из сценариев двух моих любимых шоу F.R.I.E.N.D.S и South Park в качестве обучающих данных и надеемся, что наша модель научится говорить, как персонажи.

РНС

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

Очень известный пример: «Я хорошо провел время во Франции. Я также научился говорить на _________ ». Если мы хотим предсказать, какое слово будет пропущено, мы должны пройти до слова Франция и затем сделать вывод, что наиболее вероятным словом будет французское. Другими словами, мы должны иметь некоторую память о наших предыдущих выходах и рассчитывать новые выходы на основе наших прошлых выходов.

Еще одно преимущество использования RNN для языкового моделирования состоит в том, что из-за ограничений памяти они могут запоминать только несколько шагов назад. Это идеальный вариант, потому что контекст слова можно уловить в 8–10 словах перед ним. Нам не нужно запоминать 50 слов контекста. Хотя RNN могут использоваться для произвольно длинных последовательностей, если в вашем распоряжении имеется память.

Общая структура RNN выглядит так ..

При разработке RNN нам нужно заботиться только о верхней структуре. Структура внизу - это развернутая версия RNN во времени. Это означает, что если мы хотим запомнить 8 слов в прошлом, это станет 8-слойной нейронной сетью. xₜ вводится в сеть на временном шаге t. x₁ - это вход с индексом 1 в последовательности. sₜ скрытое состояние сети в момент t. Это память сети. Это соответствует весам в нормальной нейронной сети, которые изучаются во время обучения. Он рассчитывается с использованием U, текущего входа и W, выхода предыдущего временного шага. sₜ = f (Uxₜ + Wxₜ₋₁). Где f - функция нелинейности, обычно Tanh или ReLU. Тот факт, что U, V, и W одинаковы для каждого временного шага, означает, что сеть использует одни и те же параметры для каждого уровня. Следовательно, он выполняет одни и те же операции, но с разными значениями U, V и W на каждом временном шаге.

RNN Минусы

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

Долговременная память (LSTM)

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

В базовой сети RNN каждый уровень состоит из простой функции f (Uxₜ + Wxₜ₋₁), где f - функция активации, такая как Tanh или ReLU. При обучении сети она распространяется по всем слоям и, как следствие, сталкивается с проблемой исчезающего градиента.

Ячейка LSTM состоит из нескольких дополнительных уровней к базовой ячейке RNN. Эти дополнительные слои образуют то, что называется воротами памяти и забвения.

В ячейке LSTM проблема исчезающего градиента решается путем записи текущего состояния в память сети. Этот процесс письма регулируется воротами памяти и забвения. Если вы хотите что-то запомнить, вы это записываете. Точно так же интуиция у LSTM. Однако записывать каждый шаг утомительно и, безусловно, может выйти из-под контроля, если не будет регулироваться. Это приведет к увеличению ограничений памяти, если процесс «записи» не будет регулироваться и все будет записано.

Чтобы решить эту проблему, LSTM разработаны так, чтобы быть избирательными по трем параметрам.

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

Все эти действия выполняются вратами памяти и забвения.

Ознакомьтесь с более подробным объяснением структуры LSTM от R2RT.

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

Использованная литература:

  1. Блог Кола - Понимание сетей LSTM
  2. Блог Андрея Карпати - Неоправданная эффективность рекуррентных нейронных сетей
  3. R2RT - Письменные воспоминания: понимание, получение и расширение LSTM
  4. WildML - Учебное пособие по рекуррентным нейронным сетям