Добавляем таймстэмпы в модели Sequential Recommendation
Статья от Amazon о том, как передать время события в трансформер — в основном на примере BERT4Rec. Для этого есть сложившиеся подходы, и авторы предлагают 2 метода: близкий к «классике» и оригинальный.

Основная идея — мультиразмерный таймстэмп: время события делят на 5 представлений: год, месяц, неделя, день недели и час дня, прибавляя их комбинацию к эмбеддингам событий на входе трансформера. Получаются категории, отвечающие за периодичность. Значения нормализуют до ≤ 1. Кроме исторических событий берут таймстэмп текущего запроса (query time) — в BERT4Rec его просто добавляют к маске.

Projection-based подход
В таймстэмпе два вида полезной информации: время и его отличие от других событий в истории. Модель должна «видеть» временные паттерны, учитывая разницу между таймстэмпами. Чтобы достичь этого, вычисляют векторы, используя ядро — функцию от разности таймстэмпов. Оно хорошо подходит для трансформера, т. к. в attention эмбеддинги сравниваются через скалярное произведение, смоделированное ядром.

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

Embedding-based подход
Компоненты мультиразмерного таймстэмпа рассматривают как категориальные фичи, ограниченные по количеству значений. Для каждой фичи ведут таблицу эмбеддингов — 24 эмбеддинга для часа дня, 7 для дней недели и т. д. Их конкатенируют и получают финальный эмбеддинг таймстэмпа.

По словам авторов, embedding-based метод работает лучше, когда данных много, т. к. модель может выучить нужную структуру эмбеддингов сама, без ограничения конкретным методом вроде ядра. Но в экспериментах много спорного: в 2 датасетах из 4 нет информации о часовых поясах; для больших и маленьких датасетов используют разные размерности эмбеддингов, а также странным образом делят данные на трейн, валидацию и тест — без полного таймсплита, отчего результаты могут быть некорректными.

Однако сама идея разбиения таймстэмпа интересная — хочется провести свой эксперимент 🤓

@RecSysChannel
Разбор подготовил Денис Бурштеин