Описание архитектуры и принципов реализации

Рассмотренные ранее типы нейронных сетей работают с заранее заданным объемом данных. В нашем же случае при работе с графиками цен трудно сказать, каким будет идеальный размер анализируемых данных. Разные закономерности могут проявляться в различные временные интервалы. Да и сами эти интервалы не всегда статичны и могут варьироваться в зависимости от текущей ситуации. Какие-то события могут быть редкими на рынке, но с большой долей вероятности отрабатываться. И хорошо, если такое событие осталось в рамках анализируемого окна. Но как только оно выпадает из него, то нейронная сеть уже не примет его во внимание. Хотя, возможно, именно в этот момент рынок будет отрабатывать реакцию на это событие. Увеличение анализируемого окна ведет к росту потребления вычислительных ресурсов и, как следствие, потребуется больше времени на обучение такой нейронной сети. А в практике реального применения потребуется больше времени на принятие решения.

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

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

Схема рекуррентного нейрона

Схема рекуррентного нейрона

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

Алгоритм обучения рекуррентной нейронной сети

Алгоритм обучения рекуррентной нейронной сети

К сожалению, столь простое решение не лишено недостатков. Подобный подход позволяет сохранить «память» на коротком временном отрезке. Цикличность умножения сигнала на коэффициент меньше единицы и применение функции активации нейрона ведет к постепенному затуханию сигнала с ростом количества таких циклов. Для решения данной проблемы в 1997 году Зепп Хохрайтер и Юрген Шмидху́бер предложили использовать архитектуру «Долгая краткосрочная память» (Long short-term memory — LSTM). На сегодняшний день алгоритм LTSM считается одним из лучших для решения задач классификации и прогнозирования временных рядов, когда значимые события разделены во времени и растянуты по временным интервалам.

LSTM сложно назвать нейроном. Скорее он уже является нейронной сетью с тремя каналами входа данных и тремя каналами выхода данных. Из них только по двум каналам осуществляется обмен данными с окружающим миров (один для входа и один для выхода). Остальные четыре канала замкнуты попарно для циклического обмена информацией (Memory — память и Hidden state — скрытое состояние).

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

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

Поток Hidden state (скрытое  состояние) предназначен для передачи во времени выходного состояния системы. Размер канала данных равен каналу данных «памяти».

Каналы Input data (входные данные) и Output state (выходное состояние) предназначены для обмена информацией с окружающим миром.

Схема LSTM модуля

Схема LSTM модуля

На вход алгоритма поступаю три потока данных:

  • Input data — описывает текущее состояние системы.
  • Memory и Hidden state — получаем из предыдущего состояния.

В начале работы алгоритма информация из Input data и Hidden state объединяются в единый массив данных, который в последующем подается на все четыре скрытых нейронных слоя LSTM.

Первый нейронный слой Forget gate (врата забвения) определяет, какую из хранящейся в памяти информацию можно забыть, а какую нужно помнить. Организован в виде полносвязного нейронного слоя с сигмоидной функцией активации. Количество нейронов в слое соответствует количеству ячеек памяти в потоке Memory. Каждый нейрон слоя получает на входе суммарный массив данных потоков Input data и Hidden state, а на выходе выдает число в диапазоне от 0 (полностью забыть) до 1 (сохранить в памяти). Поэлементное произведение выходных данных нейронного слоя с потоком памяти возвращает скорректированную память.

где:

  • σ логистическая функция активации;
  • WFG матрица весов для входного вектора;
  • INPt — вектор входного сигнала на текущей итерации;
  • UFG матрица весов для скрытого состояния;
  • HSt-1 — вектор скрытого состояния с предыдущей итерации.

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

  • New Content (новый контент) — полносвязный нейронный слой с гиперболическим тангенсом в качестве функции активации нормализует полученную информации в диапазоне от −1 до 1.

  • Input gate (входные врата) — полносвязный нейронный слой с сигмоидой в качестве функции активации. Аналогичен Forget gate и определяет какую новую информацию нужно запомнить.

Использование гиперболического тангенса в качестве функции активации для нейронного слоя нового контента позволяет разделить полученную информацию на положительную и отрицательную. Поэлементное произведение New Content и Input gate определяет важность полученной информации и объем, в котором ее необходимо сохранить в памяти.

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

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

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

С момента появления LSTM-блока свет увидел много его различных модификаций. Некоторые пытались сделать его «легче» для более быстрой обработки информации и обучения. Другие наоборот усложняли в попытке получить лучшие результаты. Наиболее удачной из них считается модель GRU (Gated Recurrent Unit — рекуррентный блок с вратами), которую представил Кенхен Чо (Kyunghyun Cho) и команда в сентябре 2014 года. Данное решение можно считать упрощенной версией стандартного блока LSTM. В нем ворота забвения и входные врата объединяются в одни врата обновления. При этом отказываются от использования отдельного потока памяти. Для передачи информации сквозь время используется только скрытое состояние.

В начале алгоритма GRU, как и в LSTM, определяются значения врат обновления и сброса. Математическая формула вычисления значений аналогична определению значений ворот в LSTM.

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

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

Таким образом, в модели GRU врата сброса регулируют скорость забывания данных. Врата обновления определяют, какую долю информации взять из предыдущего состояния, а какую из новых данных.