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

Введение

Рекуррентные нейронные сети (RNN) – это тип нейронной сети, предназначенный для обработки последовательных данных, таких как временные ряды, текст или речь. Одной из ключевых особенностей RNN, которая отличает их от других нейронных сетей, является то, что они имеют «память» в виде скрытых состояний, которые позволяют сети сохранять информацию с предыдущих временных шагов и использовать ее. влиять на его прогнозы или решения на более поздних временных шагах.

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

Понимание рекуррентной нейронной сети

Теперь давайте углубимся в архитектуру RNN. Взгляните на изображение ниже,

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

Развертывание рекуррентной нейронной сети

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

На изображении выше

  • Временные шаги обозначаются как X0, X1,… и X29, и каждый из них представляет собой отдельный момент времени.
  • Синие прямоугольники представляют входные данные на разных временных шагах.
  • Каждая «MemCell» представляет собой скрытый уровень, на котором данные передаются в сеть. Эти поля представляют собой единицы скрытого слоя (3∗3 в приведенном выше случае).
  • Каждый экземпляр «MemCell» представляет состояние этого скрытого слоя на определенном временном этапе. Итак, Y0 = H0​, Y1 ​= H1 и так далее. Это означает, что состояние скрытого слоя на каждом временном шаге сохраняется, перенося информацию во времени.
  • Чтобы делать прогнозы или получать выходные данные на заданном временном шаге, состояние скрытого слоя необходимо обрабатывать дальше. Обычно это достигается путем передачи состояния скрытого слоя через плотный слой. Мы углубимся в это более подробно в следующем разделе.

На изображении выше мы можем наблюдать два повторяющихся слоя, за которыми следует плотный слой. Чтобы упростить задачу, давайте сосредоточимся на решении задачи предсказания слов. У нас есть данные для первых 29 временных шагов, т.е. соответствующие начальным 29 словам последовательности. Наша цель заключается в предсказании слова на 30-м временном шаге (или X30​).

Для этого нам нужно передать состояние скрытого слоя с 29-го временного шага (H29​) через плотный слой, чтобы сгенерировать выходные данные на 30-м временном шаге (X30​).

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

Эта модифицированная архитектура позволяет нам генерировать прогнозы на каждом временном шаге (Yi​) на протяжении всей последовательности.

Теперь возникает фундаментальный вопрос: «Как архитектура RNN на самом деле делает прогнозы и учится на данных?»». Мы разберем этот вопрос в следующем разделе.

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

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

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

Здесь мы рассмотрим tanhв качестве нашей функции активации.

Формула для вычисления выходных данных зависит от текущего скрытого слоя. Оно дается следующим образом:

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

Конечно, давайте рассмотрим пример, где у нас есть словарь, состоящий из символов h’, ‘e’, ‘l’, and ‘l’,, и мы хотим, чтобы сеть предсказывала следующую букву после he.”. Для этого нам нужно сначала закодировать входные данные с помощью горячего кодирования. Вот как мы можем подойти к этому

Инициализируйте Wx

Вычислить Wx​ * Xt (текущий ввод, в нашем случае это 'h')​

Давайте вычислим Wh * ht-1​ и добавим к нему некоторую погрешность bh. В этом случае для простоты мы предполагаем, что Wh и смещение представляют собой простые скаляры (матрицы 1x1). Если перед входными данными нет скрытого слоя, Wh ​* ht−1​ будет состоять из нулей. Вот как мы можем это рассчитать. Добавление смещения приведет к тому, что

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

В следующем состоянии в сеть подается e из “hell”. ht теперь станет ht-1, а тот, который закодирован в горячем виде, как e становится Xt. Давайте посчитаем текущее состояние ht​ для e. Wh∗h(t−1) + смещение будет следующим:

Wh​∗Xt​ будет следующим:

Теперь скрытый слой ht‘e’ выглядит следующим образом:

