Идея: разделить запрос и каталог
Суть two-tower model — сделать так, чтобы поиск похожих товаров для пользователя был быстрым при любом размере каталога. Для этого пользователь и товар кодируются раздельно в один и тот же векторный space. Релевантность измеряется через скалярное произведение (или косинусное сходство) векторов.
Ключевое свойство: товарные векторы вычисляются один раз и хранятся в векторной базе данных. Для онлайн-запроса нужно только вычислить вектор пользователя и выполнить ANN-поиск — это занимает миллисекунды независимо от размера каталога.
query_vec = user_tower(user_features)
candidate_vecs = item_tower(item_features) ← предвычислено
scores = dot_product(query_vec, candidate_vecs)
top_k = ANN_search(query_vec, index)
Архитектура и обучение
Каждая башня — нейронная сеть произвольной архитектуры. Стандартный вариант: несколько полносвязных слоёв (MLP) поверх входных признаков. Для истории взаимодействий пользователя используют mean pooling эмбеддингов или трансформер.
Модель обучается на парах взаимодействий. Наиболее распространённый подход — in-batch negatives: для каждого позитивного примера (пользователь, купленный товар) в качестве негативов берут все остальные товары в батче. Это дёшево и достаточно эффективно при большом размере батча.
| Компонент | Пример для e-commerce |
|---|---|
| User tower вход | История последних N товаров, категории интереса, RFM-признаки |
| Item tower вход | ID товара, категория, текстовый эмбеддинг названия, цена, бренд |
| Loss function | In-batch softmax, BPR (Bayesian Personalized Ranking) |
| Метрика качества | Recall@K, NDCG@K |
Двухэтапная архитектура: retrieval + ranking
Two-tower model обычно работает на первом этапе — candidate retrieval: отобрать тысячи кандидатов из миллионного каталога за миллисекунды. На втором этапе более сложная модель (gradient boosting или reranking-сеть) ранжирует кандидатов с учётом дополнительных признаков.
Такое разделение позволяет применять тяжёлые модели к малому числу кандидатов и избегать пересчёта всего каталога на каждый запрос.
Совет: при холодном старте для нового товара (item cold start) two-tower выигрывает у матричной факторизации — товарная башня использует текстовые атрибуты, не требующие истории взаимодействий. Для нового пользователя — аналогично через контекстные признаки.