Learning to Rank (LTR) використовує машинне навчання для впорядкування результатів пошуку за релевантністю. На відміну від класифікації чи регресії, LTR оптимізує порядок елементів безпосередньо. Це основа пошукових систем, рекомендаційних систем та будь-якого застосування, де показ найкращих елементів першими має значення.
Де це використовується
LTR необхідний всюди, де порядок результатів впливає на досвід користувача:
- Веб-пошук: Google, Bing, DuckDuckGo
- E-commerce: Пошук товарів та рекомендації
- Платформи працевлаштування: Матчинг вакансій та кандидатів
- Стрімінг: Впорядкування контенту Netflix, Spotify
- Соціальні мережі: Ранжування стрічки, discovery контенту
- Корпоративні: Пошук документів, бази знань
Продукти: Elasticsearch LTR, Solr LTR, TensorFlow Ranking, XGBoost rankers.
Типові дані
| Аспект | Типові значення |
|---|---|
| Запитів на день | 10K-1B |
| Кандидатів на запит | 100-10,000 |
| Фіч на елемент | 50-500 |
| Мітки релевантності | Бінарні, градації (0-4), або клік-дані |
| Розмір тренувального набору | 100K-100M пар запит-елемент |
Джерела даних: - Логи запитів з кліками та конверсіями - Людські оцінки релевантності - Implicit feedback (час на сторінці, скроли) - Фічі елементів (текст, категорії, популярність) - Фічі запитів (терми, інтент, контекст)
Що ви робите на практиці
- Визначте успіх - Що робить ранжування хорошим? CTR? Конверсії?
- Зберіть тренувальні дані - Клік-логи, людські мітки, або обидва
- Згенеруйте кандидатів - Початковий ретривал (BM25, embedding search)
- Витягніть фічі - Query-item, query-only, item-only фічі
- Оберіть підхід - Pointwise, pairwise, або listwise
- Натренуйте ранкер - Оптимізуйте метрику ранжування
- Оцініть offline - NDCG, MAP, MRR на held-out даних
- A/B тест online - Порівняйте з бейзлайном на реальному трафіку
- Моніторте та ітеруйте - Відстежуйте метрики, оновлюйте моделі
Спочатку бейзлайн
Почніть з BM25 або простого скорінгу перед ML ранжуванням:
# BM25 бейзлайн
from rank_bm25 import BM25Okapi
tokenized_docs = [doc.split() for doc in documents]
bm25 = BM25Okapi(tokenized_docs)
scores = bm25.get_scores(query.split())
ranked_docs = sorted(zip(documents, scores), key=lambda x: -x[1])
Чому спочатку бейзлайн: - Встановлює floor продуктивності - Швидко реалізувати - Часто напрочуд конкурентний - Допомагає зрозуміти де ML допомагає найбільше
Переходьте до ML ранжування коли обмеження бейзлайну очевидні (персоналізація, складна релевантність).
Підходи до ранжування
| Підхід | Тип Loss | Плюси | Мінуси |
|---|---|---|---|
| Pointwise | Регресія/класифікація релевантності | Простий, швидкий | Ігнорує структуру списку |
| Pairwise | Порівнює пари (який кращий?) | Природний для кліків | Не оптимізує метрику списку |
| Listwise | Оптимізує метрику рівня списку | Найкраща відповідність метриці | Складний, повільніший |
Поширені моделі:
| Модель | Тип | Примітки |
|---|---|---|
| LambdaMART | Pairwise/listwise | Індустріальний стандарт, gradient boosting |
| LambdaRank | Pairwise | На основі нейронних мереж |
| ListNet | Listwise | Розподіл ймовірностей над перестановками |
| RankNet | Pairwise | Нейронне pairwise порівняння |
| BERT-based | Різні | Cross-encoder для реранкінгу |
Приклад LambdaMART з LightGBM:
import lightgbm as lgb
train_data = lgb.Dataset(
X_train, y_train,
group=query_groups, # Кількість елементів на запит
)
params = {
'objective': 'lambdarank',
'metric': 'ndcg',
'ndcg_eval_at': [5, 10],
'num_leaves': 31,
'learning_rate': 0.05
}
model = lgb.train(params, train_data, num_boost_round=100)
Feature Engineering
Фічі ранжування поділяються на три категорії:
| Категорія | Приклади |
|---|---|
| Query фічі | Довжина запиту, інтент запиту, частота запиту |
| Item фічі | Популярність, новизна, категорія, ціна |
| Query-item фічі | BM25 score, embedding similarity, історія кліків |
Поширені фічі: - Text match scores (BM25, TF-IDF) - Семантична схожість (embedding dot product) - Сигнали популярності (перегляди, кліки, покупки) - Свіжість (вік контенту) - Сигнали якості (рейтинги, відгуки) - Персоналізація (історія користувача з елементом/категорією) - Фічі position bias (для дебіасінгу)
Поради з feature engineering: - Комбінуйте текстові та behavioral фічі - Включайте position-aware фічі якщо використовуєте клік-дані - Log-трансформуйте count фічі - Створюйте query-specific агрегати (avg price clicked)
Оцінка та метрики
| Метрика | Що вимірює | Діапазон |
|---|---|---|
| NDCG@k | Якість ранжування з градаційною релевантністю | 0-1 |
| MAP | Precision на кожному релевантному елементі | 0-1 |
| MRR | Позиція першого релевантного результату | 0-1 |
| Precision@k | Частка релевантних у топ k | 0-1 |
| Recall@k | Частка релевантних елементів у топ k | 0-1 |
NDCG (Normalized Discounted Cumulative Gain):
DCG@k = Σ (2^rel_i - 1) / log2(i + 1) для i в 1..k
NDCG@k = DCG@k / IDCG@k (де IDCG - ідеальний DCG)
Offline vs online оцінка: - Offline: Тест на held-out розмічених даних - Online: A/B тест на реальних користувачах - Interleaving: Змішування результатів двох ранкерів
Пастки: - Position bias у клік-даних - Offline метрики можуть не корелювати з online - Потрібен stratified train/test split по запитах
Режими відмов та чеклист налагодження
- [ ] Position bias: Кліки фаворизують верхні позиції незалежно від релевантності
- [ ] Cold start: Нові елементи не мають behavioral фіч
- [ ] Query drift: Запити користувачів змінюються з часом
- [ ] Feature leakage: Використання майбутньої інформації у фічах
- [ ] Overfitting на кліки: Модель вчить bias, не релевантність
- [ ] Колапс diversity: Всі топ результати занадто схожі
- [ ] Latency: Складні моделі занадто повільні для real-time
Чеклист для продакшну
Перед деплоєм: - [ ] Offline метрики значно б'ють бейзлайн - [ ] Затримка моделі прийнятна (p99 < SLA) - [ ] Feature pipeline протестований end-to-end - [ ] A/B тест фреймворк готовий - [ ] Фолбек до бейзлайну якщо модель падає
Після деплою: - [ ] Online метрики відстежуються (CTR, конверсії) - [ ] Свіжість моделі підтримується (розклад ретренінгу) - [ ] Feature drift моніториться - [ ] Edge cases логуються (нуль результатів, повільні запити) - [ ] Position bias корекція застосована якщо використовуються кліки
Масштабування: - [ ] Two-stage ранжування (ретривал → реранкінг) - [ ] Кешування фіч для hot елементів - [ ] Квантизація моделі для latency - [ ] Query сегментація для різних моделей
Two-Stage архітектура ранжування
Більшість продакшн-систем використовують два етапи:
Запит → Candidate Retrieval (1000s) → Екстракція фіч →
ML Reranker (top 100) → Бізнес-правила → Фінальні результати (10-20)
Етап 1 - Retrieval: - Швидкий, наближений (BM25, ANN) - Високий recall, нижчий precision - Повертає сотні-тисячі
Етап 2 - Reranking: - Повільніший, точний ML модель - Бере top-k з ретривалу - Оптимізує якість ранжування
Інструменти та стек
| Категорія | Інструменти |
|---|---|
| Gradient boosting | LightGBM, XGBoost, CatBoost |
| Deep learning | TensorFlow Ranking, PyTorch |
| Інтеграція з пошуком | Elasticsearch LTR, Solr LTR |
| Оцінка | RankLib, кастомні метрики |
| Feature stores | Feast, Tecton |
Приклад міні-кейсу
Сценарій: E-commerce сайт хоче покращити пошук товарів поза keyword matching.
Підхід: 1. Бейзлайн: Elasticsearch BM25 - NDCG@10: 0.45 2. Збір клік-даних: 2M пошукових сесій за 3 місяці 3. Position debias: Inverse propensity weighting 4. Фічі: BM25, embedding similarity, популярність, ціна, відгуки 5. Модель: LambdaMART через LightGBM 6. Результати: NDCG@10: 0.62 (+38% vs бейзлайн)
Продакшн-архітектура:
Запит → Elasticsearch (top 500) → Feature service →
LightGBM reranker → Diversity фільтр → Top 50
Результати A/B тесту: - CTR: +8% - Додавання в кошик: +5% - Дохід на пошук: +3%
Ключові уроки: - Click debiasing критичний для якості моделі - Фічі популярності домінували спочатку (потрібна регуляризація) - Real-time фічі (контекст сесії) додали +2% CTR
Пов'язані сторінки
- Індекс: ML Field Guide
- Системи семантичного пошуку
- Collaborative Filtering
- A/B тестування для ML
Додаткове читання
- Learning to Rank: From Pairwise Approach to Listwise
- TensorFlow Ranking
- LightGBM LambdaRank
- Elasticsearch Learning to Rank
Спробуйте наживо
Дослідіть пов'язану модель на практиці: відкрийте Retrieval Evaluation and Reranking Lab і змінюйте параметри під час роботи. Усе лишається у вашому браузері.
▶ Відкрити симуляцію Retrieval Evaluation and Reranking Lab