Теперь давайте попробуем предсказать следующую букву после ‘e’, используя выходную формулу yt​, приведенную выше. На данный момент мы игнорируем любую предвзятость .

Теперь давайте отправим yt​ через прогнозирование следующей буквы на слое softmax.

Действительно, из примера видно, что сеть предсказала, что следующей буквой будет буква «h» с вероятностью примерно 0,4197, что оказалось неверным. В подобных случаях очевидно, что сеть требует более тщательного обучения и точной настройки ее весов и смещений.

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

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

Когда сеть делает прогноз, который не соответствует истинной метке (как видно в примере, где было предсказано «h» вместо «l»), она вычисляет потери, которые количественно определяют несоответствие между прогнозом и фактической целью. .

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

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

Давайте рассмотрим, как настраивается одно значение веса в контексте сети RNN, на простом примере. Это основано на том, о чем вы, наверное, уже слышали, известном как Gradient Decent. Представьте, что у нас есть значение параметра θ1​, которое влияет на некоторую произвольную функцию стоимости J(θ1​). Чтобы лучше понять процесс, давайте визуализируем функцию стоимости J(θ1​) как функцию от θ1​ используя простой одномерный график:

Мы вычисляем наклон функции стоимости при текущем значении θ1​. Если наклон положительный, это означает, что уменьшение значения θ1​ приведет к уменьшению значения функции стоимости и наоборот. Основываясь на положительном наклоне, мы уменьшаем значение θ1​ на небольшую величину, чтобы найти новое значение. Этот процесс продолжается итеративно, пока мы не достигнем точки, где наклон приближается к нулю.

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

Преимущества RNN

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

Проблемы стандартных RNN

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

Когда градиенты исчезают, это означает, что сеть не может эффективно изучать долгосрочные зависимости и не корректирует свои параметры, чтобы минимизировать ошибку.

  • L — функция потерь,
  • w — значение веса, h — веса скрытого слоя.
  • y — вывод,

Если какой-либо из градиентов приближается к нулю, то все будут стремиться к нулю. Обучение очень скоро прекратится.

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

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

Способы решения вышеуказанных проблем

  1. Инициализация веса. Такие методы, как инициализация Ксавье/Глорота или инициализация He, предназначены для установки начальных весов таким образом, чтобы помочь стабилизировать тренировку, избегая экстремальных значений веса, которые могут привести к проблемам с градиентом.
  2. Функции активации: Выпрямленные линейные единицы (ReLU) и их варианты, такие как Leaky ReLU, являются популярным выбором, поскольку они менее склонны к исчезновению градиентов по сравнению с сигмовидными или танскими активациями.
  3. Пакетная нормализация. Пакетная нормализация нормализует активации в каждом мини-пакете, снижая риск взрыва градиентов во время обучения, а также помогая решить проблему исчезновения градиента за счет стабилизации активаций.
  4. Отсечение градиента. Примените отсечение градиента, чтобы ограничить величину градиентов во время обратного распространения ошибки. Этот метод может предотвратить как чрезмерно большие, так и малые градиенты, вызывающие нестабильность тренировки.
  5. Планирование скорости обучения. Используйте графики скорости обучения, которые адаптивно регулируют скорость обучения во время обучения. Такие методы, как снижение скорости обучения или циклическая скорость обучения, могут помочь сети более эффективно сходиться, избегая при этом проблем с градиентом.
  6. Расширенные архитектуры. Рассмотрите возможность использования специализированных архитектур, предназначенных для решения этих проблем, таких как сети с длинной краткосрочной памятью (LSTM) и GRU. Эти архитектуры разработаны с механизмами смягчения как исчезающих, так и взрывных градиентов, что делает их подходящими для последовательных данных.

Краткое содержание

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

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

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

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

Ссылки и дополнительные ресурсы

Для тех, кто хочет глубже углубиться в RNN, вот несколько ценных ресурсов, с которых можно начать: