Как лучше обучать RNN для прогнозирования временных рядов?

Привет, Хабр!

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

Я разделил свой рассказ на несколько блоков:

  • Что такое RNN

  • Рекуррентные нейроны

  • Методы обработки временных рядов

  • Стратегии прогнозирования

  • Добавление факторов в RNN

  • Глобальные модели RNN

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

Параметры экспериментов

Общие параметры

  • Объект — 8 временных рядов, которые представляли цены закрытия акций российских и иностранных компаний с 2012 по 2021 год по дням.

  • Длина входного вектора (inputsize) = 30 дней

  • Прогнозный горизонт = 7 дней.

  • Архитектура: Stacked RNN (LSTM-Dropout-Linear)

  • Количество эпох: 40

  • Кросс-валидация: expanding rolling window c 5 фолдами.

  • Оптимизационная метрика: MAE

  • Оптимизатор: adam

Эксперимент 1: Сравнительный анализ влияния методов обработки временных рядов на прогноз моделями RNN

Схема первого экспериментаСхема первого эксперимента

Эксперимент 2: Сравнительный анализ стратегий прогнозирования RNN

Схема второго экспериментаСхема второго эксперимента

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

Факторы: Курс доллара к рублю, Курс евро к рублю, Цена на нефть Brent, Цена на золото, Цена индекса S&P 500, Цена индекса NASDAQ, Цена индекса Dow Jones.

Схема третьего экспериментаСхема третьего эксперимента

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

Что такое RNN?

RNN (Recurrent neural network) — вид нейронной сети, который хорошо подходит для задач обработки последовательностей данных, начиная от обработки естественного языка до прогнозирования временных рядов.

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

Рекуррентные нейроны

Наиболее популярными нейронами RNN являются RNN Элмана, блок долговременной краткосрочной памяти LSTM и блок GRU. Про начинку и принципы работы этих нейронов на Хабре уже написано много статей, поэтому углубляться в это не буду.

Блоки LSTM и GRU были разработаны специально для того, чтобы решить проблемы взрывного и исчезающего градиентов, которые были свойственны простому рекуррентному блоку RNN Элмана.

Согласно исследованию, LSTM показывает наилучшую производительность в задачах прогнозирования временных рядов. На втором месте идет блок GRU и замыкает список RNN Элмана.

Методы обработки временных рядов

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

Метод скользящего окна

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

Метод скользящего окнаМетод скользящего окна

Сначала временной ряд длиной L нарезается на части длины inputsize и outputsize. В общей сложности существует (L — outputsize — inputsize) таĸих частей. Здесь outputsize относится ĸ длине выходного окна, в то время как inputsize представляет длину входного окна, используемого в каждом фрагменте обучающей выборки. Обучающий набор данных генерируется путем повторения описанного выше процесса, смещая окно на одно значение вперед до тех пор, пока последняя точка входного окна не будет расположена в L — outputsize.

outputsize определяется, исходя из горизонта прогнозирования и стратегии построения прогноза.

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

inputsize = 1.25 * max(outputsize, seasonalperiod)

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

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

Заполнение пропущенных значений

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

Удаление сезонности

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

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

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

При этом простой временной ряд Series G с удалением мультипликативной сезонности модель RNN предсказывает заметно точнее:

eb328699c3e18bf6adc5afa0b1e2364f.png

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

Масштабирование (нормализация)

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

32febe1d38bc3580f85ea086de51ed2f.png

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

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

Стабилизация дисперсии ряда

Самыми популярными методами стабилизации дисперсии во временном ряду являются логарифмирование и преобразование Бокса-Кокса.

Логарифмирование: y^*_t=log(y_t)Box Cox: y^*_t = \begin{cases} log(y_t), & \mbox{if } 
    
            <p class=© Habrahabr.ru