Как выбрать объявление из пула продвигаемых постов?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Алгоритм выбора объявления из пула продвигаемых постов
Это вопрос про рекомендательные системы и оптимизацию. Здесь важна балансировка между revenue, user experience и данными.
Контекст (уточню у интервьюера)
Предположу, что это социальная платформа (TikTok, Instagram, YouTube) с рекламой в feed'е.
Вопросы для уточнения:
- Есть ли уже пулы объявлений? (контекстные, ретаргетинг, новые?)
- Как рассчитывается стоимость постов? (CPC, CPM, CPA?)
- Какой основной KPI? (CTR, revenue, user retention?)
- Какова tolerate роль ad fraud'а на платформе?
Буду считать: платформа вроде TikTok/Instagram с миксом органических и спонсорских постов. Нужно балансировать между доходом и UX.
Подход 1: Multi-Armed Bandit (Exploration vs Exploitation)
Это классический подход для выбора из пула вариантов:
Thompson Sampling
1. Для каждого объявления: вероятность что оно "лучшее" (на основе CTR)
2. Случайная выборка из распределения
3. Показать выбранное объявление
4. Обновить posterior вероятность
5. Повторить
Плюсы:
- Автоматически исследует новые объявления
- Быстро сходится к оптимальным
- Минимизирует сожаление (regret)
Минусы:
- Может показать плохие объявления в начале
- Не учитывает контекст пользователя
Подход 2: Contextual Bandits (С учётом контекста)
Лучший вариант для социальных платформ:
Фичи контекста:
- Демография пользователя (возраст, регион, интересы)
- История взаимодействия (какие посты лайкал, игнорировал)
- Время дня, тип девайса, язык
- Семантика объявления (категория, ключевые слова)
Алгоритм выбора:
1. Отфильтровать пул объявлений:
- Только релевантные для пользователя
- Исключить показанные недавно (частота cap)
- Исключить заблокированные категории
2. Оценить score каждого объявления:
score = α × CTR + β × (bid × conversion_rate) + γ × freshness
где:
- CTR (click-through rate): историческая вероятность клика
- bid × conversion: потенциальный revenue
- freshness: как давно показывали (новые выше)
3. Добавить exploration:
- 80% показывать top объявления (exploitation)
- 20% случайное из top-10 (exploration)
4. А/Б тестирование новых креативов:
- 5% трафика на тестирование
- Если CTR > baseline + 10% → в основной пул
Подход 3: Learning-to-Rank (LTR)
Для больших пулов объявлений (100+ позиций):
Метод:
- Ранжировать объявления ML моделью
- Модель обучена на исторических данных
- Features: пользователь + объявление + контекст
- Target: CTR, конверсия, revenue
Модель (XGBoost, LightGBM):
Features:
- user_interests_similarity (косинус между векторами)
- ad_bid, ad_budget_remaining
- user_segment, seasonality
- ad_creative_freshness
- previous_interactions
Target: click_probability или revenue_expected
Вывод:
- Ранжировать top-3 объявлений
- Выбрать первое (или Random в top-3 для exploration)
Подход 4: Quality Score & Balance
Google Ads классика, применимо везде:
Quality Score = (Historical CTR + Landing Page Quality + Ad Relevance) / 3
Final Score = Quality Score × Bid
Применить:
- Исключить объявления с Quality Score < 3/10
- Приоритизировать высокое качество + хороший bid
- Штрафовать за часто пропускаемые (если много skip → lower score)
Подход 5: Real-time Optimization
Для максимизации revenue:
Expected Revenue Per Impression = P(click) × Value Per Click
Value Per Click =
- CPC (cost per click) - для pay-per-click
- CPM / 1000 × CTR - для pay-per-impression
- P(convert) × value_per_conversion - для CPA
Выбрать объявление с max Expected Revenue (с exploration):
scores = []
for ad in available_ads:
expected_revenue = predict_ctr(user, ad) × ad.value
exploration_bonus = random() < 0.1 ? 1.5 : 1.0
scores.append(expected_revenue × exploration_bonus)
selected_ad = ads[argmax(scores)]
Подход 6: Diversity & Fatigue
Предотвращение spam'а и усталости:
Frequency Cap:
- Max 3 объявления одной компании в день
- Max 5 объявлений одной категории в неделю
Diversity Score:
- Повышать score объявлений из новых категорий
- Понижать score похожих креативов
Wear-Out Tracking:
- Если пользователь часто skip объявление → lower score
- Если CTR падает со временем (объявление устарело) → ротировать
Рекомендуемый гибридный подход
Комбинирую лучшее:
1. Фильтрация:
- Релевантность по интересам пользователя
- Frequency cap (не показывали 2+ часа)
- Quality score >= 5
2. Ранжирование:
score = 0.5 × P(click) + 0.3 × Expected Revenue + 0.2 × Freshness
3. Выбор:
- Top 1 с вероятностью 0.8
- Random из top-3 с вероятностью 0.2 (exploration)
- Добавить noise (±10%) для естественности
4. Мониторинг:
- CTR, CVR, revenue по объявлениям
- User fatigue (skip rate)
- A/B test новых объявлений в 5% трафика
Метрики для оптимизации
- Click-Through Rate (CTR): базовая метрика качества
- Expected Value per Impression: revenue максимизация
- Ad Relevance Score: пользовательский опыт
- Fatigue Index: количество skip'ов (меньше лучше)
- Revenue per User: финансовый результат
- Conversion Rate: на действие (покупку, install)
Потенциальные проблемы
-
Bias в обучении: исторические данные могут быть skewed
- Решение: offline evaluation (counterfactual)
-
Fraud: click fraud от ботов
- Решение: click verification, device fingerprinting
-
Feedback loop: плохие объявления не показываются → нет данных для улучшения
- Решение: exploration budget (20% на новые объявления)
Заключение
Лучший практический подход: Contextual Bandits + LTR модель
- Балансирует user experience и revenue
- Адаптируется к новым объявлениям (exploration)
- Масштабируется на миллионы пользователей
- Использует контекст для улучшения релевантности