Использование преобразователя PyTorch для прогнозирования временных рядов во время вывода, когда вы не знаете ввод декодера
В этом посте я покажу, как выполнить вывод с помощью преобразователя PyTorch для прогнозирования временных рядов. В частности, мы будем использовать преобразователь временных рядов PyTorch, который я описал в своем предыдущем посте Как сделать преобразователь для прогнозирования временных рядов с помощью PyTorch.
Пост структурирован следующим образом: во-первых, я кратко опишу, какие входные данные требуются для Transformer временных рядов PyTorch. Затем я покажу вам, как выполнить вывод с моделью, когда вы не знаете входных значений декодера. Наконец, я укажу на несколько недостатков показанного подхода.
Какие входные данные требуются для модели преобразователя временных рядов?
Если вы не читали мой пост «Как сделать PyTorch Transformer для прогнозирования временных рядов», давайте сначала кратко рассмотрим, какие входные данные требуются для Transformer временных рядов. Для более подробного ознакомления см. вышеупомянутый пост. Обратите внимание, что термины trg
и tgt
иногда используются взаимозаменяемо в этом сообщении и в другом сообщении.
Модель трансформатора требует следующих входных данных:
src
, который используется кодировщиком. Форма src
должна быть [размер пакета, n, количество входных объектов] или [n, размер пакета, количество входных объектов] (в зависимости от значения batch_first
аргумент конструктора), где n — количество точек данных во входном ряду. Если, например, вы прогнозируете почасовые цены на электроэнергию и хотите основывать свои прогнозы на данных за последнюю неделю, тогда n=168.
tgt
— еще один вход, необходимый трансформатору. Он используется декодером. tgt
состоит из последнего значения входной последовательности в src
и всех значений целевой последовательности, кроме последнего. Другими словами, он будет иметь форму [размер пакета, m, количество прогнозируемых переменных] или [m, размер пакета, количество прогнозируемых переменных], где m — горизонт прогнозирования. Продолжая пример прогнозирования цен на электроэнергию, если вы хотите спрогнозировать цены на электроэнергию на 48 часов вперед, тогда m=48.
Кроме того, кодировщику и декодеру требуются так называемые маски. Читатель отсылается к вышеупомянутому посту для ознакомления с маскировкой.
Еще одна вещь, которую важно отметить, прежде чем мы продолжим, заключается в том, что конкретная реализация преобразователя временных рядов, которую мы используем в этом сообщении в блоге, всегда выводит тензор формы [размер пакета, m, количество прогнозируемых переменных] или [m,размер пакета, количество прогнозируемых переменных], т.е. длина выходных последовательностей модели определяется длиной входных последовательностей, переданных декодеру в tgt
тензоре.
Таким образом, если tgt
имеет форму [72, размер пакета, 1], это означает, что длина последовательностей в tgt
равна 72, и, таким образом, модель также будет выводить последовательности из 72.
Как использовать преобразователь временных рядов для логического вывода
Хорошо, с предварительными приготовлениями, давайте теперь рассмотрим, почему вообще существует запись в блоге о том, как выполнить вывод с помощью Transformer для прогнозирования временных рядов:
Во время обучения легко получить tgt
, потому что мы знаем значения целевой последовательности. Однако во время логического вывода (например, в производственной среде) мы, конечно, не знаем значений целевой последовательности при составлении прогнозов — иначе нам вообще не нужно было бы делать прогнозы. Поэтому нам нужно найти способ получить разумное tgt
, которое можно было бы использовать в качестве входных данных для модели во время логического вывода.
Теперь, когда мы знаем, какие входные данные требуются для Преобразователя временных рядов и почему нам нужно каким-то образом сгенерировать tgt
, давайте посмотрим, как это сделать на самом деле. В дальнейшем имейте в виду, что общая цель состоит в том, чтобы создать тензор tgt
, который после его создания можно использовать в качестве входных данных для модели для составления прогноза.
Чтобы проиллюстрировать это на простом примере, предположим, что во время вывода t мы хотим спрогнозировать следующие 3 значения последовательности на основе 5 самых последних наблюдений последовательности.
Вот как будет выглядеть src
:
src = [xt-4, xt-3, xt-2, xt-1, xt]
где x
обозначает серию, с которой мы имеем дело, например. цены на электроэнергию.
Цель состоит в том, чтобы предсказать tgt_y
, который будет:
tgt_y = [xt+1, xt+2, xt+3]
Таким образом, наш tgt
, который нужен модели в качестве входных данных, чтобы сделать прогноз для tgt_y
, должен быть:
tgt = [xt, xt+1, xt+2]
Мы знаем значение xt
, но не xt+1
и не xt+2
, поэтому нам нужно как-то их оценить. В этом посте мы сделаем это, сначала спрогнозировав xt+1
, затем добавим этот прогноз к tgt
таким образом, чтобы tgt = [xt, xt+1]
и затем использовали этот прогноз tgt
для прогноза xt+2
, затем добавим этот прогноз к tgt
таким образом, чтобы tgt = [xt, xt+1, xt+2]
и, наконец, использовали этот прогноз tgt
для получения окончательного прогноз.
Приведенная ниже функция — это код, необходимый для запуска логического вывода с помощью модели Transformer временных рядов в PyTorch. Функция производит прогноз в соответствии с подходом, описанным выше. Вы передаете модель Transformer и src
вместе с некоторыми другими аргументами, описанными в строке документации. Затем функция итеративно генерирует tgt
и выдает окончательный прогноз на основе tgt
, состоящего из последнего известного наблюдения в момент времени t и оценочных значений для оставшихся m-1 точек данных.
Эта функция предназначена для использования внутри цикла проверки или тестирования. Вместо вызова модели для получения прогнозов вы вызываете функцию вывода. Вот упрощенный пример того, как его использовать:
Обратите внимание, что вы не можете использовать этот скрипт как есть. Это всего лишь пример, показывающий общую идею — это не значит, что вы можете скопировать и вставить что-то, что должно работать. Например, вам нужно создать экземпляр модели и загрузчиков данных, прежде чем вы сможете заставить скрипт работать. В репозитории GitHub для этой записи блога см. файл sandbox.py, где приведены примеры того, как это сделать. Если вы никогда раньше не обучали, не проверяли и не тестировали нейронную сеть PyTorch, я предлагаю вам ознакомиться с некоторыми учебниками PyTorch для начинающих.
Недостатки показанного подхода к выводу с помощью преобразователя временных рядов
Учитывая, что функции вывода основаны на цикле для итеративного создания tgt
, функция может работать медленно, если m велико, потому что это увеличит количество итераций в цикле. Это главный недостаток подхода, описанного выше. У меня не хватило воображения, чтобы придумать более эффективный подход, но я хотел бы услышать от вас в разделе комментариев, если у вас есть какие-либо идеи. Вы также можете внести свой вклад непосредственно в репозиторий.
Учитывая, что функция логического вывода вызывает модель m-1 раз за пакет, вам следует опасаться некоторых моментов, которые увеличивают время вычислений при вызове модели, например, использование модели со многими параметров или с помощью большого n. Кроме того, чем больше у вас пакетов, тем больше раз будет вызываться функция логического вывода и тем дольше будет выполняться весь обучающий или тестовый сценарий.
Код для выполнения вывода с помощью Transformer временных рядов, а также реализацию PyTorch Transformer можно найти в этом репозитории:
Вот и все! Надеюсь, вам понравился этот пост 🤞
Пожалуйста, оставьте комментарий, дайте мне знать, что вы думаете.
Подпишитесь на другие публикации, связанные с прогнозированием временных рядов, зеленой разработкой программного обеспечения и воздействием на окружающую среду науки о данных🍀
И не стесняйтесь связаться со мной в LinkedIn.