"Машинное обучение"
Основы рекуррентных нейронных сетей (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 немного сложнее из-за рекурсивного характера весов и их влияния на потери, которые растягиваются со временем. Мы увидим, что это означает, в немного.
Чтобы получить конкретное представление о том, как работает обратное распространение ошибки, давайте рассмотрим общий рабочий процесс:
- Инициализировать весовые матрицы Wx, Wy, Wh случайным образом
- Прямое распространение для вычисления прогнозов
- Вычислить потерю
- Обратное распространение для вычисления градиентов
- Обновить веса на основе градиентов
- Повторите шаги 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