для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Стэнфордский курс: лекция 10. Рекуррентные нейронные сети

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

Рекуррентные сети: введение

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

Именно это позволяют делать рекуррентные нейронные сети (Recurrent Neural Network, RNN). Иногда их делят на несколько разновидностей: “one to one”, “one to many”, “many to one” и “many to many”.

К архитектурам “one to one” можно отнести модели, которые мы рассматривали ранее, — с определённым размером входных и выходных данных. В случае “one to many” при заранее заданном типе и размере входного объекта можно получить вывод разной длины. Такой подход применяется в популярной задаче описания изображений (image captioning). Вариант “many to one” работает ровно наоборот — мы подаём на вход данные нефиксированного размера и получаем их чётко определённые характеристики. Так, например, можно по фрагменту видео определять вид активностей или действия, которые в нём происходят.

И, наконец, “many to many” архитектуры имеют варьирующиеся размеры как входных, так и выходных данных. К решаемым ими задачам относятся машинный перевод (исходная и переведённая фразы могут быть разной длины) и покадровая классификация видео.

Рекуррентные нейросети очень полезны даже при решении задач “one to one”. Рассмотрим популярную проблему распознавания рукописных цифр. Вместо того, чтобы просто сделать один прямой проход и сразу выдать решение, рекуррентная сеть быстро «просматривает» различные части изображения. В терминологии этот процесс называется «проблеск» (glimpse). Сделав несколько таких проблесков, модель принимает окончательное решение о том, какое число изображено на фотографии. Это позволяет существенно повысить точность распознавания и лучше контролировать процесс обучения.

Итак, как же устроена рекуррентная нейросеть? Внутри архитектуры располагается базовая рекуррентная ячейка. Модель принимает некоторые входные данные x и отправляет их в RNN, которая имеет скрытое внутреннее состояние. Это состояние обновляется каждый раз, когда в RNN поступают новые данные. Часто нам необходимо, чтобы RNN генерировала некоторый вывод на каждом временном отрезке. Поэтому после чтения входных данных и обновления скрытого состояния RNN будет создавать выходные данные.

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

Чтобы генерировать вывод в каждый момент времени, в модель добавляются полносвязные слои, которые постоянно обрабатывают состояния ht и выдают основанные на них прогнозы. При этом функция f и веса w остаются неизменными.

Самая простая реализация рекуррентной сети будет выглядеть следующим образом:

Тангенс здесь используется для введения нелинейности в систему.

Концепция скрытого состояния, которое периодически возвращается к самому себе, может показаться немного запутанной. Более понятным будет представить рекуррентный процесс в виде развёртывания вычислительного графа за несколько временных шагов.

Возвращение к вычислительным графам

Если вы не знакомы с вычислительными графами, о них можно прочитать в этой лекции.

На первом временном шаге у нас есть первоначальное скрытое состояние h0. Обычно оно инициализируется нулём. Также на вход подаются данные xt и веса W — всё это отправляется в функцию f, которая вычисляет новое состояние h1. И с каждыми новыми входными данными мы повторяем процесс.

Очередное новое состояние даёт нам выходные данные yi, с помощью которых мы можем посчитать потери Li. Просуммировав все Li, мы получим полные потери нашей модели. Такой подход используется в “many to many” архитектурах и наглядно показан на рисунке ниже:

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

В случае, если мы хотим подавать на вход данные фиксированного размера и получать разнообразный вывод (“one to many”), из нашего графа исчезнут разные варианты xi. Модель будет выглядеть следующим образом:

С “many to one” ситуация будет обратная:

Также есть более сложные модели “many to many”, применяющиеся в машинном переводе, — они называются “sequence to sequence”. По сути это комбинация методов “many to one” и “one to many”, которые располагаются друг за другом и называются энкодер и декодер соответственно. Энкодер получает данные различной длины — например, предложение на английском языке. С помощью скрытых состояний он формирует из исходных данных вектор, который затем передаётся в декодер. Последний, в свою очередь, генерирует из полученного вектора выходные данные — исходную фразу, переведённую на другой язык.

Подробнее о том, как выглядят нейросети для машинного перевода и, в частности, Google-переводчик, можно прочитать в статье Google преодолевает барьер между человеческим и машинным переводом. А мы вернёмся к распознаванию изображений и поговорим об image captioning.

Image captioning

