Сегодня — честный обзор на уже захайпленный датасет.
Если вы когда-либо занимались ресерчем в рексисе, то точно сталкивались с проблемами датасетов.
(Можно вспомнить классическую статью Are We Really Making Much Progress?)
Сначала — немного боли из прошлого:
— гигантский гэп между train и test
— однотипный фидбек
— отсутствие разнообразия пользовательских паттернов
И это всё — на фоне постоянных споров в академии про то, что вообще считается хорошим датасетом.
Даже если вы соберёте SOTA-модель — она может просто не «прокраситься» на кривом сете.
Ну серьёзно, в том же MovieLens test отстоит от train на несколько лет.
И вот — датасет от Яндекс Музыки.
Огромный:
пришёл ли пользователь к треку сам или его привёл алгоритм
С одной стороны — это прям must-have для исследовательского пула.
Многоуровневый фидбек:
Даже эмбеддинги спектрограмм есть.
А ещё — продуманный split:
(приложу картинку в комментах — очень в тему для продовой оценки)
По сравнению с Netflix, Steam и прочими — это реально большой и комплексный датасет.
Я бы еще упомянул о бенчмарках и красивом коде куда на мой взгляд легко интегрировать свои решения.
Один момент, о котором почти никто не говорит — это домен.
Яндекс Музыка — это, как и TikTok, продукт с ярко выраженными короткими и длинными предпочтениями.
Здесь трансформеры можно не просто тестировать — здесь они раскрываются.
Но. Доверяй, но проверяй.
Спасибо ребятам из Яндекса за такой летний подгон.
Реально мощный вклад в сообщество, действительно мало компаний могут себе это позволить.
Please open Telegram to view this post
VIEW IN TELEGRAM
huggingface.co
yandex/yambda · Datasets at Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
Рисерчошная
Недавно в чатике обсуждал смысл алгокодинга и Валера привел мне как аргумент, что алгокодинг сильно коррелирует с навыками в работе. (А я скорее склонен верить). И соответственно возник вопрос, а как тогда определять синьерность?
Мне кажется, нашёл один из железных критериев. Senior — это не просто человек с опытом, который умеет писать код или красиво говорить на митингах. Это человек, способный принимать рациональные, системные решения. И тут есть пара тревожных звоночков, которые выдают отсутствие senior-подхода:
Важно понимать, что senior — это прежде всего про умение выбирать наилучшее решение с минимальными затратами. И если ваш тимлид или техлид начинает сразу с усложнения, минуя baseline, задумайтесь...
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Дата канальи — про «специалистов» в данных / ML / AI
Если отвлечь синьора и дизайнера, то, кажется, можно даже понятно нарисовать как SASRec учится. Интересно, получится ли с моделями поновее и побольше -- HSTU и FUXI-alpha 🤔
Сегодня был мой последний день в компании.
Очень тёплое ощущение — работать с командой, с которой мы строили сильные решения. Часто вслепую, часто через боль, с ошибками и переработками. Но всегда с верой в то, что делаем что-то важное.
Хотя наши пути неизбежно разошлись — и всё же сегодняшний день ощущается как точка X, к которой я шёл долго и весь мой опыт сложился будто воедино. (и я надеюсь что реальность и ожидания тут не расходятся)
Скоро расскажу про новое место и команду. Подогреваю интерес: если всё пойдёт по плану, до конца лета покажем пару действительно крутых проектов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Рисерчошная
Недавно в одном чате по курсу рекомендашек ребята собрались рассказать про TransAct.
Достаточно логичное продолжение моего рассказал про PinnerFormer.
Please open Telegram to view this post
VIEW IN TELEGRAM
Как вы уже могли заметить отовсюду только и слышно про масштабирование рекомендашек. Яндекс везде рассказывают про свой мега крутой аргуес. Если коротко то:
вот в LLMках получилось, а у нас в RecSys не получается. Да и данных у нас столько нет…
Ребята из Meta AI, как мне кажется, наконец-то доделали трансформеры в том виде в котором они и должны быть. Вот вспомним статьи SASRec, BERT4rec, etc. Это все базовые модели написанные на основе LLM архитектур которые пытаются по сути представить товары как токены.
И вот ряд ограничений, что товары не живут в изолированной вселенной, в них есть некоторая семантика, время и частота покупок и тп.
До этого момента мы их учитывали ну скажем честно — плохо. Давайте просто просуммируем все эмбеддинги и дай бог модель что-то у себя там поймет.
Так вот HSTU (Hierarchical Sequential Transduction Units) — переосмысляет задачу рекомендаций как генеративное последовательное преобразование событий пользователя. Без классического позиционного эмбеддинга, без агрегации всех признаков в один вектор на шаг — всё последовательнизируется (если так можно сказать).
Забудь про обычный self-attention, где ты нормируешь веса softmax'ом по всей последовательности. В HSTU используется Pointwise Aggregated Attention — здесь внимание считается *по каждой паре токенов отдельно*, без нормализации между ними.
Если пользователь 10 раз кликнул на один айтем, а другой посмотрел 1 раз — softmax вряд-ли что-то там почувствует в отличие от pointwise.
Кроме того, pointwise-внимание более устойчиво к нестационарному словарю объектов в стриминговых данных — то есть когда постоянно появляются новые элементы (товары, контент) и распределение взаимодействий со временем меняется.
HSTU вводит иерархическое представление признаков во времени: все категориальные признаки (идентификаторы пользователя, товара, контента и др.) преобразуются во вспомогательные «события» и вставляются в последовательность наряду с основными событиями взаимодействия пользователя.
Это превращает классическую схему рекомендации (где различные признаки объединяются в статический вектор признаков) в единый последовательный поток событий, который модель обрабатывает авторегрессионно с причинным вниманием.
В классических DLRM-моделях (e.g. sasrec etc) отдельные группы признаков (числовые метрики, категориальные ID и т.п.) проходят через сеть и агрегируются для предсказания (например, вероятности клика).
В HSTU же эти признаки «последовательнизируются»: формируется основной временной ряд из событий (например, просмотр элемента) и несколько вспомогательных рядов с категориальными признаками (например, ID категории, создателя контента и др.), которые вставляются как отдельные токены.
Модель с причинно-маскированным вниманием обучается предсказывать последующие события по этим объединенным последовательностям (тем самым интегрируя признаки непосредственно в процессе предсказания)
В SASRec же стандартная практика такова: вы берёте все эти фичи в рамках одного «шага» — скажем, в момент, когда пользователь совершил действие — формируете из них один общий эмбеддинг- вектор и лишь после этого подаёте в трансформер.
Проще говоря, если в HSTU входная последовательность на одном такте может выглядеть так:
[item_id=123] → [action_type=click] → [category_id=456] → [num_clicks=3] → [user_id=789] → …
то в SASRec придётся предварительно для этого «шага» собрать единый вектор:
E_input = Emb(item_id=123)
+ Emb(action_type=click)
+ Emb(category_id=456)
+ Emb(num_clicks=3)
+ Emb(user_id=789)
+ PositionalEmbedding(position_t)
Please open Telegram to view this post
VIEW IN TELEGRAM
Архитектура HSTU также оптимизирована по ряду других направлений. Модель существенно сокращает число линейных слоёв вне блока внимания — вместо шести линейных проекций, характерных для каждого слоя Transformer, остаются только две.
Это достигается более *простым и слитным дизайном* слоёв, уменьшающим объём активаций в памяти. По сути, HSTU объединяет некоторые этапы проекции и нормализации, что экономит память без потери качества.
Ещё одно отличие — эффективная реализация самовнимания с учётом разреженности последовательностей. Авторы HSTU разработали специальное оптимизированное *ядро внимания* для GPU, которое преобразует вычисление внимания в серию сгруппированных матричных умножений (аналогично идеям FlashAttention). Это позволяет добиться того, что сложность по памяти и времени растёт почти *линейно* от фактической длины непустой части последовательности, делая внимание memory, а не compute.
Дополнительно вводится метод Stochastic Length (SL) — стохастическое усечение последовательностей во время обучения.
Поскольку в действиях пользователей часто наблюдаются повторяющиеся паттерны на разных временных масштабах, можно случайным образом пропускать часть событий (увеличивая разреженность последовательности) без значимой потери информации.
Алгоритм SL выбирает подпоследовательность фиксированной длины из полного исторического списка действий пользователя, за счёт чего снижает затратность самовнимания с O(n²) до примерно O(n) на обучении. (не уверен точно не квадратичная)
В совокупности такие архитектурные решения делают HSTU более *лёгким и масштабируемым* по сравнению с классическим трансформером: модель получила возможность быть в > 2 раза глубже (больше слоёв) при том же объёме памяти, а скорость обучения и вывода превосходит оптимизированный Transformer++ в 1.5 – 15 раз на длинных последовательностях.
Также HSTU включает улучшенные механизмы относительного позиционного смещения, позволяющие лучше моделировать порядок элементов во временном ряду по сравнению с базовыми реализациями трансформера
Меньшее число активаций и весов вне блока внимания означает, что HSTU потребляет меньше VRAM/RAM на каждый обучающий пример, что критично в продакшене. Это позволило увеличить глубину модели (число слоёв) более чем вдвое без переполнения памяти, что способствует более тонкому обучению сложных зависимостей. В условиях рекомендательных систем с множеством гетерогенных признаков это важно: HSTU фактически интегрирует тысячи признаков пользователя и элемента прямо в последовательность событий, не взрывая при этом требования к памяти.
Так что это точно надо пробовать заводить в прод, скорее всего заменит все текущие трансформеры в ближайшее время. UPD в комментах выяснили что пока не заводим в прод😂
Если вы что-то такое уже пробовали можете поделиться в комментах
➡️ Читать тут
Это достигается более *простым и слитным дизайном* слоёв, уменьшающим объём активаций в памяти. По сути, HSTU объединяет некоторые этапы проекции и нормализации, что экономит память без потери качества.
Ещё одно отличие — эффективная реализация самовнимания с учётом разреженности последовательностей. Авторы HSTU разработали специальное оптимизированное *ядро внимания* для GPU, которое преобразует вычисление внимания в серию сгруппированных матричных умножений (аналогично идеям FlashAttention). Это позволяет добиться того, что сложность по памяти и времени растёт почти *линейно* от фактической длины непустой части последовательности, делая внимание memory, а не compute.
Дополнительно вводится метод Stochastic Length (SL) — стохастическое усечение последовательностей во время обучения.
Поскольку в действиях пользователей часто наблюдаются повторяющиеся паттерны на разных временных масштабах, можно случайным образом пропускать часть событий (увеличивая разреженность последовательности) без значимой потери информации.
Алгоритм SL выбирает подпоследовательность фиксированной длины из полного исторического списка действий пользователя, за счёт чего снижает затратность самовнимания с O(n²) до примерно O(n) на обучении. (не уверен точно не квадратичная)
В совокупности такие архитектурные решения делают HSTU более *лёгким и масштабируемым* по сравнению с классическим трансформером: модель получила возможность быть в > 2 раза глубже (больше слоёв) при том же объёме памяти, а скорость обучения и вывода превосходит оптимизированный Transformer++ в 1.5 – 15 раз на длинных последовательностях.
Также HSTU включает улучшенные механизмы относительного позиционного смещения, позволяющие лучше моделировать порядок элементов во временном ряду по сравнению с базовыми реализациями трансформера
Меньшее число активаций и весов вне блока внимания означает, что HSTU потребляет меньше VRAM/RAM на каждый обучающий пример, что критично в продакшене. Это позволило увеличить глубину модели (число слоёв) более чем вдвое без переполнения памяти, что способствует более тонкому обучению сложных зависимостей. В условиях рекомендательных систем с множеством гетерогенных признаков это важно: HSTU фактически интегрирует тысячи признаков пользователя и элемента прямо в последовательность событий, не взрывая при этом требования к памяти.
Так что это точно надо пробовать заводить в прод, скорее всего заменит все текущие трансформеры в ближайшее время. UPD в комментах выяснили что пока не заводим в прод
Если вы что-то такое уже пробовали можете поделиться в комментах
Please open Telegram to view this post
VIEW IN TELEGRAM
Рисерчошная
Если отвлечь синьора и дизайнера, то, кажется, можно даже понятно нарисовать как SASRec учится. Интересно, получится ли с моделями поновее и побольше -- HSTU и FUXI-alpha 🤔
Сегодня на TrueTechDay смотрел как Никита Зелинский рассказывал про разные модельки после sasrec: bert4rec, pinnerformer, hstu, fuxi alpha etc.
Неплохая обзорная лекция, скажем про тренды. Ожидал что будет что-то как применяли в проде, но нет
Please open Telegram to view this post
VIEW IN TELEGRAM
В прошлой серии мы обсудили концепцию генеративок, а именно HSTU и если коротко говорить они предложили учитывать все взаимодействия, а не агрегировать их софтмаксом и тем самым мы раздуваем модель и улучшаем качество. Так вот так же в комментах мы выяснили, что пока что ее пока что достаточно сложно завести в прод с позиционным кодированием (хотя у яндексовского Аргуса то получилось, а значит решение существует). Сегодня давайте посмотрим на другое решение, которое кажется более правдоподобным с продом.
FuXi-α — это модель от исследователей Huawei (USTC и Noah’s Ark Lab), разработанная как дальнейшее развитие идей трансформеров для рекомендаций с упором на учёт взаимодействий признаков и масштабирование.
Название модели к слову отсылает к Фуси (Fu Xi) – культурному герою, приписываемому создание систем предсказаний, что символично для рекомендательной системы. Было немного странно слышать от Никиты (смотреть TrueTechDay), что мы не называем свои модели какими нибудь Рюриками (щас Кандинский где-то заплакал).
Архитектурно FuXi-α представляет собой стек из нескольких FuXi-блоков, аналогичных декодерам трансформера (с самовниманием и полносвязными слоями). Однако внутри каждого такого блока применяются два нововведения:
AMS по сути является модификацией стандартного multi-head self-attention, в которой внимание раздельно обрабатывает семантические, временные и позиционные аспекты последовательности.
Идея заключается в разделении разных типов сигналов: обычно трансформеры кодируют позицию добавлением позиционного эмбеддинга к входу и не имеют явного понятия о времени между событиями.
Please open Telegram to view this post
VIEW IN TELEGRAM
Таким образом, модель учится явным образом понимать, насколько далеко друг от друга по времени или по порядку находятся два действия пользователя, и учитывать это при вычислении внимания.
Кроме того, в реализации AMS у временного и позиционного каналов разделяются головы внимания, но значения (Value) для них берутся из того же пространства, что и у семантического канала.
Авторы отказались от собственных матриц Value для времени/позиции, чтобы не раздуть сложность – вместо этого эти каналы переиспользуют V из семантического, действуя скорее как модификаторы веса для семантических содержательных эмбеддингов.
Формально выход AMS получается конкатенацией результатов трёх каналов (семантического, позиционного, временного), которая затем проходит через RMS-нормализацию (layer norm в виде корня из среднеквадр. отклонения) и скалируется через поэлементное перемножение с матрицей параметров.
То есть FuXi-α также уходит от классического softmax, но делает это в контексте каждого канала: φ(QK) в семантическом канале – некоторая активационная функция (указана SiLU), а веса во временном/позиционном канала получаются через обучаемые функции от разниц (можно считать, тоже своеобразные нелинейности).
Вторая составляющая архитектуры – многоэтапный полносвязный блок (Multi-stage FFN) – направлена на усиление неявных (implicit) взаимодействий между признаками. Дело в том, что после слоя самовнимания модель всё ещё должна комбинировать информацию о различных признаках и элементах нерекуррентным образом (как это делают FFN в трансформере, захватывая попарные взаимодействия между признаками через нелинейность). FuXi-α расширяет этот процесс до двух стадий.
Стадия 1 MFFN берет выходы всех каналов AMS и объединяет их с исходным входом слоя посредством линейной проекции и резидуального суммирования. То есть, на первом этапе полносвязного блока модель возвращает в смесь сырые эмбеддинги предыдущего слоя, чтобы убедиться, что оригинальный контекст не потерян после внимания. Это похоже на расширенный residual connection: выход AMS сперва линейно трансформируется, а затем к нему добавляется (concat + sum) исходный вектор слоя, обеспечивая проход исходной информации дальше. (p.s. тут ничего нового)
Стадия 2 MFFN занимается собственно моделированием скрытых взаимодействий признаков. Выход Stage 1 пропускается через нормализацию (RMSNorm), затем через активацию SwiGLU (Switchable Gated Linear Unit) внутри ещё одного линейного слоя. Активация SwiGLU – это вариант нелинейности, где одна часть нейронов используется как управляющие «ворота» для другой части, что усиливает способность сети выражать сложные функции. После SwiGLU результата добавляется резидуальное соединение (skip connection) из Stage 1. (Как будто тоже не сильно лучше чем DCN с которым они сравниваются)
Таким образом, Stage 2 фактически реализует улучшенный FFN-трансформер (с GLU вместо ReLU), получающий на вход уже сочетание исходных признаков и осмысленных вниманиями представлений. Благодаря такому устройству, MFFN позволяет модели эффективно захватывать сложные нелинейные взаимодействия между эмбеддингами признаков и историей, одновременно избегая затухания градиента за счёт skip-коннектов на каждой стадии.
В остальном архитектура FuXi-α следует шаблону авторегрессивного трансформера: выход нескольких FuXi-блоков (AMS + MFFN) преобразуется в распределение на следующий объект через умножение на транспонированную матрицу эмбеддингов и softmax на выходном слое. Обучается модель по задаче прогнозирования следующих элементов последовательности (next-item prediction) с использованием loss-функции sampled softmax (семплирование негативных примеров для ускорения).
НО! Все их результаты они приводят на мувиленсе (вообще не смотрим на него) и на куайранд (относительно небольшой датасет музыки). Имеются вопросики к честной оценке и выборе датасетов, но идея неплохая.
➡️ Архив кстати с кодом
Кроме того, в реализации AMS у временного и позиционного каналов разделяются головы внимания, но значения (Value) для них берутся из того же пространства, что и у семантического канала.
Авторы отказались от собственных матриц Value для времени/позиции, чтобы не раздуть сложность – вместо этого эти каналы переиспользуют V из семантического, действуя скорее как модификаторы веса для семантических содержательных эмбеддингов.
Формально выход AMS получается конкатенацией результатов трёх каналов (семантического, позиционного, временного), которая затем проходит через RMS-нормализацию (layer norm в виде корня из среднеквадр. отклонения) и скалируется через поэлементное перемножение с матрицей параметров.
То есть FuXi-α также уходит от классического softmax, но делает это в контексте каждого канала: φ(QK) в семантическом канале – некоторая активационная функция (указана SiLU), а веса во временном/позиционном канала получаются через обучаемые функции от разниц (можно считать, тоже своеобразные нелинейности).
Вторая составляющая архитектуры – многоэтапный полносвязный блок (Multi-stage FFN) – направлена на усиление неявных (implicit) взаимодействий между признаками. Дело в том, что после слоя самовнимания модель всё ещё должна комбинировать информацию о различных признаках и элементах нерекуррентным образом (как это делают FFN в трансформере, захватывая попарные взаимодействия между признаками через нелинейность). FuXi-α расширяет этот процесс до двух стадий.
Стадия 1 MFFN берет выходы всех каналов AMS и объединяет их с исходным входом слоя посредством линейной проекции и резидуального суммирования. То есть, на первом этапе полносвязного блока модель возвращает в смесь сырые эмбеддинги предыдущего слоя, чтобы убедиться, что оригинальный контекст не потерян после внимания. Это похоже на расширенный residual connection: выход AMS сперва линейно трансформируется, а затем к нему добавляется (concat + sum) исходный вектор слоя, обеспечивая проход исходной информации дальше. (p.s. тут ничего нового)
Стадия 2 MFFN занимается собственно моделированием скрытых взаимодействий признаков. Выход Stage 1 пропускается через нормализацию (RMSNorm), затем через активацию SwiGLU (Switchable Gated Linear Unit) внутри ещё одного линейного слоя. Активация SwiGLU – это вариант нелинейности, где одна часть нейронов используется как управляющие «ворота» для другой части, что усиливает способность сети выражать сложные функции. После SwiGLU результата добавляется резидуальное соединение (skip connection) из Stage 1. (Как будто тоже не сильно лучше чем DCN с которым они сравниваются)
Таким образом, Stage 2 фактически реализует улучшенный FFN-трансформер (с GLU вместо ReLU), получающий на вход уже сочетание исходных признаков и осмысленных вниманиями представлений. Благодаря такому устройству, MFFN позволяет модели эффективно захватывать сложные нелинейные взаимодействия между эмбеддингами признаков и историей, одновременно избегая затухания градиента за счёт skip-коннектов на каждой стадии.
В остальном архитектура FuXi-α следует шаблону авторегрессивного трансформера: выход нескольких FuXi-блоков (AMS + MFFN) преобразуется в распределение на следующий объект через умножение на транспонированную матрицу эмбеддингов и softmax на выходном слое. Обучается модель по задаче прогнозирования следующих элементов последовательности (next-item prediction) с использованием loss-функции sampled softmax (семплирование негативных примеров для ускорения).
НО! Все их результаты они приводят на мувиленсе (вообще не смотрим на него) и на куайранд (относительно небольшой датасет музыки). Имеются вопросики к честной оценке и выборе датасетов, но идея неплохая.
Please open Telegram to view this post
VIEW IN TELEGRAM
Вчера в ИТМО проходила защита дипломов — успешно защитил свою магистерскую на тему применения LLM в рекоме.
Скоро мою коллекцию пополнит красный диплом магистра и останется Last Dance до аспиранта и кандидата технических наук.
За время в магистратуре я попробовал себя и в стартап проектах, и в науке. Особенно круто было рисерчить статью с Ильей Макаровым и Никитой Севериным, надеюсь на продолжение. Для остальных все так-же открыт к call for collaboration
Всем остальным желаю удачи в экзаменах и поступлении
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Рекомендации, Поиск и Путешествия (Sasha Petrov)
Я уже упоминал, что нашу (с Крейгом Макдональдом и Николой Тонеллотто) статью приняли на SIGIR — топовую конференцию по информационному поиску и рекомендациям (CORE A*).
📄 Теперь препринт доступен на arXiv:
https://arxiv.org/abs/2505.00560
📝 Статья: Efficient Recommendation with Millions of Items by Dynamic Pruning of Sub-Item Embeddings
Авторы: Aleksandr V. Petrov (University of Glasgow), Craig Macdonald (University of Glasgow), Nicola Tonellotto (University of Pisa)
Вот основные идеи статьи:
---
1️⃣ Большой каталог - большая проблема.
Современные рекомендательные модели, разрабатываемые в академии, обычно тестируются на небольших датасетах (несколько тысяч айтемов), но в реальных системах каталог может содержать миллионы айтемов.
2️⃣ Сложности при большом каталоге:
- Трудно обучать модели (дорогой софтмакс),
- Огромные эмбеддинг-матрицы,
- Медленный инференс.
В этой статье, мы сосредоточились именно на ускорении инференса.
3️⃣ Почему медленно?
Обычно, чтобы найти Top-K айтемов, нужно отскорить все айтемы для каждого пользователя; но это может быть очень долго в случае большого каталога. Поэтому важно придумать способ не считать скоры для всего каталога.
4️⃣ Что делают сейчас:
Применяются схемы типа Retrieve-then-Rerank (двухэтапные модели, kNN и т.д.), но они могут пропустить релевантные айтемы на этапе кандидатогенерации, то есть они небезопасны.
5️⃣ Что делаем мы:
Предлагаем безопасный метод, который гарантирует, что мы найдём Top-K айтемов с самыми высокими скорами.
6️⃣ На чём основан метод:
Мы используем RecJPQ — айтемы представлены через наборы sub-item ID, которыми могут делиться разные айтемы. Похоже на Google Semantic ID, но у нас они строятся из коллаборативной информации. C Semantic ID наш метод скорее всего тоже заведется.
7️⃣ Зачем это нужно:
Скор айтема — это сумма скоров его sub-items. Их меньше, чем самих айтемов → можно заранее посчитать скоры sub-items, а потом быстро собрать скоры айтемов.
---
8️⃣ Что интересного мы заметили:
Если sub-item имеет высокий скор, то и айтемы, в которые он входит, часто тоже хорошие. Поэтому мы сначала скорим такие айтемы.
9️⃣ Как это работает:
Скорим айтемы в порядке убывания "обещающего потенциала". Одновременно считаем, насколько хорошие айтемы ещё могут остаться. Если точно знаем, что оставшиеся не попадут в Top-K — останавливаемся.
🔟 В итоге:
Находим Top-K без kNN и без полного прохода по каталогу. Даже на миллионных каталогах — это занимает миллисекунды без использования GPU. Для сравнения, стандартный скоринг у моделей типа SASRec или BERT4Rec в тех же условиях занимает сотни миллисекунд.
📎 Подробнее: https://arxiv.org/abs/2505.00560
📄 Теперь препринт доступен на arXiv:
https://arxiv.org/abs/2505.00560
📝 Статья: Efficient Recommendation with Millions of Items by Dynamic Pruning of Sub-Item Embeddings
Авторы: Aleksandr V. Petrov (University of Glasgow), Craig Macdonald (University of Glasgow), Nicola Tonellotto (University of Pisa)
Вот основные идеи статьи:
---
1️⃣ Большой каталог - большая проблема.
Современные рекомендательные модели, разрабатываемые в академии, обычно тестируются на небольших датасетах (несколько тысяч айтемов), но в реальных системах каталог может содержать миллионы айтемов.
2️⃣ Сложности при большом каталоге:
- Трудно обучать модели (дорогой софтмакс),
- Огромные эмбеддинг-матрицы,
- Медленный инференс.
В этой статье, мы сосредоточились именно на ускорении инференса.
3️⃣ Почему медленно?
Обычно, чтобы найти Top-K айтемов, нужно отскорить все айтемы для каждого пользователя; но это может быть очень долго в случае большого каталога. Поэтому важно придумать способ не считать скоры для всего каталога.
4️⃣ Что делают сейчас:
Применяются схемы типа Retrieve-then-Rerank (двухэтапные модели, kNN и т.д.), но они могут пропустить релевантные айтемы на этапе кандидатогенерации, то есть они небезопасны.
5️⃣ Что делаем мы:
Предлагаем безопасный метод, который гарантирует, что мы найдём Top-K айтемов с самыми высокими скорами.
6️⃣ На чём основан метод:
Мы используем RecJPQ — айтемы представлены через наборы sub-item ID, которыми могут делиться разные айтемы. Похоже на Google Semantic ID, но у нас они строятся из коллаборативной информации. C Semantic ID наш метод скорее всего тоже заведется.
7️⃣ Зачем это нужно:
Скор айтема — это сумма скоров его sub-items. Их меньше, чем самих айтемов → можно заранее посчитать скоры sub-items, а потом быстро собрать скоры айтемов.
---
8️⃣ Что интересного мы заметили:
Если sub-item имеет высокий скор, то и айтемы, в которые он входит, часто тоже хорошие. Поэтому мы сначала скорим такие айтемы.
9️⃣ Как это работает:
Скорим айтемы в порядке убывания "обещающего потенциала". Одновременно считаем, насколько хорошие айтемы ещё могут остаться. Если точно знаем, что оставшиеся не попадут в Top-K — останавливаемся.
🔟 В итоге:
Находим Top-K без kNN и без полного прохода по каталогу. Даже на миллионных каталогах — это занимает миллисекунды без использования GPU. Для сравнения, стандартный скоринг у моделей типа SASRec или BERT4Rec в тех же условиях занимает сотни миллисекунд.
📎 Подробнее: https://arxiv.org/abs/2505.00560
arXiv.org
Efficient Recommendation with Millions of Items by Dynamic Pruning...
A large item catalogue is a major challenge for deploying modern sequential recommender models, since it makes the memory footprint of the model large and increases inference latency. One...
…Но на Kaggle соревнование по рексису, участвовать я конечно не буду (Только если позовет Олег)
Всем кто будет участвовать удачи, поделитесь потом своими решениями, может пост какой сделаю
UPD медалей нет, ток деньги
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Information Retriever
Хабростатья про масштабирование рексистем и Аргуса.
Написали большую статью по мотивам недавнего выступления на Датафесте. Я постарался добавить побольше новых подробностей, интересной внутренней кухни и всего такого :)
Если вы инженер и хотите сделать в своей рексистеме что-то похожее — это лучший источник информации про Аргуса. Если пользователь (например, Яндекс Музыки / Маркета / Лавки / Алисы), то это возможность получше понять, что стоит за сформированными для вас рекомендациями :)
Статья — https://habr.com/ru/companies/yandex/articles/919058/.
Написали большую статью по мотивам недавнего выступления на Датафесте. Я постарался добавить побольше новых подробностей, интересной внутренней кухни и всего такого :)
Если вы инженер и хотите сделать в своей рексистеме что-то похожее — это лучший источник информации про Аргуса. Если пользователь (например, Яндекс Музыки / Маркета / Лавки / Алисы), то это возможность получше понять, что стоит за сформированными для вас рекомендациями :)
Статья — https://habr.com/ru/companies/yandex/articles/919058/.
Хабр
ARGUS: как масштабировать рекомендательные трансформеры
Привет! Меня зовут Кирилл Хрыльченко. Я руковожу командой, которая занимается R&D для рекомендательных технологий в Яндексе. Одна из наших основных задач — развивать...
Forwarded from Свет из чёрного ящика
Во что мы верим: Scaling Hypothesis (часть 1)
В области рекомендательных систем до сих пор существует довольно большой скепсис к масштабированию нейросетей. Мы же в команде верим, что рост вычислительной сложности алгоритмов - это путь прогресса. В этом посте попробую снизить уровень скепсиса к скейлингу в сообществе. Заметка обзорная, об отдельных тезисах и конкретных статьях поговорим в следующий раз.
Вообще я и сам 3 года назад был был большим скептиком масштабирования, особенно в рекомендательных системах. Сама идея, что для выдающегося результата надо меньше изобретать хитрые алгоритмы и больше жечь ресурсы кажется слишком глупой, чтобы работать. На практике же каждое следующее поколение моделей работает всё лучше и требует всё больше вычислений. Рекомендательные системы прошли такой же путь: от счётчиков через матричные факторизации к нейросетям.
Почему скейлинг работает? Вопрос, на который довольно много разнообразных ответов: от очень философских до инженерных (Explaining Neural Scaling Laws). Начать погружение в мир масштабирования рекомендую с 2 эссе: The Bitter Lesson и The Scaling Hypothesis. Во втором Гверн даёт классную интуицию претрейну, критикует скепткиков скейлинга, а ещё у него есть классная подборка статей про MLP "representing a possible future Bitter Lesson".
Можно не пытаться задаваться вопросом "почему", а просто наблюдать эмпирические свойства - большие модели уже давно доминируют во многих ML областях:
- NLP: Deep Learning Scaling is Predictable, Empirically, Scaling Laws for Neural Language Models
- CV: Scaling Vision Transformers
- Speech: Better speech synthesis through scaling
Выше я специально привожу статьи, в которых используются трансформеры, чтобы дополнительно усилить тезис: дело не в очень сложной, хитрой нейронной архитектуре. Да, подбор правильной функции активации может выиграть нам несколько процентов качества и мы обязательно его делаем в нашей повседневной работе, однако он никогда не улучшит модель многократно. Революционные изменения достигаются в основном через вложения компьюта, причём даже в весьма простую архитектуру.
"Тупое" изменение гипрепараметров конфига на самом деле представляет из себя нетривиальную инженерную задачу. Каждый следующий порядок размера вызывает следующего порядка сложности, которые приходится преодолевать. Кроме того, масштабируемость архитектуры надо ещё обеспечить: сформулировать правильную оптимизационную задачу, сформировать датасет. Об этом поговорим во второй части заметки.
В области рекомендательных систем до сих пор существует довольно большой скепсис к масштабированию нейросетей. Мы же в команде верим, что рост вычислительной сложности алгоритмов - это путь прогресса. В этом посте попробую снизить уровень скепсиса к скейлингу в сообществе. Заметка обзорная, об отдельных тезисах и конкретных статьях поговорим в следующий раз.
Вообще я и сам 3 года назад был был большим скептиком масштабирования, особенно в рекомендательных системах. Сама идея, что для выдающегося результата надо меньше изобретать хитрые алгоритмы и больше жечь ресурсы кажется слишком глупой, чтобы работать. На практике же каждое следующее поколение моделей работает всё лучше и требует всё больше вычислений. Рекомендательные системы прошли такой же путь: от счётчиков через матричные факторизации к нейросетям.
Почему скейлинг работает? Вопрос, на который довольно много разнообразных ответов: от очень философских до инженерных (Explaining Neural Scaling Laws). Начать погружение в мир масштабирования рекомендую с 2 эссе: The Bitter Lesson и The Scaling Hypothesis. Во втором Гверн даёт классную интуицию претрейну, критикует скепткиков скейлинга, а ещё у него есть классная подборка статей про MLP "representing a possible future Bitter Lesson".
Можно не пытаться задаваться вопросом "почему", а просто наблюдать эмпирические свойства - большие модели уже давно доминируют во многих ML областях:
- NLP: Deep Learning Scaling is Predictable, Empirically, Scaling Laws for Neural Language Models
- CV: Scaling Vision Transformers
- Speech: Better speech synthesis through scaling
Выше я специально привожу статьи, в которых используются трансформеры, чтобы дополнительно усилить тезис: дело не в очень сложной, хитрой нейронной архитектуре. Да, подбор правильной функции активации может выиграть нам несколько процентов качества и мы обязательно его делаем в нашей повседневной работе, однако он никогда не улучшит модель многократно. Революционные изменения достигаются в основном через вложения компьюта, причём даже в весьма простую архитектуру.
"Тупое" изменение гипрепараметров конфига на самом деле представляет из себя нетривиальную инженерную задачу. Каждый следующий порядок размера вызывает следующего порядка сложности, которые приходится преодолевать. Кроме того, масштабируемость архитектуры надо ещё обеспечить: сформулировать правильную оптимизационную задачу, сформировать датасет. Об этом поговорим во второй части заметки.
Возможно, вы часто слышите про масштабирование рекомендательных систем, но откуда весь хайп вокруг этого? Кажется вполне логичным высказывание если обучим модель на больших данных, то получим лучшее качество. Но кажется что не все так просто, как на первый взгляд.
И в итоге мы получим три параметра в формуле масштабирования:
Эти законы были впервые систематически описаны в контексте трансформеров в статье OpenAI:
Они показали, что loss моделей убывает как степенная функция от размера модели, данных и compute.
Да и в общем-то в LLM, кажется логичным фурор над self attention и трансформерами, данные повсюду, и они бесплатные бери да пользуйся. Именно поэтому scaling law часто обсуждается в контексте трансформеров. Трансформеры оказались архитектурой, которая масштабируется очень хорошо.
В общем-то в сообществе RecSys посмотрели на это и подумали, а можем ли мы сделать тоже самое? И тут мы сталкиваемся со проблемами:
Ну вот у нас есть sasrec, bert4rec, any transformer, которые вполне справляются, но несравнимы по объему даже с самой маленький LLM.
Получится ли нам решить проблему масштабирования или нет? Оставлю открытую концовку для ваших комментов
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Свет из чёрного ящика
OneRec разбор (часть 1): общая архитектура
Общая архитектура модели: генеративный encoder-decoder трансформер. На входе описание пользователя, на выходе semantic ids - специальные рекомендательные токены. Вообще специализированная токенизация - важная часть мультмодальных LLM. В рекомендациях была впервые введена в TIGER. В OneRec реализуется собственная модификаций токенизации, о которой поговорим в другой раз.
Encoder-decoder не очень частый выбор для рекомендательных трансформеров. Мы в команде последние несколько лет применяли encoder (bidirectional attention, все входы видят друг друга). Сейчас, с появлением Argus, стали использовать decoder (авторегрессивный, каждый токен видит только своё прошлое). Обычно в рекомендациях используется impression level обучение - количество обучающих сэмплов равно числу запросов за рекомендацией. Подход с каузальной маской позволяет "сжимать" большое число сэмплов в один, уменьшая сложность обучения с
Выбор архитектуры, похоже, продиктован 2 соображениями: облегчением инференса и несовпадением форматов входа и выхода.
В encoder используется
Вход и выход модели значительно отличаются. Если на выходе semantic ids, то на входе события описываются целым набором фич. Мы формируем входы в трансформер похожим способом (Personalized Transformer-based Ranking for e-Commerce at
Yandex). В OneRec сжимают историю через несколько маршрутов: 20 самых свежих соыбтий, 256 позитивных, а также 100000 longterm, которые предварительно кластеризуются в 2000, а затем сжимаются в 128 с помощью QFormer (идея вдохновлена TWIN V2 от тех же Kuaishou).
Оба подхода вносят inductive bias и не очень сильно мне нравятся, в долгосрочной перспективе хочется от них уйти.
Представление событий в виде набора фич делает наш "токен" очень "богатым", а хотелось бы просто разделить задачу на максимально примитивные кусочки и позволить модели "правильно" их скомбинировать: item-action схема из Actions..., context-item-action из Argus и Semantic ids двигают модель именно в таком направлении.
Набор событий в историю позволяет использовать техники сжатия (в авторегрессивном формате применить их не получится), однако возвращает обучение в impression level, значительно замедляя тренировку. Побороть несовпадение входа и выхода можно с помощью каких-нибудь interleaved схем (Sparse Meets Dense: Unified Generative Recommendations with Cascaded Sparse-Dense Representations). Поддержать же длинный контекст в проде тяжело. Не только из-за долгого инференса, но и из-за значительных проблем на уровне хранилища и процессинга.
Интересный факт, который расходится с моей интуицией: авторы утверждают, что события на входе в трансформер можно описывать только с помощью semantic ids, отказавшись от стандартных sparse ids и больших матриц эмбеддингов для документов. У трансформера "память" находится в feed-forward слоях (Transformer Feed-Forward Layers Are Key-Value Memories), которых, как мне казалось, не должно хватать с учётом пока ещё скромных размеров модели. На наших внутренних замерах результат предварительно подтверждается, но будем перепроверять.
Общая архитектура модели: генеративный encoder-decoder трансформер. На входе описание пользователя, на выходе semantic ids - специальные рекомендательные токены. Вообще специализированная токенизация - важная часть мультмодальных LLM. В рекомендациях была впервые введена в TIGER. В OneRec реализуется собственная модификаций токенизации, о которой поговорим в другой раз.
Encoder-decoder не очень частый выбор для рекомендательных трансформеров. Мы в команде последние несколько лет применяли encoder (bidirectional attention, все входы видят друг друга). Сейчас, с появлением Argus, стали использовать decoder (авторегрессивный, каждый токен видит только своё прошлое). Обычно в рекомендациях используется impression level обучение - количество обучающих сэмплов равно числу запросов за рекомендацией. Подход с каузальной маской позволяет "сжимать" большое число сэмплов в один, уменьшая сложность обучения с
O(n^3)
до O(n^2)
, где n - число событий на пользователя (эффект хорошо описан в Actions...). Выбор архитектуры, похоже, продиктован 2 соображениями: облегчением инференса и несовпадением форматов входа и выхода.
В encoder используется
ffw_hidden_dim = 2 * hidden_dim
. Такой выбор параметров я встречаю первый раз. В оригинальном Attention Is All You Need использовали 4
, сейчас чаще всего встречается 2/3 × 4
(LLaMA: Open and Efficient Foundation Language Models). В 0.9b версии добавляют MoE в decoder, а в 2.6b ещё и в encoder. Концепция MoE, которая уже довольно широко применяется в LLM, мне видится перспективной, будем обязательно пробовать. Наличие MoE у самых больших версий OneRec дополнительно объясняет некоторое затухание scaling law, которое прослеживается на их графиках.Вход и выход модели значительно отличаются. Если на выходе semantic ids, то на входе события описываются целым набором фич. Мы формируем входы в трансформер похожим способом (Personalized Transformer-based Ranking for e-Commerce at
Yandex). В OneRec сжимают историю через несколько маршрутов: 20 самых свежих соыбтий, 256 позитивных, а также 100000 longterm, которые предварительно кластеризуются в 2000, а затем сжимаются в 128 с помощью QFormer (идея вдохновлена TWIN V2 от тех же Kuaishou).
Оба подхода вносят inductive bias и не очень сильно мне нравятся, в долгосрочной перспективе хочется от них уйти.
Представление событий в виде набора фич делает наш "токен" очень "богатым", а хотелось бы просто разделить задачу на максимально примитивные кусочки и позволить модели "правильно" их скомбинировать: item-action схема из Actions..., context-item-action из Argus и Semantic ids двигают модель именно в таком направлении.
Набор событий в историю позволяет использовать техники сжатия (в авторегрессивном формате применить их не получится), однако возвращает обучение в impression level, значительно замедляя тренировку. Побороть несовпадение входа и выхода можно с помощью каких-нибудь interleaved схем (Sparse Meets Dense: Unified Generative Recommendations with Cascaded Sparse-Dense Representations). Поддержать же длинный контекст в проде тяжело. Не только из-за долгого инференса, но и из-за значительных проблем на уровне хранилища и процессинга.
Интересный факт, который расходится с моей интуицией: авторы утверждают, что события на входе в трансформер можно описывать только с помощью semantic ids, отказавшись от стандартных sparse ids и больших матриц эмбеддингов для документов. У трансформера "память" находится в feed-forward слоях (Transformer Feed-Forward Layers Are Key-Value Memories), которых, как мне казалось, не должно хватать с учётом пока ещё скромных размеров модели. На наших внутренних замерах результат предварительно подтверждается, но будем перепроверять.