"Машинное обучение"

Основы рекуррентных нейронных сетей (RNN)

Оглавление

  • Для чего используются RNN?
  • Что такое RNN и как они работают?
  • Тривиальный пример - прямое распространение, обратное распространение во времени
  • Одна серьезная проблема: исчезающие градиенты

Для чего используются RNN?

Рекуррентные нейронные сети (RNN) широко используются для данных с некоторой последовательной структурой. Например, данные временных рядов упорядочены по времени. Предложения также являются последовательными: «Я люблю собак» имеет другое значение, чем «Собаки, которых я люблю». Проще говоря, если семантика ваших данных изменяется случайной перестановкой, у вас есть последовательный набор данных, и для решения вашей проблемы могут использоваться RNN! Вот список распространенных приложений¹, которые помогут определить типы проблем, которые могут решить RNN:

  • Распознавание речи
  • Классификация настроений
  • Машинный перевод (например, с китайского на английский)
  • Распознавание видео активности
  • Распознавание сущности имени - (т.е. идентификация имен в предложении)

Большой! Теперь мы знаем типы проблем, к которым мы можем применять RNN ...

Что такое RNN и как они работают?

RNN отличаются от классических многослойных сетей перцептронов (MLP) по двум основным причинам: 1) они принимают во внимание то, что произошло ранее и 2) они разделяют параметры / веса.

Архитектура RNN

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

Разбивка архитектуры

Зеленые блоки называются скрытыми состояниями. Синие круги, определяемые вектором a внутри каждого блока, называются скрытыми узлами или скрытые блоки, где количество узлов определяется гиперпараметром d. Подобно активациям в MLP, думайте о каждом зеленом блоке как о функции активации, которая действует на каждый синий узел. Мы поговорим о расчетах в скрытых состояниях в разделе прямого распространения этой статьи.

Вектор h - - это результат скрытого состояния после применения функции активации к скрытым узлам. Как вы можете видеть во время t, архитектура учитывает то, что произошло в t-1, включая h из предыдущего скрытое состояние, а также вход x в момент t. Это позволяет сети учитывать информацию из предыдущих входов, которые последовательно следуют за текущим входом. Важно отметить, что нулевой вектор h всегда будет начинаться как вектор из нулей, потому что алгоритм не имеет информации, предшествующей первому элементу в последовательности.

Матрицы Wx, Wy, Wh - это веса архитектуры RNN, которые совместно используются во всей сети. Вес модели Wx при t = 1 точно такой же, как веса модели Wx при t = 2 и через любой другой временной шаг.

Вектор xᵢ - - это вход для каждого скрытого состояния, где i = 1, 2,…, n для каждого элемента во входной последовательности. Напомним, что текст должен быть закодирован в числовые значения. Например, каждая буква в слове «собаки» будет быстро закодированным вектором с размерностью (4x1). Точно так же x может быть встраиванием слов или другими числовыми представлениями.

Уравнения RNN

Теперь, когда мы знаем, каковы все переменные, вот все уравнения, которые нам понадобятся, чтобы выполнить расчет RNN:

Это единственные три уравнения, которые нам нужны, очень мило! Скрытые узлы представляют собой конкатенацию выходных данных предыдущего состояния, взвешенных по весовой матрице Wh, и входных x, взвешенных по весовой матрице Wx. Функция tanh - это упомянутая ранее функция активации, обозначенная зеленым блоком. Выходные данные скрытого состояния - это функция активации, применяемая к скрытым узлам. Чтобы сделать прогноз, мы берем выходные данные из текущего скрытого состояние и взвешивание с помощью весовой матрицы Wy с активацией softmax.

Также важно понимать размеры всех переменных. Обычно для прогнозирования последовательности:

Где

  • k - размер входного вектора xᵢ
  • d - количество скрытых узлов

Теперь мы готовы рассмотреть пример!

Банальный пример

Возьмем слово «собаки», где мы хотим обучить RNN предсказывать букву «s» по буквам «d» - «o» - « г ». Приведенная выше архитектура будет выглядеть следующим образом:

Чтобы упростить этот пример, мы будем использовать 3 скрытых узла в нашей RNN (d = 3). Размеры каждой из наших переменных следующие:

где k = 4, потому что наш вход x - это 4-мерный одномерный вектор для букв в слове «собаки».

Прямое распространение

Давайте посмотрим, как будет работать прямое распространение в момент времени t = 1. Сначала мы должны вычислить скрытые узлы a, затем применить функцию активации, чтобы получить h и, наконец, вычислите прогноз. Легкий!

At t=1

Чтобы конкретизировать пример, я инициализировал случайные веса для матриц Wx, Wy, и Wh, чтобы приведите пример с числами.

