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

Меня зовут Роман Смирнов, я инженер по машинному обучению в Exness. До прихода в Exness я много работал с обработкой естественного языка и обработкой звука, которые являются областями, в которых модели-трансформеры в настоящее время являются самыми современными. Я попытался применить модели на основе преобразователя к последовательностям данных, в частности к пользовательским данным временных рядов.

Задания

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

Как правило, существует дисбаланс в распределении клиентов: большое количество клиентов имеет тенденцию к оттоку, а распределение ценности клиентов имеет необычное значение с длинным хвостом.

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

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

Наш вопрос заключался в следующем: можем ли мы использовать одну модель для прогнозирования как оттока клиентов, так и стоимости с комбинированными потерями (MAE и бинарной перекрестной энтропии), обеспечивая при этом точные прогнозы с точки зрения средней абсолютной ошибки (MAE)?

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

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

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

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

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

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

  1. У вас сложная функция потерь.
  2. Ваши данные не структурированы.
  3. Вы попробовали повышение градиента на деревьях решений в качестве основы и не можете улучшить его дальше.

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

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

Стандартизация и нормализация с использованием минимаксирования являются традиционными методами, но они лишь изменяют масштаб данных. Другой набирающий популярность метод называется ранговым преобразованием Гаусса. Этот метод более подробно объясняется в статье Nvidia «Преобразование ранга Гаусса в 100 раз быстрее с RAPIDS и CuPy».

Преобразование ранга Гаусса изменяет распределение данных, что выгодно для нейронных сетей. Используя ранговое преобразование Гаусса вместо нормализации или стандартизации, мы смогли улучшить показатель L1 нашей модели (MAE).

Архитектура

Архитектура-трансформер — сложная и большая концепция. Существует два типа моделей трансформаторов: энкодер и декодер.

(Существует также третий тип, модель кодировщик + декодер, который выходит за рамки этого обсуждения.)

Модели кодировщиков, такие как BERT, широко используются для обработки естественного языка. С другой стороны, модели декодера, такие как GPT, также используются при обработке естественного языка.

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

И модели кодировщика, и модели декодера могут содержать несколько блоков и иметь входные и выходные логиты (прогнозы). Входными данными для этой модели должна быть последовательность, поэтому, если у нас есть данные временных рядов, все временные ряды являются входными данными для этой модели. Например, если у нас есть 90 дней, это должно быть не менее 90 токенов.

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

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

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

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

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

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

Активации

Как правило, каждый блок преобразователя включает в себя несколько слоев, связанных нелинейными функциями активации. ReLU и GeLU обычно используются во многих моделях трансформаторов. Однако в 2022 году Google AI представил новый вариант под названием SwiGLU и заявил, что он более эффективен, чем популярные GeLU или ReLU. Но на основе наших экспериментов с различными задачами и типами данных мы обнаружили, что в большинстве случаев это не имеет существенного значения.

Способы кодирования данных временных рядов

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

При работе с данными временных рядов у нас обычно есть как статические, так и динамические данные.

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

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

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

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

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

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

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

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

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

Имеет ли значение размер?

Наши эксперименты показали, что размер модели трансформатора действительно влияет на производительность. Есть модели-трансформеры меньшего размера с меньшими габаритами и большего размера. Очевидно, что они требуют разного количества времени для обучения. Чем крупнее модель, тем больше часов ей нужно. Однако мы обнаружили, что более крупные модели лучше работают с выбросами.

Предварительно обученная подсказка

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

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

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

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

Ключевые результаты

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

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

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