Легко понять - сетевая структура рекуррентной нейронной сети (RNN)! (реализация TensorFlow)

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

1. Что такое РНН

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

1.1 Применение РНН

  • Генерация текста (генерация последовательности)
  • машинный перевод
  • смотреть картинки и говорить
  • Текстовый (настроенный) анализ
  • Интеллектуальное обслуживание клиентов
  • чат-бот
  • Распознавание речи
  • поисковый движок
  • Персональные рекомендации

1.2 Зачем нам RNN, когда у нас есть CNN?

  • В традиционных нейронных сетях (включая CNN) вход и выход не зависят друг от друга. Кошки и собаки на изображении разделены, но для некоторых задач последующий вывод связан с предыдущим содержимым. Например: я китаец, и мой родной язык ____. Это вопрос для заполнения пустых мест, который зависит от предыдущего ввода.
  • Поэтому RNN вводит понятие «памяти», то есть вывод должен зависеть от предыдущей входной последовательности и запоминать ключевой ввод. Слово «петля 2» происходит от того факта, что каждый элемент выполняет одну и ту же задачу.
  • Вместо того, чтобы жестко запоминать все последовательности фиксированной длины, он сохраняет информацию о предыдущих временных шагах через скрытые состояния.

1.3 Сетевая структура RNN

Сначала картинку выше, а потом поясню:

Теперь рассмотрим случай, когда входные данные коррелированы во времени. ПредположениеX_t\in_{}\mathbb{R}^{n*d}- вход мини-пакета на временном шаге t в последовательности,H_t\in_{}\mathbb{R}^{n*h}является скрытой переменной на данном временном шаге. Тогда формула текущей скрытой переменной согласно приведенной выше структурной схеме выглядит следующим образом:

H_t=\phi(X_tW_{xh}+H_{t-1}W_{hh}+b_h)

Из приведенной выше формулы видно, что здесь мы сохраняем скрытые переменные предыдущего временного шага.H_{t-1}, и вводит новый параметр веса, который описывает, как использовать скрытые переменные предыдущего временного шага на текущем временном шаге. Конкретно,Расчет скрытых переменных на временном шаге t определяется вводом текущего временного шага и скрытых переменных предыдущего временного шага. \phi Функция на самом деле является функцией активации.

Мы добавили сюдаH_{t-1}W_{hh}пункт. По скрытым переменным соседних временных шагов в приведенной выше формулеH_t 和H_{t-1}Связь между ними показывает, что скрытые переменные здесь могут собирать историческую информацию о последовательности до текущего временного шага, точно так же, как состояние или память текущего временного шага нейронной сети. Поэтому эту скрытую переменную также называют скрытым состоянием.Поскольку определение скрытого состояния на текущем временном шаге использует скрытое состояние на предыдущем временном шаге, расчет приведенной выше формулы является циклическим. Сеть, использующая рекуррентные вычисления, является рекуррентной нейронной сетью.

На временном шаге t выходные данные выходного слоя аналогичны вычислениям в многослойном персептроне:

O_t=H_tW_{hq}+b_q

1.4 Двунаправленный RNN

Модели рекуррентных нейронных сетей, введенные ранее, предполагают, что текущий временной шаг определяется последовательностью более ранних временных шагов, поэтому Оба они передают информацию спереди назад через скрытые состояния. Иногда текущий временной шаг может также определяться более поздними временными шагами. Например, Когда мы пишем предложение, мы можем изменить слова в начале предложения на основе слов в конце предложения. **Двунаправленные рекуррентные нейронные сети более гибко обрабатывают этот тип информации, добавляя скрытые слои, которые передают информацию сзади вперед. **На рисунке ниже показана архитектура двунаправленной рекуррентной нейронной сети с одним скрытым слоем.

В архитектуре двунаправленной рекуррентной нейронной сети пусть прямое скрытое состояние этого временного шага будет\overrightarrow{H}_t\in_{}\mathbb{R}^{n*h}(количество скрытых вперед единиц равно h), а обратное скрытое состояние равно\overleftarrow{H}_t\in_{}\mathbb{R}^{n*h}(Количество скрытых обратных единиц равно h). мы можем разделить Вычислите прямое скрытое состояние и обратное скрытое состояние:

\overrightarrow{H}_t=\phi(X_tW_{xh}^{(f)}+\overrightarrow{H}_{t-1}W_{hh}^{(f)}+b_h^{(f)})
\overleftarrow{H}_t=\phi(X_tW_{xh}^{(b)}+\overleftarrow{H}_{t-1}W_{hh}^{(b)}+b_h^{(b)})

Затем мы объединяем скрытые состояния в обоих направлениях.\overrightarrow{H}_t和\overleftarrow{H}_tчтобы получить скрытое состояниеH_t\in_{}\mathbb{R}^{n*2h}и введите его в выходной слой. Выходной слой вычисляет выводO_t\in_{}\mathbb{R}^{n*q}(количество выходов равно q):

O_t=H_tW_{hq}+b_q

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

1.5 Алгоритм BPTT

image

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

Сначала мы определяем элементФункция потерь:

L^{(t)}(y^{'(t)},y^{(t)})=-y^{(t)}logy^{'(t)}-(1-y^{'(t)})log(1-y^{'(t)})

Функция потерь для всей последовательности:

L(y^{'},y)=\sum_{t=1}^{T_x}L^{(t)}(y^{'(t)},y^{(t)})$

На этом вычислительном графеy^{'(1)}Соответствующая функция потерь может быть рассчитана, поэтому вычисляется функция потерь первого временного шага, затем вычисляется функция потерь второго временного шага, затем третьего временного шага, до последнего временного шага и, наконец, для вычисления Общая функция потерь, нам нужно сложить их все вместе и рассчитать окончательный ? с помощью уравнения, которое состоит в суммировании функции потерь для каждого отдельного временного шага. Затем вы можете использовать градиентный спуск для обновления параметров, взяв параметры, зависящие от производной.

В процессе обратного распространения самой важной передачей информации или самой важной рекурсивной операцией является эта операция справа налево, поэтому этот алгоритм имеет очень уникальное имя, называемое «**» сквозным (сквозным (сквозным)) обратным распространением сквозь время". **Причина этого названия в том, что для прямого распространения вам нужно рассчитывать слева направо, и в процессе время ? продолжает увеличиваться. А для обратного распространения вам нужно выполнять вычисления справа налево, как если бы вы двигались назад во времени. «Обратное распространение во времени», как путешествие во времени, звучит так, будто вам нужна машина времени для реализации этого алгоритма.

2. Другие типы RNN

  • **Один к одному:** Это может быть не так важно, это небольшая стандартная нейронная сеть, вводите ? и получайте вывод ?.

  • **Один ко многим:** Для создания музыки ваша цель — использовать нейронную сеть для вывода нескольких нот. В соответствии с музыкальным произведением введите ?

    Может быть целым числом, представляющим тип музыки, которую вы хотите, или первую ноту музыки, которую вы хотите, и, если вы не хотите ничего вводить, ? может быть пустым вводом, установленным на вектор 0.

  • **Многие к одному:** Проблема классификации предложений, входной документ, тип выходного документа.

  • **Многие ко многим(): ** Распознавание именованных объектов.

  • **Многие ко многим():** Машинный перевод.

image

3. Разница между CNN и RNN

категория Описание функции
Та же точка 1. Расширение традиционной нейронной сети.
2. Прямой расчет дает результаты, а обратный расчет модели обновляется.
3. Каждый слой нейронной сети может сосуществовать с несколькими нейронами по горизонтали и может иметь несколько слоев соединений нейронной сети по вертикали.
разница 1. Пространственное расширение CNN, свертка нейронов и признаков, временное расширение RNN, вычисление нейронов и множественных выходных данных.
2. RNN может использоваться для описания вывода непрерывного состояния во времени с функцией памяти, CNN используется для статического вывода.

4. Почему Loss сильно колеблется во время обучения RNN

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

5. Пример кода

TensorFlow реализует RNN

Машинное обучение легко понять серия статей

3.png


автор:@mantchs

Гитхаб:GitHub.com/NLP-love/ml…

Приглашаются все желающие присоединиться к обсуждению! Улучшайте этот проект вместе! Номер группы: [541954936]NLP面试学习群