При t = 1 наша RNN предсказывает букву «d» при вводе «d». В этом нет смысла, но это нормально, потому что мы использовали необученные случайные веса. Это было просто, чтобы показать рабочий процесс прямого прохода в RNN. При t = 2 и t = 3 рабочий процесс будет аналогичным, за исключением того, что вектор h из t-1 больше не будет вектором нулей, а вектором ненулевые на основе входных данных до времени t. (Напоминаем, что весовые матрицы Wx, Wh и Wy остаются неизменными для t = 1, 2 и 3.)

Важно отметить, что, хотя RNN может выводить прогноз на каждом отдельном временном шаге, в этом нет необходимости. Если бы нас просто интересовала буква после входного «dog», мы могли бы просто взять выход в момент t = 3 и игнорировать остальные.

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

Обратное распространение во времени

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

Чтобы получить конкретное представление о том, как работает обратное распространение ошибки, давайте рассмотрим общий рабочий процесс:

  1. Инициализировать весовые матрицы Wx, Wy, Wh случайным образом
  2. Прямое распространение для вычисления прогнозов
  3. Вычислить потерю
  4. Обратное распространение для вычисления градиентов
  5. Обновить веса на основе градиентов
  6. Повторите шаги 2–5.

Примечание: вывод h из скрытого блока не запоминается, это просто информация, полученная путем конкатенации изученных весов с предыдущим выводом h и текущим вводом x.

Поскольку этот пример представляет собой задачу классификации, в которой мы пытаемся предсказать четыре возможных буквы («d-o-g-s»), имеет смысл использовать функцию перекрестных потерь энтропии для нескольких классов:

С учетом всех временных шагов общая потеря:

Визуально это можно увидеть как:

Учитывая нашу функцию потерь, нам нужно вычислить градиенты для наших трех весовых матриц Wx, Wy, Wh, и обновить их со скоростью обучения η. Подобно обычному обратному распространению, градиент дает нам представление о том, как меняются потери по каждому параметру веса. Мы обновляем веса, чтобы минимизировать потери, используя следующее уравнение:

А теперь самое сложное - вычисление градиента для Wx, Wy и Wh. Начнем с расчета градиента для Wy, потому что это самый простой способ. Как указывалось ранее, влияние весов на потери распространяется с течением времени. Градиент веса для Wy следующий:

Это расчет градиента для Wy. Надеюсь, это довольно прямолинейно, основная идея - это правило цепочки и учет потерь на каждом временном шаге.

Матрицы веса Wx и W h аналогичны друг другу, поэтому мы просто посмотрим на градиент для Wx и оставим Что вам. Одна из самых сложных частей вычисления Wx - это рекурсивная зависимость от предыдущего состояния, как указано в строке (2) на изображении ниже. Нам необходимо учесть производные текущей ошибки по каждому из предыдущих состояний, что и сделано в (3). Наконец, нам снова нужно учитывать потери на каждом временном шаге (4).

И это обратное распространение! Когда у нас есть градиенты для Wx, Wh и Wy, мы обновляем их как обычно и продолжаем рабочий процесс обратного распространения. Теперь, когда вы знаете, как RNN учатся и делают прогнозы, давайте рассмотрим один серьезный недостаток и завершим этот пост.

Примечание. См. «Мягкое руководство по рекуррентной нейронной сети с обратным распространением ошибок» от Ган Чена ² для более подробного рабочего процесса по обратному распространению во времени с помощью RNN

Одна серьезная проблема: исчезающие градиенты

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

и должен был предсказать последние два слова «немецкий» и «пастух», RNN должен был бы принять во внимание входные данные «коричневый», «черный» и «собака», которые являются существительными и прилагательными, описывающими немецкую овчарку. . Однако слово «коричневый» довольно далеко от слова «пастырь». Из расчета градиента Wx, который мы видели ранее, мы можем разбить ошибку обратного распространения слова «пастырь» обратно на «коричневый» и посмотреть, как это выглядит:

Частная производная состояния, соответствующего входному «пастуху», соответствующему состоянию «коричневый», на самом деле является цепным правилом, в результате чего:

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

Тем не менее, были достигнуты улучшения в RNN, такие как закрытые рекуррентные блоки (GRU) и долговременная краткосрочная память (LSTM), которые смогли справиться с проблемой исчезающих градиентов. Мы не будем рассматривать их в этом сообщении в блоге, но в будущем я буду писать о ГРУ и LSTM и о том, как они справляются с проблемой исчезающего градиента.

Это все для этого сообщения в блоге. Если у вас есть какие-либо вопросы, комментарии или отзывы, не стесняйтесь оставлять комментарии ниже. Надеюсь, вы нашли это полезным, спасибо за внимание!

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

[1]: Эндрю Нг. Зачем нужны модели последовательности. Https://www.coursera.org/learn/nlp-sequence-models/lecture/0h7gT/why-sequence-models

[2]: Ган Чен. Мягкое руководство по рекуррентной нейронной сети с обратным распространением ошибок. Https://arxiv.org/pdf/1610.02583.pdf