Суть этой задачи заключается в том, чтобы нейросеть составила текстовое описание фотографии. Для этого необходимо сначала классифицировать объекты на изображении, а затем передать результат (одну или несколько меток) в языковую рекуррентную модель, которая сможет составить из них осмысленную фразу. При этом мы действуем точно так же, как в случае с обычной языковой моделью: преобразуем метку изображения в вектор, который обрабатывается декодером.

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

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

Обычно подобные архитектуры создаются с помощью контролируемого обучения (supervized learning) — это означает, что в обучающих датасетах уже присутствуют как изображения, так и описания для них. Наиболее популярным и самым большим набором данных является Microsoft COCO. Помимо image captioning он также применяется для сегментации, поиска ключевых точек и даже построения трёхмерной модели человека на основе его позы.

Image captioning + Attention

Модели, основанные на внимании (attention) немного более продвинутые, чем обычные нейросети. Они могут концентрироваться на отдельных частях изображения, что позволяет избежать зашумления данных.

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

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

Существуют также понятия мягкого и жёсткого внимания (soft and hard attention). При мягком внимании мы берём взвешенную комбинацию признаков по всему изображению, тогда как в случае жёсткого внимания мы заставляем модель выбирать только один небольшой участок для обработки на каждом временном шаге. При этом жёсткое внимание, строго говоря, не является дифференцируемой функцией. Поэтому для обучения такой модели необходимо использовать более изощрённые приёмы, чем обычное обратное распространение ошибки. Мы подробнее затронем эту тему в одной из следующих лекций.

Также нейросети, основанные на внимании, повсеместно используются для ответов на визуальные вопросы (Visual Question Answering). Цель этой задачи — обучить модель отвечать на вопрос по изображению. Например, она должна уметь не только называть сами объекты на фотографии, но и считать их, распознавать цвета и оценивать расположение относительно друг друга. Мы уже рассказывали о подобных архитектурах в статье о том, как такие нейросети могут помочь незрячим людям и о нейро-символическом мышлении.

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

С оригинальной лекцией можно ознакомиться на YouTube.

Источник

Рекуррентные нейронные сети (RNN) с Keras

Перевод руководства по рекуррентным нейросетям с сайта Tensorflow.org. В материале рассматриваются как встроенные возможности Keras/Tensorflow 2.0 по быстрому построению сеток, так и возможности кастомизации слоев и ячеек. Также рассматриваются случаи и ограничения использования ядра CuDNN позволяющего ускорить процесс обучения нейросети.

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

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

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

Keras RNN API разработан с фокусом на:

Простота кастомизации: Вы можете также задать собственный слой ячеек RNN (внутреннюю часть цикла for ) с кастомным поведением и использовать его с общим слоем `tf.keras.layers.RNN` (сам цикл `for`). Это позволит вам быстро прототипировать различные исследовательские идеи в гибкой манере, с минимумом кода.

Установка

Построение простой модели

В Keras есть три встроенных слоя RNN:

Выходы и состояния

Кроме того, слой RNN может вернуть свое конечное внутреннее состояние (состояния).

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

Для того чтобы слой RNN возвращал свое внутреннее состояние, установите параметр return_state в значение True при создании слоя. Обратите внимание, что у LSTM 2 тензора состояния, а у GRU только один.

Заметьте что размерность должна совпадать с размерностью элемента слоя, как в следующем примере.

RNN слои и RNN ячейки

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

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

Кросс-пакетное сохранение состояния

При обработке длинных последовательностей (возможно бесконечных), вы можете захотеть использовать паттерн кросс-пакетное сохранение состояния (cross-batch statefulness).

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

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

Вы можете сделать это установив в конструкторе `stateful=True`.

Если у вас есть последовательность `s = [t0, t1,… t1546, t1547]`, вы можете разбить ее например на:

Потом вы можете обработать ее с помощью:

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

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

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

Под капотом, Bidirectional скопирует переданный слой RNN layer, и перевернет поле go_backwards вновь скопированного слоя, и таким образом входные данные будут обработаны в обратном порядке.

