Головна▸Статті▸Reinforcement Learning

Контекстні бандити

Онлайн навчання з компромісами exploration-exploitation - Thompson Sampling, UCB та виробничі системи персоналізації.

mysimulator teamОновлено 2026-01≈ 4 хв читання▶ Open the simulation

Контекстні бандити навчаються оптимальним діям в реальному часі, балансуючи exploration (спробування нових опцій) з exploitation (використання відомих найкращих опцій). На відміну від A/B тестів які вимагають фіксованих призначень, бандити адаптуються безперервно. На відміну від повного RL, бандити не розглядають довгострокові наслідки - лише негайні нагороди. Це робить їх практичними для персоналізації, рекомендацій та оптимізації.

Де використовується

Контекстні бандити забезпечують адаптивні системи в різних індустріях:

Продукти: 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 Негайна до годин

Що ви робите на практиці

  1. Визначте проблему - Які дії, яка нагорода, який контекст?
  2. Оберіть алгоритм - Thompson Sampling, UCB або neural
  3. Імплементуйте exploration - Забезпечте достатній exploration
  4. Обробіть затриманий feedback - Нагороди можуть прийти пізніше
  5. Побудуйте serving інфраструктуру - Рішення з низькою латентністю
  6. Логуйте все - Дії, контексти, нагороди для аналізу
  7. Оцініть офлайн - Counterfactual evaluation
  8. Деплойте обережно - Почніть з високого exploration
  9. Моніторте продуктивність - Regret, reward, arm pulls
  10. Ітеруйте - Додайте фічі, налаштуйте 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 рішень Налаштування

Типові помилки та чек-лист

Чек-лист для продакшену

Перед деплоєм: - [ ] Офлайн оцінка з 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

Пов'язані сторінки

Додаткові матеріали

Спробуйте наживо

Дослідіть пов'язану модель на практиці: відкрийте A/B Test Optimizer — UCB1 Multi-Armed Bandit Live і змінюйте параметри під час роботи. Усе лишається у вашому браузері.

▶ Відкрити симуляцію A/B Test Optimizer — UCB1 Multi-Armed Bandit Live

Що ви знайшли?

Додати кроки відтворення (опційно)