Многорукий бандит убирает состояния и оставляет один чистый конфликт: потратить показ на нынешнего лидера или проверить менее изученный вариант. Лучшее действие неизвестно, а каждое измерение уже меняет результат — потому что измеряем мы теми же показами, которыми зарабатываем.

Пять фильмов и один бюджет показов

Витрина кинотеатра показывает посетителю одну рекомендацию. У каждого фильма есть неизвестная нам заранее вероятность понравиться. Чтобы не выдумывать цифры, возьмём реальный лог MovieLens 100K, тот же, на котором мы строили рекомендации: наградой будем считать событие «зритель поставил оценку не ниже четырёх». Пять хорошо оценённых фильмов дают пять «рук»:

μSW=0,859,μGF=0,850,μFar=0,799,μCon=0,676,μLL=0,406.\mu_{\text{SW}}=0{,}859,\quad \mu_{\text{GF}}=0{,}850,\quad \mu_{\text{Far}}=0{,}799,\quad \mu_{\text{Con}}=0{,}676,\quad \mu_{\text{LL}}=0{,}406.

Эти числа посчитаны по 583, 413, 508, 509 и 485 реальным оценкам соответственно. Мы, читатели учебника, их видим. Алгоритм — нет: он узнаёт мир только через отклики тех зрителей, которым сам же и показал фильм.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Горизонтальная диаграмма: пять фильмов с долей оценок «нравится» и 95-процентными интервалами Уилсона; интервалы Star Wars и Godfather сильно перекрываются, Liar Liar далеко внизу
Рис. 70.1. Пять рук из реального лога

Доля оценок «нравится» и 95%-й интервал Уилсона для каждого фильма. Star Wars (0,859)(0{,}859) и Godfather (0,850)(0{,}850) статистически неразличимы: их интервалы (0,829;0,885)(0{,}829;0{,}885) и (0,812;0,881)(0{,}812;0{,}881) почти совпадают. Contact (0,634;0,715)(0{,}634;0{,}715) отделён от лидера уверенно. Разрыв — это не «правда или ложь», а величина, которую надо ещё суметь измерить.

В стационарном KK-руком бандите на каждом раунде t=1,,Tt=1,\ldots,T алгоритм выбирает руку At{1,,K}A_t\in\{1,\ldots,K\} и получает случайную награду RtR_t с условным средним

E[RtAt=a]=μa.\mathbb E[R_t\mid A_t=a]=\mu_a .

Лучшее из средних обозначим

μ=maxaμa,a=argmaxaμa.\mu^*=\max_{a}\mu_a,\qquad a^*=\arg\max_a\mu_a .

Бандит проще марковского процесса принятия решений: нет состояния и нет влияния действия на будущую динамику среды. Но он труднее обычного A/B-теста, потому что данные собираются адаптивно — тем самым правилом, качество которого мы и оцениваем.

Regret: во что обходится незнание

Сравнивать алгоритм с нулём бессмысленно; сравним его с всезнающим оракулом, который с первого раунда играет aa^*. Разность накопленных ожидаемых наград и есть regret:

RT=TμEt=1TRt.\mathcal R_T=T\mu^*-\mathbb E\sum_{t=1}^{T}R_t .

Ключевое тождество получается заменой суммы по времени на сумму по рукам. Обозначим Δa=μμa\Delta_a=\mu^*-\mu_a — разрыв руки aa, а Na(T)N_a(T) — сколько раз она была выбрана за TT раундов. Тогда

RT=a=1KΔaENa(T).\mathcal R_T=\sum_{a=1}^{K}\Delta_a\,\mathbb E N_a(T).

Формула буквально выписывает счёт: каждый показ неоптимальной руки стоит ровно её разрыв. Ошибиться в пользу Godfather дёшево (Δ=0,009\Delta=0{,}009), ошибиться в пользу Liar Liar дорого (Δ=0,453\Delta=0{,}453).

Это тонкость, которую стоит проговорить: вклад руки равен произведению ΔaNa\Delta_a N_a, а хороший алгоритм выбирает её порядка logT/Δa2\log T/\Delta_a^2 раз. Произведение ведёт себя как

ΔalogTΔa2=logTΔa,\Delta_a\cdot\frac{\log T}{\Delta_a^{2}}=\frac{\log T}{\Delta_a},

то есть растёт при уменьшении разрыва. Самые дорогие руки — не безнадёжные, а те, что почти хороши.

Жадность и её ловушка

Простейшая политика: оценивать средние по наблюдениям

μ^a(t)=1Na(t)s<t:As=aRs\widehat\mu_a(t)=\frac{1}{N_a(t)}\sum_{s<t:\,A_s=a}R_s

и всегда выбирать максимум μ^a(t)\widehat\mu_a(t). Проблема видна сразу: оценка, полученная по трём показам, участвует в сравнении на равных с оценкой по трёмстам. Рука, которой один раз повезло, получает μ^=1\widehat\mu=1 и забирает все дальнейшие показы. Обратной связи по остальным больше не будет — они навсегда останутся с плохими случайными оценками.

Заметьте странность: медианный regret чистой жадности за 5000 раундов равен всего 48 — лучше, чем у ε\varepsilon-жадности с ε=0,10\varepsilon=0{,}10. Но при этом в 56,6% запусков она заперлась не на лучшей руке. Обе цифры верны и обе важны: у нашей задачи две верхние руки почти одинаковы, поэтому «неверный» выбор часто почти бесплатен. Если бы целью было назвать лучший вариант, а не максимизировать сумму наград, жадность провалилась бы.

ε\varepsilon-жадность: постоянная плата за любопытство

Добавим случайность. С вероятностью 1ε1-\varepsilon выбираем текущего лидера, с вероятностью ε\varepsilon — случайную руку:

At={argmaxaμ^a(t),с вер. 1ε,равномерно из {1,,K},с вер. ε.A_t=\begin{cases} \arg\max_a\widehat\mu_a(t), & \text{с вер. }1-\varepsilon,\\[2pt] \text{равномерно из }\{1,\ldots,K\}, & \text{с вер. }\varepsilon. \end{cases}

Это простой и честный baseline. Но его regret растёт линейно: даже когда всё уже понятно, доля ε\varepsilon показов уходит наугад, и каждый такой показ стоит в среднем

εKaΔa.\frac{\varepsilon}{K}\sum_{a}\Delta_a .

Для наших пяти рук эта величина равна ε0,1413\varepsilon\cdot0{,}1413: при ε=0,1\varepsilon=0{,}1 — примерно 0,01410{,}0141 потерянного отклика на каждый раунд, и это плата навсегда.

Убывающее расписание εt1/t\varepsilon_t\propto 1/t лечит линейность, но требует подбора константы. Другой приём — оптимистичная инициализация: положить начальные оценки заведомо завышенными (например, 1). Тогда любая непроверенная рука выглядит привлекательно, и алгоритм сам обойдёт их все, пока оценки не опустятся до правды.

UCB: оптимизм перед лицом неопределённости

Разумная альтернатива — сравнивать руки не по средним, а по верхним границам того, чем они ещё могут оказаться:

At=argmaxa[μ^a(t)+clntNa(t)].A_t=\arg\max_{a}\left[ \widehat\mu_a(t)+c\sqrt{\frac{\ln t}{N_a(t)}}\right].

Первое слагаемое — найденное качество, второе — бонус неопределённости. Он велик у редко выбранной руки и тает как 1/Na1/\sqrt{N_a} по мере накопления данных; логарифм в числителе медленно поднимает бонус со временем, заставляя иногда возвращаться к давно забытым вариантам.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Пять вертикальных отрезков: точка — эмпирическое среднее руки, штрих сверху — верхняя граница; все верхние границы почти равны 1,28–1,30, хотя средние различаются от 0,44 до 0,87
Рис. 70.2. Состояние UCB на 200-м раунде

Реальный запуск, t=200t=200, c=2c=\sqrt2. Счётчики (62,52,49,21,16)(62,52,49,21,16), средние (0,871;0,846;0,816;0,571;0,438)(0{,}871;0{,}846;0{,}816;0{,}571;0{,}438), верхние границы (1,284;1,298;1,281;1,282;1,251)(1{,}284;1{,}298;1{,}281;1{,}282;1{,}251). Следующий показ достаётся Godfather, хотя его среднее ниже, чем у Star Wars: бонус за меньшее число наблюдений перевесил. Обратите внимание на главное — верхние границы почти сравнялись. UCB стремится к состоянию, где все руки одинаково «возможны».

Откуда берётся корень

Форма бонуса не выдумана. Для награды из [0,1][0,1] неравенство Хёфдинга даёт для среднего по nn независимым наблюдениям

Pr(μ^μu)e2nu2.\Pr\left(\widehat\mu-\mu\ge u\right)\le e^{-2nu^{2}} .

Приравняв правую часть к t4t^{-4} и решив относительно uu, получаем

u=2lntn,u=\sqrt{\frac{2\ln t}{n}},

то есть тот самый корень с c=2c=\sqrt2. Смысл выбора уровня: мы хотим, чтобы вероятность «оптимизм оказался ложью» суммарно по всем раундам и рукам была мала. Тогда с большой вероятностью верхняя граница лучшей руки никогда не опускается ниже μ\mu^*, а значит, выбор неоптимальной руки возможен лишь пока её бонус не сжался. Приравнивая бонус к разрыву,

clnTNaΔaNac2lnTΔa2,c\sqrt{\frac{\ln T}{N_a}}\approx\Delta_a \quad\Longrightarrow\quad N_a\approx\frac{c^{2}\ln T}{\Delta_a^{2}},

получаем классический результат: ожидаемое число выборов неоптимальной руки имеет порядок logT/Δa2\log T/\Delta_a^2, а её вклад в regret — logT/Δa\log T/\Delta_a.

Константа решает больше, чем название

Теория говорит про порядок, практика живёт при конечном TT. Прогоним на одних и тех же реальных откликах шесть политик, 300 независимых запусков, горизонт 5000.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Кривые накопленного regret: UCB с c равным корню из двух идёт выше всех к 132, эпсилон-жадность 0,10 к 84, эпсилон 0,01 к 53, чистая жадность 48, UCB с c=0,5 к 43, Thompson sampling 35
Рис. 70.3. Шесть политик на одном бюджете

Медианы по 300 запускам, полосы — межквартильный размах. Итог за 5000 раундов: Thompson sampling 35, UCB с c=0,5c=0{,}5 — 43, чистая жадность 48, ε=0,01\varepsilon=0{,}01 — 53, ε=0,10\varepsilon=0{,}10 — 84, UCB с c=2c=\sqrt2 — 132. Смотреть надо не на порядок в списке, а на форму: у ε\varepsilon-жадности regret за вторую половину горизонта вырос почти вдвое (отношение 1,79), у UCB он подрос лишь в 1,53 раза и продолжает загибаться.

Осторожный UCB с теоретической константой c=2c=\sqrt2 оказался худшим: на горизонте 5000 он всё ещё «оплачивает» проверку Liar Liar и Contact, хотя те давно проиграли. Уменьшение константы до 0,50{,}5 снижает regret втрое. Это не опровержение теории, а её честное прочтение: гарантия O(logT)O(\log T) описывает поведение при TT\to\infty и в худшем случае, а нам нужен конкретный бюджет и конкретные разрывы.

Цена разрыва: сколько нужно, чтобы узнать победителя

Из NlnT/Δ2N\sim\ln T/\Delta^2 следует практическое правило: чтобы уверенно различить две руки, нужно порядка 1/Δ21/\Delta^2 наблюдений. Проверим его на наших парах.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Три кривые доли верно угаданного лидера от горизонта в логарифмической шкале: для разрыва 0,184 уже 200 раундов дают единицу, для 0,060 — около 500, для 0,009 даже 10000 раундов дают 0,90
Рис. 70.4. Чем меньше разрыв, тем длиннее опыт

Доля из 400 запусков, в которых к концу горизонта UCB отдал больше показов настоящему лидеру. Contact (Δ=0,184\Delta=0{,}184, 1/Δ2301/\Delta^2\approx30): уже при T=50T=50 верно в 90,8% случаев, при T=200T=200 — во всех. Fargo (Δ=0,060\Delta=0{,}060, 1/Δ22771/\Delta^2\approx277): 88,0% при T=200T=200 и 98,5% при T=500T=500. Godfather (Δ=0,0095\Delta=0{,}0095, 1/Δ2111521/\Delta^2\approx11152): 43,5% при T=50T=50, 67,8% при T=1000T=1000 и лишь 89,8% при T=10000T=10\,000.

Обратите внимание на левый нижний угол: при T=50T=50 и T=100T=100 доля верных ответов ниже половины. Это не парадокс — на коротком горизонте случайность однажды повезённой руки сильнее реального различия в один процентный пункт.

Томпсоновское сэмплирование

Третья идея старше UCB: действовать по случайной выборке из собственного незнания. Для бинарной награды удобна модель Бернулли с сопряжённым бета-априорным распределением:

μaBeta(αa,βa).\mu_a\sim\operatorname{Beta}(\alpha_a,\beta_a).

После sas_a успехов и faf_a неудач апостериорное распределение получается сложением счётчиков:

μaDBeta(αa+sa,  βa+fa).\mu_a\mid D\sim\operatorname{Beta}(\alpha_a+s_a,\;\beta_a+f_a).

На каждом раунде алгоритм берёт по одному сэмплу из каждого posterior и играет руку с наибольшим сэмплом:

μ~aBeta(1+sa,1+fa),At=argmaxaμ~a.\widetilde\mu_a\sim\operatorname{Beta}(1+s_a,\,1+f_a),\qquad A_t=\arg\max_a\widetilde\mu_a .

Это заголовок статьи Томпсона — и одновременно точная формулировка того, что делает алгоритм. Он реализует probability matching: вероятность выбрать руку равна апостериорной вероятности того, что она лучшая,

Pr(At=a)=Pr(μa=maxjμj  |  Dt).\Pr(A_t=a)=\Pr\left(\mu_a=\max_j\mu_j\;\middle|\;D_{t}\right).

Плохо изученная рука иногда вытягивает оптимистичный сэмпл и получает показ; хорошо изученная слабая рука не вытягивает почти никогда.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Три панели плотностей Beta для пяти рук на раундах 40, 300 и 2000: сначала все широкие, затем слабые уходят влево и сужаются, две сильные остаются близко
Рис. 70.5. Как сужаются posterior

Один запуск, счётчики показов подписаны над панелями. К t=2000t=2000 распределение имеет вид (1210,635,97,53,5)(1210,635,97,53,5): 92,3% бюджета ушло двум сильным рукам, а Liar Liar получила всего 5 показов из 2000 — четверть процента. Заметьте, что кривые двух лидеров так и не разошлись: алгоритм не «решил» спор, он лишь перестал тратить показы на тех, о ком спора нет.

Русская линия: бандит как задача управления по неполным данным

В западной традиции бандит идёт от Роббинса и Гиттинса, в советской — от теории оптимального управления со случайными возмущениями. Эрнст Львович Пресман и Исаак Моисеевич Сонин в монографии «Последовательное управление по неполным данным» (Наука, 1982) разобрали байесовскую постановку именно того конфликта, о котором идёт речь: наблюдатель управляет процессом, не зная его параметров, и вынужден платить за информацию действиями. Двурукий бандит разбирается там как каноническая модель, а решение строится через апостериорное распределение параметра как достаточную статистику: задача с неизвестным μ\mu превращается в задачу управления полностью наблюдаемым процессом, состояние которого — само наше незнание. В 1990 году книга вышла по-английски с прямым упоминанием многоруких бандитов в заглавии.

Из этого взгляда естественно вырастает индекс Гиттинса. Для дисконтированного бандита с независимыми руками оптимальная стратегия выглядит поразительно просто: каждой руке приписывается число νa\nu_a, зависящее только от её собственного posterior и коэффициента дисконтирования, и играется рука с наибольшим индексом:

νa=supτ>0E[t=0τ1γtRt]E[t=0τ1γt].\nu_a=\sup_{\tau>0} \frac{\mathbb E\left[\sum_{t=0}^{\tau-1}\gamma^{t}R_t\right]} {\mathbb E\left[\sum_{t=0}^{\tau-1}\gamma^{t}\right]} .

Многомерная задача распадается на KK одномерных. Красота теоремы не должна обманывать: она опирается на независимость рук, дисконтирование и стационарность. Для контекстных или меняющихся сред готовый индекс не переносится.

Лаборатория бандита

Пять реальных фильмов, четыре политики, один бюджет

Загружается живая иллюстрация…

Начните с чистой жадности: нередко она запирается на второй руке и кривая regret идёт почти прямой линией с малым наклоном. Включите ε=0,2\varepsilon=0{,}2 — наклон вырастет и уже не изменится: прямая линия и есть подпись постоянного исследования. Переключитесь на UCB и потяните cc: при c=0c=0 получается жадность, при c=2c=2 алгоритм почти равномерно перебирает руки. Найдите значение, при котором кривая заметно загибается. Затем Thompson sampling: проследите, как доля показов худшей руки падает почти до нуля за первую сотню раундов.

Наконец, нажмите «сломать среду». Лучшая и четвёртая руки меняются местами. Посмотрите на счётчики: у бывшего лидера накоплены тысячи наблюдений, и его среднее падает мучительно медленно — каждое новое наблюдение весит 1/N1/N.

Когда среда меняется

Стационарность — сильное допущение. Вкусы, интерфейс, состав аудитории меняются. Формально мы переходим к dynamic regret относительно движущегося лидера:

RTdyn=t=1T(μtμt,At).\mathcal R^{\text{dyn}}_T=\sum_{t=1}^{T}\left(\mu^*_t-\mu_{t,A_t}\right).

Лечение — забывание. Скользящее окно считает средние по последним WW наблюдениям,

μ^a,tW=s=tWt1Rs1{As=a}s=tWt11{As=a},\widehat\mu_{a,t}^{W}= \frac{\sum_{s=t-W}^{t-1}R_s\mathbf 1\{A_s=a\}} {\sum_{s=t-W}^{t-1}\mathbf 1\{A_s=a\}},

а дисконтирование делает то же плавно, с весами λt1s\lambda^{t-1-s}:

Na,tλ=s<tλt1s1{As=a},μ^a,tλ=1Na,tλs<tλt1sRs1{As=a}.N^{\lambda}_{a,t}=\sum_{s<t}\lambda^{t-1-s}\mathbf 1\{A_s=a\},\qquad \widehat\mu^{\lambda}_{a,t}= \frac{1}{N^{\lambda}_{a,t}}\sum_{s<t}\lambda^{t-1-s}R_s\mathbf 1\{A_s=a\}.
Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Две кривые dynamic regret: обычный UCB почти горизонтален до раунда 2000, затем резко взлетает; UCB с окном 500 растёт ступеньками всё время, но после слома поднимается плавнее
Рис. 70.6. Память дёшева до слома и дорога после

Три руки, на раунде 2000 лучшая и худшая меняются местами. До слома алгоритм с полной памятью потерял 9,4, а с окном W=500W=500 — 34,8: забывание стоит денег там, где забывать нечего. Сразу после слома всё переворачивается: за первые 500 раундов новой эпохи полная память теряет 60,2 против 17,5 у окна. Итог за всю эпоху после слома — 61,7 против 48,0.

Контекст: кому именно показывать

Один вариант может быть лучше для одной аудитории и хуже для другой. Тогда разумно наблюдать признаки xtx_t до выбора и моделировать

E[Rtxt,At=a]=fa(xt).\mathbb E[R_t\mid x_t,A_t=a]=f_a(x_t).

В LinUCB предполагают линейность, fa(x)=xθaf_a(x)=x^\top\theta_a, оценивают θa\theta_a гребневой регрессией и добавляют бонус, зависящий от того, насколько направление xx уже покрыто прошлыми наблюдениями:

At=argmaxa[xtθ^a+αxtVa1xt],Va=λI+sAs=axsxs.A_t=\arg\max_a\left[x_t^\top\widehat\theta_a +\alpha\sqrt{x_t^\top V_a^{-1}x_t}\right],\qquad V_a=\lambda I+\sum_{s\:A_s=a}x_sx_s^\top .

Это буквально та же схема «оценка плюс неопределённость», только неопределённость теперь зависит от направления в пространстве признаков.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Столбики доли «нравится» для Fargo и Return of the Jedi в трёх разрезах: моложе 30, 30 и старше, и все вместе; лидеры в группах разные, а в общей смеси побеждает Fargo
Рис. 70.7. Средняя молчит о группах

Реальные оценки MovieLens. Среди зрителей моложе 30 лучше Return of the Jedi (0,8060{,}806 против 0,7310{,}731), среди тех, кому 30 и больше, — Fargo (0,8530{,}853 против 0,6900{,}690). В общей смеси побеждает Fargo (0,7990{,}799 против 0,7480{,}748), и бесконтекстный бандит навсегда закрепит его для всех — включая ту группу, которой он нравится меньше.

Логи адаптивной политики и offline-оценка

Журнал, собранный бандитом, смещён по построению: популярные действия наблюдаются часто, а об альтернативах данных почти нет. Оценивать по такому журналу новую политику π\pi наивным усреднением нельзя. Спасает взвешивание на обратную вероятность выбора (inverse propensity scoring):

V^(π)=1Tt=1T1{π(xt)=At}ptRt,pt=Pr(Atxt),\widehat V(\pi)=\frac1T\sum_{t=1}^{T} \frac{\mathbf 1\{\pi(x_t)=A_t\}}{p_t}\,R_t,\qquad p_t=\Pr(A_t\mid x_t),

где ptp_t — вероятность, с которой старая политика выбрала действие. Оценка несмещена, если pt>0p_t>0 для всех действий, которые может выбрать π\pi:

E[1{π(x)=A}Rp]=E[Rπ(x)].\mathbb E\left[\frac{\mathbf 1\{\pi(x)=A\}R}{p}\right] =\mathbb E\left[R^{\pi(x)}\right].

Но дисперсия растёт как 1/p1/p: одно наблюдение с pt=0,01p_t=0{,}01 входит с весом 100. Отсюда практика clipping — обрезать веса сверху, сознательно обменяв часть несмещённости на устойчивость.

Отсюда же следует осторожность с выводами: p-value, вычисленное после того, как вы много раз посматривали на текущего лидера, оптимистично. Нужны либо методы, корректные при адаптивной остановке (доверительные последовательности), либо честно зафиксированный заранее горизонт — тот же разговор о доверительных интервалах и покрытии, только с адаптивно собранными данными.

Где исследовать нельзя

Формула regret молчалива о том, чем именно мы платим. В медицине «показать менее изученный вариант ради информации» означает лечить человека хуже, чем умеем сейчас. Существуют safe bandits с ограничением

μAt(1η)μbaseline\mu_{A_t}\ge(1-\eta)\,\mu_{\text{baseline}}

и байесовские правила остановки, но само ограничение приходит из предметной области, а не из математики. То же с честностью: политика, максимизирующая общий CTR, может систематически недообслуживать малую группу, потому что её вклад в средний показатель мал.

Что остаётся, когда алгоритм забыт

Роббинс написал это, открывая ту самую область, в которой мы провели урок. Главное в ней — не конкретная формула бонуса. Главное — что данные появляются после действия и в ответ на него, а значит, план эксперимента и есть часть решения.

Три величины определяют всё остальное. Разрыв Δ\Delta говорит, насколько трудно различить варианты: нужно порядка 1/Δ21/\Delta^2 наблюдений. Горизонт TT говорит, окупится ли различение вообще: при 28 днях на один процентный пункт разницы дешевле выбрать любой вариант и вернуться к вопросу позже. Скорость изменения среды говорит, сколько прошлого имеет смысл помнить: полная память дала 9,4 regret до слома и 60,2 сразу после.

Ни один алгоритм не отменяет этой арифметики — они лишь по-разному распределяют плату. ε\varepsilon-жадность платит равномерно и вечно, UCB — по убывающей, но в худшем случае, Thompson sampling — по вероятности быть лучшим. Понимание, за что вы платите, переносится на любую задачу, где решение и измерение — это одно и то же действие.

Задачи