На выходе` Bidirectional RNN по умолчанию будет сумма вывода прямого слоя и вывода обратного слоя. Если вам нужно другое поведение слияния, напр. конкатенация, поменяйте параметр `merge_mode` в конструкторе обертки `Bidirectional`.

Оптимизация производительности и ядра CuDNN в TensorFlow 2.0

В TensorFlow 2.0, встроенные слои LSTM и GRU пригодны для использования ядер CuDNN по умолчанию, если доступен графический процессор. С этим изменением предыдущие слои keras.layers.CuDNNLSTM/CuDNNGRU устарели, и вы можете построить свою модель, не беспокоясь об оборудовании, на котором она будет работать.

Поскольку ядро CuDNN построено с некоторыми допущениями, это значит, что слой не сможет использовать слой CuDNN kernel если вы измените параметры по умолчанию встроенных слоев LSTM или GRU. Напр:

Когда это возможно используйте ядра CuDNN

Загрузка датасета MNIST

Создайте экземпляр модели и скомпилируйте его

Постройте новую модель без ядра CuDNN

Как вы можете видеть, модель построенная с CuDNN намного быстрее для обучения чем модель использующая обычное ядро TensorFlow.

Ту же модель с поддержкой CuDNN можно использовать при выводе в однопроцессорной среде. Аннотация tf.device просто указывает используемое устройство. Модель выполнится по умолчанию на CPU если не будет доступно GPU.

Вам просто не нужно беспокоиться о железе на котором вы работаете. Разве это не круто?

RNN с входными данными вида список/словарь, или вложенными входными данными

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

В другом примере, у рукописных данных могут быть обе координаты x и y для текущей позиции ручки, так же как и информация о давлении. Так что данные могут быть представлены так:

В следующем коде построен пример кастомной ячейки RNN которая работает с такими структурированными входными данными.

Определите пользовательскую ячейку поддерживающую вложенный вход/выход

Постройте модель RNN с вложенными входом/выходом

Давайте построим модель Keras которая использует слой tf.keras.layers.RNN и кастомную ячейку которую мы только определили.

Обучите модель на случайно сгенерированных данных

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

Источник

Введение в RNN Рекуррентные Нейронные Сети для начинающих

Введение в RNN Рекуррентные Нейронные Сети для начинающих

Рекуррентные нейронные сети (RNN) — это тип нейронных сетей, которые специализируются на обработке последовательностей. Зачастую их используют в таких задачах, как обработка естественного языка (Natural Language Processing) из-за их эффективности в анализе текста. В данной статье мы наглядно рассмотрим рекуррентные нейронные сети, поймем принцип их работы, а также создадим одну сеть в Python, используя numpy.

Зачем нужны рекуррентные нейронные сети

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

Способность обрабатывать последовательности делает рекуррентные нейронные сети RNN весьма полезными. Области использования:

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

Создание рекуррентной нейронной сети на примере

Представим, что у нас есть нейронная сеть, которая работает по принципу «многое ко многим«. Входные данные — x 0, х 1, … x n, а результаты вывода — y 0, y 1, … y n. Данные x i и y i являются векторами и могут быть произвольных размеров.

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

Для рекуррентной нейронной сети мы также используем два смещения:

Вес будет представлен как матрица, а смещение как вектор. В данном случае рекуррентная нейронная сеть состоит их трех параметров веса и двух смещений.

Следующие уравнения являются компактным представлением всего вышесказанного:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сетиРазбор уравнений лучше не пропускать. Остановитесь на минутку и изучите их внимательно. Помните, что вес — это матрица, а другие переменные являются векторами.

Говоря о весе, мы используем матричное умножение, после чего векторы вносятся в конечный результат. Затем применяется гиперболическая функция в качестве функции активации первого уравнения. Стоит иметь в виду, что другие методы активации, например, сигмоиду, также можно использовать.

Поставление задачи для рекуррентной нейронной сети

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

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

ТекстПозитивный?
Я хорошийДа
Я плохойНет
Это очень хорошоДа
Это неплохоДа
Я плохой, а не хорошийНет
Я несчастенНет
Это было хорошоДа
Я чувствую себя неплохо, мне не грустноДа

Составление плана для нейронной сети

В следующем примере будет использована классификация рекуррентной сети «многие к одному». Принцип ее использования напоминает работу схемы «многие ко многим», что была описана ранее. Однако на этот раз будет задействовано только скрытое состояние для одного пункта вывода y :

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сетиРекуррентная нейронная сеть RNN многие к одному

Каждый x i будет вектором, представляющим определенное слово из текста. Вывод y будет вектором, содержащим два числа. Одно представляет позитивное настроение, а второе — негативное. Мы используем функцию Softmax, чтобы превратить эти значения в вероятности, и в конечном счете выберем между позитивным и негативным.

Приступим к созданию нашей рекуррентной нейронной сети.

Предварительная обработка рекуррентной нейронной сети RNN

Упомянутый ранее набор данных состоит из двух словарей Python:

True = Позитивное, False = Негативное

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

vocab теперь содержит список всех слов, которые употребляются как минимум в одном учебном тексте. Далее присвоим каждому слову из vocab индекс типа integer (целое число).

Теперь можно отобразить любое заданное слово при помощи индекса целого числа. Это очень важный пункт, так как:

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

Так как в словаре 18 уникальных слов, каждый x i будет 18-мерным унитарным вектором.

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

Так как в словаре 18 уникальных слов, каждый x i будет 18-мерным унитарным вектором.

Мы используем createInputs() позже для создания входных данных в виде векторов и последующей их передачи в рекуррентную нейронную сеть RNN.

Фаза прямого распространения нейронной сети

Пришло время для создания рекуррентной нейронной сети. Начнем инициализацию с тремя параметрами веса и двумя смещениями.

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

Для инициализации веса из стандартного нормального распределения мы используем np.random.randn().

Затем мы реализуем прямую передачу рассматриваемой нейронной сети. Помните первые два уравнения, рассматриваемые ранее?

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Эти же уравнения, реализованные в коде:

Давайте попробуем следующее:

Наша рекуррентная нейронная сеть работает, однако ее с трудом можно назвать полезной. Давайте исправим этот недочет.

Фаза обратного распространения нейронной сети

Для тренировки рекуррентной нейронной сети будет использована функция потери. Здесь будет использована потеря перекрестной энтропии, которая в большинстве случаев совместима с функцией Softmax. Формула для подсчета:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Здесь p c является предсказуемой вероятностью рекуррентной нейронной сети для класса correct (позитивный или негативный). Например, если позитивный текст предсказывается рекуррентной нейронной сетью как позитивный текст на 90%, то потеря составит:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

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

Оригиналы всех кодов, которые использованы в данной инструкции, доступны на GitHub.

Параметры рассматриваемой нейронной сети

Параметры данных, которые будут использованы в дальнейшем:

Установка

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

Градиенты

Настало время математики! Начнем с вычисления для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Что нам известно:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

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

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Отлично. Теперь разберемся с градиентами для W hy и b y, которые используются только для перехода конечного скрытого состояния в результат вывода рассматриваемой нейронной сети RNN. Используем следующие данные:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Здесь h n является конечным скрытым состоянием. Таким образом:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Аналогичным способом вычисляем:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Наконец, нам понадобятся градиенты для W hh, W xh, и b h, которые использовались в каждом шаге нейронной сети. У нас есть:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сетиОбратное распространение во времени

W xh используется для всех прямых ссылок x t → h t, поэтому нам нужно провести обратное распространение назад к каждой из этих ссылок.

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Производная гиперболической функции tanh нам уже известна:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Используем дифференцирование сложной функции, или цепное правило:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Аналогичным способом вычисляем:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Последнее нужное значение —для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Его можно подсчитать рекурсивно:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Реализуем обратное распространение во времени, или BPTT, отталкиваясь от скрытого состояния в качестве начальной точки. Далее будем работать в обратном порядке. Поэтому на момент подсчета для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сетизначение для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сетибудет известно. Исключением станет только последнее скрытое состояние h n:

для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Смотреть картинку для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Картинка про для обработки данных какого вида обычно применяются рекуррентные нейронные сети. Фото для обработки данных какого вида обычно применяются рекуррентные нейронные сети

Теперь у нас есть все необходимое, чтобы наконец реализовать обратное распространение во времени ВРТТ и закончить backprop() :

Моменты, на которые стоит обратить внимание:

Мы сделали это! Наша рекуррентная нейронная сеть готова.

Тестирование рекуррентной нейронной сети

Наконец настал тот момент, которого мы так долго ждали — протестируем готовую рекуррентную нейронную сеть.

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

Теперь можно написать цикл для тренировки сети:

Результат вывода main.py выглядит следующим образом:

Неплохо для рекуррентной нейронной сети, которую мы построили сами!

Хотите поэкспериментировать с этим кодом сами? Можете запустить данную рекуррентную нейронную сеть RNN у себя в браузере. Она также доступна на GitHub.

Подведем итоги

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *