Недавно я прочитал статью от людей из TikTok под названием Глубокий поиск: изучение извлекаемой структуры для крупномасштабных рекомендаций.

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

Обычно для генерации кандидатов используется модель внутреннего продукта (подобная модели, полученной в результате изучения метрик), за которой следует ИНС (приблизительный ближайший сосед; популярный вариант — FAISS).

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

Авторы обучают модель с D-слоями. Каждый слой состоит из MLP с функцией softmax для K узлов, которая выводит вероятность принадлежности к одному из K кластеров. Входными данными для слоя D1 является встраивание пользователя (встраивание учитывает его предыдущие действия, а рекуррентная нейронная сеть с ГРУ используется для проецирования последовательности поведения на встраивание фиксированного размера в качестве входных данных). Цель — это кластер элемента, с которым пользователь взаимодействовал (например, щелкнул или купил). Выход D1, назовем его K1, затем объединяется с пользовательским внедрением и используется в качестве входных данных для D2. Выход K2 затем объединяется с K1 и пользовательским внедрением и используется в качестве входа для D3.

У любого пользователя потенциально есть K^D разных путей. Например, если имеется 30 кластеров и три слоя, модель может вывести следующий путь для пользователя X: 1–10–15, что означает кластер 1 среди первых 30, кластер 10 среди следующих 30 и кластер 15 среди следующих. 30. Кроме того, поскольку у нас есть распределение, мы можем пойти глубже и взять топ-3 из каждого слоя, что приведет к n^D (в нашем случае 27) разных путей вместо исходного. Поскольку мы тренируемся на взаимодействии пользователя с элементом, мы можем получить пути как для пользователя, так и для элемента.

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

На самом деле это одно из преимуществ по сравнению с глубокими моделями на основе дерева.

Резонный вопрос: как определить начальные кластеры? Хорошо, у нас есть пользовательские встраивания и взаимодействия пользователя с элементом, но где взять метки для K? Мы можем случайным образом распределять и включать ЭМ автомат.

В первой итерации мы распределяем их случайным образом и обучаем модель; затем мы повторно обучаем сопоставление элемента с кластером, чтобы максимизировать выходные данные модели.

Как применяется глубокий поиск во время логического вывода?

  1. Вводим эмбеддинг пользователя -> получаем N путей (жадный алгоритм выдает один путь)
  2. Собираем все предметы, которые есть на этих путях
  3. Прогоняем их через промежуточный реранкер

Есть несколько дополнительных моментов.

I. Несмотря на то, что DR (Deep Retrieval) выдает значительно меньше элементов, чем все, их все равно много, поэтому он еще и обучается с реранкером выводить топ-кандидатов (это еще не финальный реранкер!)

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

III. Они добавляют штраф за добавление другого элемента (прохождение того же пути) к пути. В противном случае есть риск, что все элементы попадут в один путь, и они использовали штраф в виде c⁴/4, где c — количество элементов в пути.

III. Они обновили модель из входящего потока данных — это коснулось некоторых вещей, например шага М в EM. Они также использовали экспоненциальное затухание с коэффициентом 0,999.

Показатели

Конечно, любая бумага покажет, что они лучше, и офлайн, и онлайн, но почему-то везде низкая отзывность. Например, Recall@200 составляет около 13% — что вызывает вопросы; может если углубиться — другие алгоритмы не хуже. SOTA Recall@200 для упомянутого набора данных составляет около 28% (https://paperswithcode.com/sota/recommendation-systems-on-amazon-books)

Результаты A/B-теста представлены в виде точечной оценки, что также вызывает много вопросов, поскольку доверительные интервалы даны для офлайн-тестов, а не для онлайн-тестов.

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

Удивительно видеть сравнение наборов данных кинообъектива и книг Amazon, а затем только один A/B-тест в TikTok (а это совсем другая настройка) без доверительных интервалов и непонимания того, что конкурирующая система оставляет вопросы.