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

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

Вы можете проверить блокнот с примером части этого поста здесь и репозиторием BLiTZ Bayesian Deep Learning на PyTorch здесь.

Для этого мы объясним, как работает байесовская долгосрочная память, а затем рассмотрим пример прогнозирования доверительного интервала запасов с использованием этого набора данных из Kaggle.

Если вы новичок в теме байесовского глубокого обучения, возможно, вам стоит поискать одну из многих публикаций на Medium об этом или просто раздел документации по байесовскому DL нашего репозитория lib. Вы также можете проверить этот пост в руководстве по использованию BLiTZ.

Байесовские слои LSTM

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

Математически мы переводим архитектуру LSTM как:

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

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

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

И, конечно же, нашими обучаемыми параметрами являются ρ и μ, которые параметризуют каждое из распределений весов. BLiTZ имеет встроенный слой BayesianLSTM, который выполняет всю эту тяжелую работу за вас, поэтому вам просто нужно беспокоиться о своей сетевой архитектуре и циклах обучения / тестирования.

Вернемся к нашему примеру.

Прежде всего, наш импорт

Помимо нашего общего импорта, мы будем импортировать BayesianLSTM из blitz.modules и variational_estimator декоратор из blitz.utils, который мы использовали с помощью вариационного обучения и сбора сложности-стоимости.

Мы также импортируем collections.deque для использования при предварительной обработке данных временных рядов.

Предварительная обработка данных

Теперь мы создадим и предварительно обработаем наш набор данных, чтобы передать его в сеть. Мы импортируем цены на акции Amazon из наборов данных, которые мы получили от Kaggle, получим столбец «Цена закрытия» и нормализуем его.

Наш набор данных будет состоять из временных меток нормализованных цен акций и иметь форму (размер_пакета, длина_последовательности, длина_ наблюдения).

Импортируем и предварительно обработаем данные:

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

Создание нашего сетевого класса

Наш сетевой класс получает декоратор variational_estimator, который облегчает выборку потерь байесовских нейронных сетей. Он будет иметь байесовский слой LSTM с in_features = 1 и out_features = 10, за которым следует nn.Linear (10, 1), который выводит нормализованную цену акции.

Как видите, эта сеть работает вполне нормально, и единственные необычные вещи здесь - это экземпляр слоя BayesianLSTM и декоратор variational_estimator, но его поведение является обычным для Torch.

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

Создание объектов

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

Мы будем использовать нормальные среднеквадратические потери ошибок и оптимизатор Адама со скоростью обучения = 0,001.

Поезд петля

Для нашего цикла поезда мы будем использовать метод sample_elbo, который variational_estimator добавил в нашу нейронную сеть. Он усредняет потери по X выборкам и помогает нам в Монте-Карло с легкостью оценить наши потери.

Чтобы этот метод работал, выходные данные метода forward сети должны иметь ту же форму, что и метки, которые будут переданы объекту / критерию потерь.

Оценка модели и сбор доверительных интервалов

Сначала мы создадим фрейм данных с истинными данными для построения графика:

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

Давайте посмотрим на код функции прогнозирования:

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

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

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

Проверьте графики прогнозов

Теперь мы просто строим графики прогнозов, чтобы визуально увидеть, хорошо ли прошло наше обучение. Мы построим реальные данные и тестовые прогнозы с их доверительным интервалом:

И чтобы закончить нашу оценку, мы увеличим масштаб области прогноза:

Заключение

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

Мы также можем предсказать доверительный интервал для цены акций IBM с очень высокой точностью, что может быть гораздо более полезным пониманием, чем просто точечная оценка.

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