Соревнование M5 Forecasting Accuracy Kaggle (здесь) ставит перед участниками задачу предсказать 4 недели будущих продаж набора розничных товаров на основе данных обучения за последние 5 лет. Имея очень небольшой опыт прогнозирования, я решил задокументировать свою попытку прогнозирования с точки зрения новичка. Имея только свой MacBook Pro 2015 года и не затуманенный никакими лучшими практиками, я отправился прогнозировать продажи одного из крупнейших ритейлеров в мире. Я представляю пробы и ошибки из этого грязного испытания.

Набор данных

Предоставленный набор данных о продажах M5 включает около 13000 товаров в 3 отделах, 7 категориях продуктов и 10 магазинах с 5-летними ~ 1900 ежедневными продажами.

Сразу же мы можем увидеть некоторые интересные тенденции в еженедельном агрегировании этого набора данных.

Глядя на общее количество продаж по неделям, мы видим, что объем продаж увеличивается с течением времени. Должны ли мы считать, что спрос на эти товары за 5 лет подскочил в 2,5 раза? Ну, учитывая, что это стандартное хобби, а продукты питания, скорее всего, со временем в каталог добавлялись новые позиции. Это хорошо иметь в виду.

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

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

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

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

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

Преобразованный набор данных

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

Некоторые константы, которые кажутся сразу полезными: (1) Индикатор для отдела (2) Индикатор для категории продукта.

Мы хотим зафиксировать некоторую сезонность этих данных от недели к неделе, поэтому давайте включим (3) переменную индикатора недели в году, и пока были на ней (4) цену в эту неделю года, и (5) средние продажи на этой неделе года

В дополнение к годовым эффектам нам также необходимо фиксировать еженедельные тенденции, такие как покупки по выходным, поэтому давайте включим (6) индикатор дня недели.

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

Нам нужно определить окна, через которые происходят наши прогнозы для обучения. Например, мы можем использовать продажи на n предыдущих временных шагах, чтобы предсказать продажи на k будущих временных шагах. Мы можем формализовать {y_n|t} как {y_t-i: i в [0,n]}, а {y_k} как {y_t+j: j в [1,k]}.

Мы также можем расширить традиционные входные данные временных рядов несколькими способами. Один из подходов заключается в использовании предыдущих средних и дисперсий во временных диапазонах [0,i], а не самих значений. Формализуем их как {m_n} = {E[{y_n|t}]: i в [0,n]} и {v_n|t} = {VAR[{y_n|t}]: i в [0, n ]}.

Модели

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

Умная модель скользящего среднего

Стандартная модель ARMA является обобщением принципов, упомянутых нами в случае моделирования акций. Прогноз для выходного временного шага t принимается как взвешенная комбинация предыдущих n выходных данных (наблюдаемых) и взвешенная комбинация m членов шума. Модель может быть записана как

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

К сожалению, эти α и β, вероятно, не будут применяться в качестве точных весов в огромном каталоге предметов. Более того, они, вероятно, не синхронизируются с естественной периодичностью данных. Итак, давайте введем механизм, похожий на внимание, на α и β, обусловленные с помощью обученных линейных проекций.

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

Модель продаж на основе трансформатора с постоянным вниманием

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

Теперь модели последовательности лучше всего работают с токенизированными входными данными, поэтому я взял {y_n} с реальным значением и поместил их примерно в ячейки на основе процентилей {1-exp(-i): i in [0,n]}. На самом деле я пробовал разовые продажи в диапазоне ~ 700 (максимальные продажи в день для любого товара), но это было слишком шумно. Сгруппированные входы/цели подаются в нефиксированный слой внедрения. Возможно, здесь сработает какой-то вариант Word2Vec, но я надеялся, что back-prop просто примет вложения. Эти вложения были объединены с позиционным кодированием, как в стандартной архитектуре преобразователя.

Чтобы объединить входные константы и закодированные последовательности, я ввел слой Dot-Product Attention (DPA) между входными данными последовательности и константами. Для краткого ознакомления слой Dot Product Attention выглядит следующим образом.

Таким образом, слой, который я представил, был, по сути, DPA с Q, установленным в проекцию вложений входных данных последовательности, и K, V, установленным в проекцию постоянных входных данных. Это поддерживает размерность вложений входной последовательности. Полную архитектуру трансформатора этой модели можно представить следующим образом.

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

