Многорукий бандит убирает состояния и оставляет один чистый конфликт:
потратить показ на нынешнего лидера или проверить менее изученный вариант.
Лучшее действие неизвестно, а каждое измерение уже меняет результат — потому
что измеряем мы теми же показами, которыми зарабатываем.
Пять фильмов и один бюджет показов
Витрина кинотеатра показывает посетителю одну рекомендацию. У каждого фильма
есть неизвестная нам заранее вероятность понравиться. Чтобы не выдумывать
цифры, возьмём реальный лог MovieLens 100K, тот же, на котором мы
строили рекомендации: наградой будем считать событие «зритель поставил оценку
не ниже четырёх». Пять хорошо оценённых фильмов дают пять «рук»:
Эти числа посчитаны по 583, 413, 508, 509 и 485 реальным оценкам
соответственно. Мы, читатели учебника, их видим. Алгоритм — нет: он узнаёт мир
только через отклики тех зрителей, которым сам же и показал фильм.
Доля оценок «нравится» и 95%-й интервал Уилсона для каждого фильма. Star Wars
(0,859) и Godfather (0,850) статистически неразличимы: их интервалы
(0,829;0,885) и (0,812;0,881) почти совпадают. Contact
(0,634;0,715) отделён от лидера уверенно. Разрыв — это не «правда или
ложь», а величина, которую надо ещё суметь измерить.
В стационарном K-руком бандите на каждом раунде t=1,…,T алгоритм
выбирает руку At∈{1,…,K} и получает случайную награду Rt с
условным средним
E[Rt∣At=a]=μa.
Лучшее из средних обозначим
μ∗=amaxμa,a∗=argamaxμa.
Бандит проще марковского процесса принятия решений: нет
состояния и нет влияния действия на будущую динамику среды. Но он труднее
обычного A/B-теста, потому что данные собираются адаптивно — тем самым
правилом, качество которого мы и оцениваем.
Regret: во что обходится незнание
Сравнивать алгоритм с нулём бессмысленно; сравним его с всезнающим оракулом,
который с первого раунда играет a∗. Разность накопленных ожидаемых наград и
есть regret:
RT=Tμ∗−Et=1∑TRt.
Ключевое тождество получается заменой суммы по времени на сумму по рукам.
Обозначим Δa=μ∗−μa — разрыв руки a, а Na(T) — сколько раз
она была выбрана за T раундов. Тогда
RT=a=1∑KΔaENa(T).
Формула буквально выписывает счёт: каждый показ неоптимальной руки стоит
ровно её разрыв. Ошибиться в пользу Godfather дёшево
(Δ=0,009), ошибиться в пользу Liar Liar дорого
(Δ=0,453).
Это тонкость, которую стоит проговорить: вклад руки равен произведению
ΔaNa, а хороший алгоритм выбирает её порядка logT/Δa2 раз.
Произведение ведёт себя как
Δa⋅Δa2logT=ΔalogT,
то есть растёт при уменьшении разрыва. Самые дорогие руки — не безнадёжные,
а те, что почти хороши.
Жадность и её ловушка
Простейшая политика: оценивать средние по наблюдениям
μa(t)=Na(t)1s<t:As=a∑Rs
и всегда выбирать максимум μa(t). Проблема видна сразу: оценка,
полученная по трём показам, участвует в сравнении на равных с оценкой по
трёмстам. Рука, которой один раз повезло, получает μ=1 и забирает
все дальнейшие показы. Обратной связи по остальным больше не будет — они
навсегда останутся с плохими случайными оценками.
Заметьте странность: медианный regret чистой жадности за 5000 раундов
равен всего 48 — лучше, чем у ε-жадности с ε=0,10.
Но при этом в 56,6% запусков она заперлась не на лучшей руке. Обе цифры верны
и обе важны: у нашей задачи две верхние руки почти одинаковы, поэтому «неверный»
выбор часто почти бесплатен. Если бы целью было назвать лучший вариант, а не
максимизировать сумму наград, жадность провалилась бы.
ε-жадность: постоянная плата за любопытство
Добавим случайность. С вероятностью 1−ε выбираем текущего лидера,
с вероятностью ε — случайную руку:
Это простой и честный baseline. Но его regret растёт линейно: даже когда всё
уже понятно, доля ε показов уходит наугад, и каждый такой показ
стоит в среднем
Kεa∑Δa.
Для наших пяти рук эта величина равна ε⋅0,1413: при
ε=0,1 — примерно 0,0141 потерянного отклика на каждый раунд,
и это плата навсегда.
Убывающее расписание εt∝1/t лечит линейность, но требует
подбора константы. Другой приём — оптимистичная инициализация: положить
начальные оценки заведомо завышенными (например, 1). Тогда любая непроверенная
рука выглядит привлекательно, и алгоритм сам обойдёт их все, пока оценки не
опустятся до правды.
UCB: оптимизм перед лицом неопределённости
Разумная альтернатива — сравнивать руки не по средним, а по верхним границам
того, чем они ещё могут оказаться:
At=argamax[μa(t)+cNa(t)lnt].
Первое слагаемое — найденное качество, второе — бонус неопределённости. Он
велик у редко выбранной руки и тает как 1/Na по мере накопления
данных; логарифм в числителе медленно поднимает бонус со временем, заставляя
иногда возвращаться к давно забытым вариантам.
Реальный запуск, t=200, c=2. Счётчики (62,52,49,21,16), средние
(0,871;0,846;0,816;0,571;0,438), верхние границы
(1,284;1,298;1,281;1,282;1,251). Следующий показ достаётся
Godfather, хотя его среднее ниже, чем у Star Wars: бонус за меньшее число
наблюдений перевесил. Обратите внимание на главное — верхние границы почти
сравнялись. UCB стремится к состоянию, где все руки одинаково «возможны».
Откуда берётся корень
Форма бонуса не выдумана. Для награды из [0,1] неравенство Хёфдинга даёт для
среднего по n независимым наблюдениям
Pr(μ−μ≥u)≤e−2nu2.
Приравняв правую часть к t−4 и решив относительно u, получаем
u=n2lnt,
то есть тот самый корень с c=2. Смысл выбора уровня: мы хотим, чтобы
вероятность «оптимизм оказался ложью» суммарно по всем раундам и рукам была
мала. Тогда с большой вероятностью верхняя граница лучшей руки никогда не
опускается ниже μ∗, а значит, выбор неоптимальной руки возможен лишь пока
её бонус не сжался. Приравнивая бонус к разрыву,
cNalnT≈Δa⟹Na≈Δa2c2lnT,
получаем классический результат: ожидаемое число выборов неоптимальной руки
имеет порядок logT/Δa2, а её вклад в regret — logT/Δa.
Константа решает больше, чем название
Теория говорит про порядок, практика живёт при конечном T. Прогоним на одних
и тех же реальных откликах шесть политик, 300 независимых запусков, горизонт
5000.
Медианы по 300 запускам, полосы — межквартильный размах. Итог за 5000 раундов:
Thompson sampling 35, UCB с c=0,5 — 43, чистая жадность 48,
ε=0,01 — 53, ε=0,10 — 84, UCB с c=2 — 132.
Смотреть надо не на порядок в списке, а на форму: у ε-жадности
regret за вторую половину горизонта вырос почти вдвое (отношение 1,79), у UCB
он подрос лишь в 1,53 раза и продолжает загибаться.
Осторожный UCB с теоретической константой c=2 оказался худшим: на
горизонте 5000 он всё ещё «оплачивает» проверку Liar Liar и Contact, хотя те
давно проиграли. Уменьшение константы до 0,5 снижает regret втрое. Это не
опровержение теории, а её честное прочтение: гарантия
O(logT) описывает поведение при T→∞ и в худшем случае, а нам нужен
конкретный бюджет и конкретные разрывы.
Цена разрыва: сколько нужно, чтобы узнать победителя
Из N∼lnT/Δ2 следует практическое правило: чтобы уверенно
различить две руки, нужно порядка 1/Δ2 наблюдений. Проверим его на
наших парах.
Доля из 400 запусков, в которых к концу горизонта UCB отдал больше показов
настоящему лидеру. Contact (Δ=0,184, 1/Δ2≈30): уже при
T=50 верно в 90,8% случаев, при T=200 — во всех. Fargo
(Δ=0,060, 1/Δ2≈277): 88,0% при T=200 и 98,5% при
T=500. Godfather (Δ=0,0095, 1/Δ2≈11152): 43,5% при
T=50, 67,8% при T=1000 и лишь 89,8% при T=10000.
Обратите внимание на левый нижний угол: при T=50 и T=100 доля верных
ответов ниже половины. Это не парадокс — на коротком горизонте случайность
однажды повезённой руки сильнее реального различия в один процентный пункт.
Томпсоновское сэмплирование
Третья идея старше UCB: действовать по случайной выборке из собственного
незнания. Для бинарной награды удобна модель Бернулли с сопряжённым
бета-априорным распределением:
μa∼Beta(αa,βa).
После sa успехов и fa неудач апостериорное распределение получается
сложением счётчиков:
μa∣D∼Beta(αa+sa,βa+fa).
На каждом раунде алгоритм берёт по одному сэмплу из каждого posterior и играет
руку с наибольшим сэмплом:
μa∼Beta(1+sa,1+fa),At=argamaxμa.
Это заголовок статьи Томпсона — и одновременно точная формулировка того, что
делает алгоритм. Он реализует probability matching: вероятность выбрать руку
равна апостериорной вероятности того, что она лучшая,
Pr(At=a)=Pr(μa=jmaxμjDt).
Плохо изученная рука иногда вытягивает оптимистичный сэмпл и получает показ;
хорошо изученная слабая рука не вытягивает почти никогда.
Один запуск, счётчики показов подписаны над панелями. К t=2000 распределение
имеет вид (1210,635,97,53,5): 92,3% бюджета ушло двум сильным рукам, а Liar
Liar получила всего 5 показов из 2000 — четверть процента. Заметьте, что
кривые двух лидеров так и не разошлись: алгоритм не «решил» спор, он лишь
перестал тратить показы на тех, о ком спора нет.
Русская линия: бандит как задача управления по неполным данным
В западной традиции бандит идёт от Роббинса и Гиттинса, в советской — от
теории оптимального управления со случайными возмущениями. Эрнст Львович
Пресман и Исаак Моисеевич Сонин в монографии «Последовательное управление по
неполным данным» (Наука, 1982) разобрали байесовскую постановку именно того
конфликта, о котором идёт речь: наблюдатель управляет процессом, не зная его
параметров, и вынужден платить за информацию действиями. Двурукий бандит
разбирается там как каноническая модель, а решение строится через
апостериорное распределение параметра как достаточную статистику: задача с
неизвестным μ превращается в задачу управления полностью наблюдаемым
процессом, состояние которого — само наше незнание. В 1990 году книга вышла
по-английски с прямым упоминанием многоруких бандитов в заглавии.
Из этого взгляда естественно вырастает индекс Гиттинса. Для дисконтированного
бандита с независимыми руками оптимальная стратегия выглядит поразительно
просто: каждой руке приписывается число νa, зависящее только от её
собственного posterior и коэффициента дисконтирования, и играется рука с
наибольшим индексом:
νa=τ>0supE[∑t=0τ−1γt]E[∑t=0τ−1γtRt].
Многомерная задача распадается на K одномерных. Красота теоремы не должна
обманывать: она опирается на независимость рук, дисконтирование и
стационарность. Для контекстных или меняющихся сред готовый индекс не
переносится.
Лаборатория бандита
Пять реальных фильмов, четыре политики, один бюджет
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Начните с чистой жадности: нередко она запирается на второй руке и кривая
regret идёт почти прямой линией с малым наклоном. Включите ε=0,2
— наклон вырастет и уже не изменится: прямая линия и есть подпись постоянного
исследования. Переключитесь на UCB и потяните c: при c=0 получается
жадность, при c=2 алгоритм почти равномерно перебирает руки. Найдите
значение, при котором кривая заметно загибается. Затем Thompson sampling:
проследите, как доля показов худшей руки падает почти до нуля за первую сотню
раундов.
Наконец, нажмите «сломать среду». Лучшая и четвёртая руки меняются местами.
Посмотрите на счётчики: у бывшего лидера накоплены тысячи наблюдений, и его
среднее падает мучительно медленно — каждое новое наблюдение весит 1/N.
Когда среда меняется
Стационарность — сильное допущение. Вкусы, интерфейс, состав аудитории
меняются. Формально мы переходим к dynamic regret относительно движущегося
лидера:
RTdyn=t=1∑T(μt∗−μt,At).
Лечение — забывание. Скользящее окно считает средние по последним W
наблюдениям,
μa,tW=∑s=t−Wt−11{As=a}∑s=t−Wt−1Rs1{As=a},
а дисконтирование делает то же плавно, с весами λt−1−s:
Три руки, на раунде 2000 лучшая и худшая меняются местами. До слома алгоритм с
полной памятью потерял 9,4, а с окном W=500 — 34,8: забывание стоит денег
там, где забывать нечего. Сразу после слома всё переворачивается: за первые
500 раундов новой эпохи полная память теряет 60,2 против 17,5 у окна. Итог за
всю эпоху после слома — 61,7 против 48,0.
Контекст: кому именно показывать
Один вариант может быть лучше для одной аудитории и хуже для другой. Тогда
разумно наблюдать признаки xtдо выбора и моделировать
E[Rt∣xt,At=a]=fa(xt).
В LinUCB предполагают линейность, fa(x)=x⊤θa, оценивают
θa гребневой регрессией и добавляют бонус, зависящий от того,
насколько направление x уже покрыто прошлыми наблюдениями:
Реальные оценки MovieLens. Среди зрителей моложе 30 лучше Return of the Jedi
(0,806 против 0,731), среди тех, кому 30 и больше, — Fargo
(0,853 против 0,690). В общей смеси побеждает Fargo
(0,799 против 0,748), и бесконтекстный бандит навсегда закрепит его
для всех — включая ту группу, которой он нравится меньше.
Логи адаптивной политики и offline-оценка
Журнал, собранный бандитом, смещён по построению: популярные действия
наблюдаются часто, а об альтернативах данных почти нет. Оценивать по такому
журналу новую политику π наивным усреднением нельзя. Спасает взвешивание
на обратную вероятность выбора (inverse propensity scoring):
где pt — вероятность, с которой старая политика выбрала действие. Оценка
несмещена, если pt>0 для всех действий, которые может выбрать π:
E[p1{π(x)=A}R]=E[Rπ(x)].
Но дисперсия растёт как 1/p: одно наблюдение с pt=0,01 входит с весом
100. Отсюда практика clipping — обрезать веса сверху, сознательно обменяв
часть несмещённости на устойчивость.
Отсюда же следует осторожность с выводами: p-value, вычисленное после того,
как вы много раз посматривали на текущего лидера, оптимистично. Нужны либо
методы, корректные при адаптивной остановке (доверительные последовательности),
либо честно зафиксированный заранее горизонт — тот же разговор о
доверительных интервалах и покрытии, только с адаптивно
собранными данными.
Где исследовать нельзя
Формула regret молчалива о том, чем именно мы платим. В медицине «показать
менее изученный вариант ради информации» означает лечить человека хуже, чем
умеем сейчас. Существуют safe bandits с ограничением
μAt≥(1−η)μbaseline
и байесовские правила остановки, но само ограничение приходит из предметной
области, а не из математики. То же с честностью: политика, максимизирующая
общий CTR, может систематически недообслуживать малую группу, потому что её
вклад в средний показатель мал.
Что остаётся, когда алгоритм забыт
Роббинс написал это, открывая ту самую область, в которой мы провели урок.
Главное в ней — не конкретная формула бонуса. Главное — что данные появляются
после действия и в ответ на него, а значит, план эксперимента и есть часть
решения.
Три величины определяют всё остальное. Разрыв Δ говорит, насколько
трудно различить варианты: нужно порядка 1/Δ2 наблюдений. Горизонт T
говорит, окупится ли различение вообще: при 28 днях на один процентный пункт
разницы дешевле выбрать любой вариант и вернуться к вопросу позже. Скорость
изменения среды говорит, сколько прошлого имеет смысл помнить: полная память
дала 9,4 regret до слома и 60,2 сразу после.
Ни один алгоритм не отменяет этой арифметики — они лишь по-разному
распределяют плату. ε-жадность платит равномерно и вечно, UCB — по
убывающей, но в худшем случае, Thompson sampling — по вероятности быть лучшим.
Понимание, за что вы платите, переносится на любую задачу, где решение и
измерение — это одно и то же действие.