Условие
В рекомендательной системе появился новый пользователь — ни кликов, ни просмотров. Как делать ему рекомендации? Тот же вопрос для нового товара.
Решение
Подход
Cold-start — частный случай отсутствующих данных. Чисто коллаборативные модели (matrix factorization, ALS) не работают: нет векторов взаимодействий. Помогают content-based признаки и hybrid модели.
Cold-start пользователя.
- Дефолтные рекомендации: топы по бизнес-метрике (популярность, trending, новизна). Простой бейзлайн, закрывает первую сессию.
- Onboarding: спросить 3-5 предпочтений (genre, brand, language) при регистрации → starting vector в embedding-пространстве.
- Контекстные признаки: гео, устройство, время суток, источник (UTM). Модель условной популярности
P(item | context). - Контент-демография: если есть возраст/пол/локация — рекомендуем на основе профиля похожих пользователей.
Cold-start товара.
- Контентные эмбеддинги. Эмбеддинг товара из его текстового описания (BERT/sentence-transformers) или картинки (CLIP). Близкие в эмбеддинг-пространстве — кандидаты.
- Hybrid retrieval. Two-tower: одна башня — user (по истории), другая — item (по контенту). Новый товар сразу имеет вектор и попадает в кандидаты.
- Exploration. ε-greedy / Thompson sampling: 5% выдачи отдаём новым товарам, чтобы быстро набрать сигнал.
Hybrid модели.
- LightFM: учится
user_embedding = sum(user_feature_embeddings), аналогично для items — поэтому новые юзеры/айтемы сразу имеют вектор. - Wide & Deep / DCN: контентные фичи через DNN + memorization через wide-часть.
from lightfm import LightFM
from lightfm.data import Dataset
dataset = Dataset()
dataset.fit(users, items,
user_features=user_feats, item_features=item_feats)
interactions, _ = dataset.build_interactions(events)
uf = dataset.build_user_features(user_feature_rows)
itf = dataset.build_item_features(item_feature_rows)
model = LightFM(loss="warp")
model.fit(interactions, user_features=uf, item_features=itf, epochs=20)Подводные камни
- Только popularity даёт скучные рекомендации и не персонализирует — конверсия будет плоской. Используйте как floor, а не как полное решение.
- Эмбеддинги новых товаров не похожи на старые. Если CLIP/BERT обучен на «общем мире», новые товары (например, NFT, новые бренды) могут лечь странно. Проверяйте на коллекции «новинок».
- Exploration vs exploitation: слишком много exploration портит UX (юзеры видят «случайные» товары); слишком мало — новые товары умирают без сигнала. Балансируется через bandit-стратегии.
- Onboarding-флоу должен быть коротким. 20 вопросов отпугнут.
Эталонный ответ
Для новых пользователей — попсы + onboarding-предпочтения + контекстные фичи. Для новых товаров — контентные эмбеддинги (текст/картинка) + two-tower hybrid retrieval + exploration через bandit. LightFM/Wide&Deep — практические инструменты для hybrid сценария.