Контекстні бандити навчаються оптимальним діям в реальному часі, балансуючи exploration (спробування нових опцій) з exploitation (використання відомих найкращих опцій). На відміну від A/B тестів які вимагають фіксованих призначень, бандити адаптуються безперервно. На відміну від повного RL, бандити не розглядають довгострокові наслідки - лише негайні нагороди. Це робить їх практичними для персоналізації, рекомендацій та оптимізації.
Де використовується
Контекстні бандити забезпечують адаптивні системи в різних індустріях:
- Рекомендації: Персоналізований контент, пропозиції продуктів
- Реклама: Вибір реклами, оптимізація креативів
- Ціноутворення: Рішення динамічного ціноутворення
- Охорона здоров'я: Вибір лікування, клінічні випробування
- Новини: Персоналізація статей, тестування заголовків
- UX: Оптимізація макетів, впровадження функцій
Продукти: Netflix (персоналізація постерів), Spotify (генерація плейлистів), новинні стрічки, рекламні платформи.
Проблема бандитів
Multi-armed bandit: Вибір між K arms (опціями), спостереження нагороди, максимізація кумулятивної нагороди.
Contextual bandit: Те саме, але ви бачите контекст (фічі користувача) перед вибором.
Контекст x → Агент обирає дію a → Спостереження нагороди r
↓
Оновлення політики для максимізації майбутніх нагород
Ключовий компроміс: Exploration vs Exploitation - Exploitation: Вибір дії яка здається найкращою зараз - Exploration: Спроба дій щоб дізнатися більше про них
Занадто багато exploitation → пропуск кращих опцій Занадто багато exploration → витрата можливостей на погані опції
Типові дані
| Аспект | Типові значення |
|---|---|
| Дії (arms) | 2 до 1000+ |
| Context features | 10 до 100 |
| Нагороди | Binary (клік) або continuous |
| Трафік | 1K до 1M рішень/день |
| Затримка feedback | Негайна до годин |
Що ви робите на практиці
- Визначте проблему - Які дії, яка нагорода, який контекст?
- Оберіть алгоритм - Thompson Sampling, UCB або neural
- Імплементуйте exploration - Забезпечте достатній exploration
- Обробіть затриманий feedback - Нагороди можуть прийти пізніше
- Побудуйте serving інфраструктуру - Рішення з низькою латентністю
- Логуйте все - Дії, контексти, нагороди для аналізу
- Оцініть офлайн - Counterfactual evaluation
- Деплойте обережно - Почніть з високого exploration
- Моніторте продуктивність - Regret, reward, arm pulls
- Ітеруйте - Додайте фічі, налаштуйте exploration
Базова лінія: Epsilon-Greedy
Найпростіша стратегія exploration:
import numpy as np
class EpsilonGreedy:
def __init__(self, n_actions, epsilon=0.1):
self.n_actions = n_actions
self.epsilon = epsilon
self.counts = np.zeros(n_actions)
self.values = np.zeros(n_actions)
def select_action(self, context=None):
if np.random.random() < self.epsilon:
return np.random.randint(self.n_actions) # Explore
return np.argmax(self.values) # Exploit
def update(self, action, reward):
self.counts[action] += 1
# Інкрементне оновлення середнього
self.values[action] += (reward - self.values[action]) / self.counts[action]
Алгоритми бандитів
| Алгоритм | Опис | Переваги | Недоліки |
|---|---|---|---|
| Epsilon-Greedy | Випадковий exploration ε% часу | Простий | Фіксований exploration |
| UCB | Upper Confidence Bound | Принциповий | Припускає обмежені нагороди |
| Thompson Sampling | Семплювання з posterior | Часто найкращий | Потрібен prior |
| LinUCB | Linear contextual UCB | Використовує контекст | Лінійне припущення |
| Neural Bandit | Deep learning + exploration | Гнучкий | Складний |
Thompson Sampling (рекомендований):
import numpy as np
from scipy.stats import beta
class ThompsonSampling:
def __init__(self, n_actions):
self.n_actions = n_actions
# Параметри Beta розподілу (успіхи, невдачі)
self.alpha = np.ones(n_actions)
self.beta = np.ones(n_actions)
def select_action(self, context=None):
# Семплювання з posterior для кожного arm
samples = [beta.rvs(self.alpha[a], self.beta[a])
for a in range(self.n_actions)]
return np.argmax(samples)
def update(self, action, reward):
# Оновлення Beta розподілу
if reward == 1:
self.alpha[action] += 1
else:
self.beta[action] += 1
LinUCB (контекстний):
import numpy as np
class LinUCB:
def __init__(self, n_actions, n_features, alpha=1.0):
self.n_actions = n_actions
self.alpha = alpha
# Матриця A та вектор b для кожної дії
self.A = [np.eye(n_features) for _ in range(n_actions)]
self.b = [np.zeros(n_features) for _ in range(n_actions)]
def select_action(self, context):
ucb_values = []
for a in range(self.n_actions):
A_inv = np.linalg.inv(self.A[a])
theta = A_inv @ self.b[a]
ucb = context @ theta + self.alpha * np.sqrt(context @ A_inv @ context)
ucb_values.append(ucb)
return np.argmax(ucb_values)
def update(self, action, context, reward):
self.A[action] += np.outer(context, context)
self.b[action] += reward * context
Метрики оцінки
| Метрика | Опис | Використання |
|---|---|---|
| Regret | Різниця з оптимальною політикою | Онлайн performance |
| CTR | Click-through rate | Бізнес метрика |
| Conversion | Конверсія | Бізнес метрика |
| Exploration rate | % exploration рішень | Налаштування |
Типові помилки та чек-лист
- [ ] Недостатній exploration: Застрягання на субоптимальних arms
- [ ] Delayed rewards: Не враховано затримку feedback
- [ ] Context drift: Контекст змінюється з часом
- [ ] Cold start: Нові arms без даних
- [ ] Logging policy: Неправильний запис рішень
Чек-лист для продакшену
Перед деплоєм: - [ ] Офлайн оцінка з counterfactual методами - [ ] Serving інфраструктура з низькою латентністю - [ ] Логування всіх контекстів та рішень - [ ] Fallback для нових arms
Після деплою: - [ ] Моніторинг regret та reward - [ ] Відстеження exploration rate - [ ] A/B тест проти baseline - [ ] Регулярне перенавчання
Інструменти та стек
| Категорія | Інструменти |
|---|---|
| Бібліотеки | Vowpal Wabbit, Contextual, RecoGym |
| Платформи | AWS Personalize, Azure Personalizer |
| Serving | Real-time feature stores |
Приклад міні-кейсу
Сценарій: Персоналізація постерів фільмів.
Підхід: - Thompson Sampling з фічами користувача - 10 варіантів постерів на фільм - Reward = клік на фільм
Результати: - 12% покращення CTR - Конвергенція за 2 тижні - 5% трафіку на exploration
Пов'язані сторінки
- Індекс: ML Field Guide
- A/B тестування
- Рекомендаційні системи
Додаткові матеріали
Спробуйте наживо
Дослідіть пов'язану модель на практиці: відкрийте A/B Test Optimizer — UCB1 Multi-Armed Bandit Live і змінюйте параметри під час роботи. Усе лишається у вашому браузері.
▶ Відкрити симуляцію A/B Test Optimizer — UCB1 Multi-Armed Bandit Live