Линейная проекция была применена, чтобы сопоставить H5 с размером бинов. Для этого применяется взвешенная перекрестная энтропия.

Регрессия применяется к категориальным результатам. Рассчитывается стандартная потеря MSE.

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

Архитектура была настроена на n = 365 дней продаж в прошлом, чтобы предсказать k = 28 дней будущих продаж. К сожалению, качество прогнозов было невысоким. Я не видел разреженности фактических последовательностей, захваченных в выходных данных модели (не так много смещения к 0, как я считаю разумным, учитывая данные).

Одной из проблем могло быть время обучения. Я смог выделить графический процессор ноутбука Kaggle для обучения на несколько часов, но я не видел достаточного прогресса, чтобы оправдать использование оставшегося еженедельного времени графического процессора для реализации.

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

Экстраполяция преобразования Фурье с учетом внимания

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

Экстраполяция Фурье с предсказанием сталкивается с несколькими трудными препятствиями: (1) если члены шума не удаляются из частотного представления, предсказание опережения фазы является копией начала входного сигнала (2) удаление членов шума из частотного представления для сглаживания вывод - несколько произвольный процесс.

Чтобы решить эти проблемы, я ввел механизм внимания в процесс экстраполяции Фурье. Формально опишем архитектуру end-to-end:

Первое преобразование представляет собой стандартное (дискретное) быстрое преобразование Фурье, которое генерирует набор коэффициентов c.

Далее мы представляем механизм внимания скалярного произведения с несколькими модификациями. Для нашей первой модификации мы сглаживаем наши сложные представления запроса, ключа и значения, прежде чем передавать их через их линейные проекции, а затем изменяем их форму на основе длины входного сигнала. Во-вторых, проекция значения (V) соответствует той же форме, что и входной сигнал c. И, наконец, мы заменяем активацию Softmax на Tanh. Я явно включил остаточную связь (в данном случае простое сложение) в следующее уравнение механизма внимания.

Этот механизм сохраняет несколько полезных свойств. Во-первых, константы частоты c перемасштабируются на основе величины входного сигнала c. Это преобразование может научиться полностью отменять компоненты входных частот. Во-вторых, сохранение размерности проекции значения (V) параметра c гарантирует, что мы можем передавать сигналы через обратное преобразование Фурье вниз по течению.

После механизма внимания мы продвигаемся к фазе нашего частотного представления. Предположим, что h = a+bi, и что мы хотим сдвинуть фазу на d дней в течение входного периода N. В этом случае фазовый сдвиг для j-й частотной составляющей равен ϕ = 2 π j d/N. Принимая h и ϕ, следующее преобразование правильно увеличивает фазу наших коэффициентов Фурье.

Последним этапом нашей модели является стандартное обратное (быстрое) преобразование Фурье.

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

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

Кроме того, были проблемы со стабильностью процесса обучения при нескольких вариантах архитектуры. Мне удалось стабилизировать процесс с помощью алгоритма обучения Адама, сконфигурированного с относительно большими размерами пакетов (~ 128), низкой скоростью обучения (‹0,1) и значительным уменьшением веса (>0,7).

К сожалению, точность прогнозов была невысокой по сравнению с другими конкурирующими методологиями, такими как различные варианты LSTM и модели дерева. Прогнозам удается примерно следовать тенденциям вывода, но ошибки на этапе прогнозов могут привести к большим потерям в функции ошибок. Этой модели удалось достичь 1,1 MSE в общедоступном тестовом наборе данных, в то время как некоторые общедоступные варианты LSTM могли довольно легко получить 0,4 MSE. Я предполагаю, что многие из общедоступных результатов в выпущенном проверочном наборе могут быть относительно избыточными, поэтому относительная производительность может улучшиться, когда будет выпущен закрытый тестовый набор. [Редактировать: результаты поднялись с ~4000 до ~1000 места, так что похоже, что многие люди переобучились]

Выводы

В ходе этого конкурса я смог опробовать несколько разных моделей. К сожалению, мне не удалось добиться хороших независимых результатов. Тем не менее, я многое узнал о проблеме прогнозирования в целом. Я думаю, что новая архитектура внимания, основанная на преобразовании Фурье, которую я представил, может иметь некоторые приложения, например, для ценообразования облигаций и опционов, поэтому я продолжу изучать это. Быть в курсе!

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