AI

多腕バンディット問題とは?4手法をPythonで実測比較し、A/Bテストとの違いを解説

多腕バンディット問題とは?4手法をPythonで実測比較し、A/Bテストとの違いを解説

多腕バンディット問題(英語:multi-armed bandit problem)は、どの選択肢が一番良いか分からないまま選び続け、試行を通じた報酬の合計を最大にする問題です。広告のクリエイティブ、Webページの見出し、プッシュ通知の文面のように「試しながら当たりに寄せたい」場面がこの形をしています。この記事では定義と3つの定式化、代表4手法のPython実装、同じ条件で回したリグレットの実測値、A/Bテストとの目的の違い、本番前のオフライン評価までを扱います。

まとめ:多腕バンディット問題の要点

  • 報酬分布が未知の複数のアーム(選択肢)から毎回1つを選び、累積報酬を最大化する逐次意思決定問題。状態遷移のない、最も単純な強化学習にあたる。
  • 中心課題は探索と活用のトレードオフ。性能は最適アームとの差の累積=リグレットで測り、確率的な設定では試行回数Tに対して対数オーダーが理論下界になる(Lai & Robbins, 1985)。
  • CVR数%・5案の条件で実測すると、1万回ではε-greedy(リグレット29.6)がトンプソン抽出(45.4)より小さく、10万回ではトンプソン抽出が6割弱(111.2対197.1)に逆転した。UCB1はボーナス項が大きすぎて均等配分に近い動きになった。
  • A/Bテストは「どれが最良かを一定の確からしさで当てる」問題(最適腕識別)で、バンディットは「試している間の損を減らす」問題。目的が違うので置き換えではない。トンプソン抽出で集めた2群のデータに通常の検定を当てると、偽陽性率が最大2倍になる報告がある。
  • 最適案が途中で入れ替わる環境、報酬の観測が数日遅れる環境では、基本形のままでは損が膨らむ。割引付きの手法か文脈付きバンディットを検討し、本番前にログでオフライン評価する。

多腕バンディット問題の定義と英語名・語源

K本のアームがあり、アームiを引くと平均μiの報酬が確率的に返ります。μiは事前に分かりません。T回引ける中で、どのアームが良いかを推定しながら、同時に報酬も稼ぐ必要があります。悪いアームを確かめるために使った試行は、そのまま取り逃した報酬になります。

英語表記と「バンディット」の由来

英語では multi-armed bandit(略してMAB)と書き、日本語では多腕バンディット、マルチアームバンディット、多腕バンディット問題と表記が揺れます。bandit は「盗賊」で、レバーを1本引くたびにお金を巻き上げていくスロットマシンを英語の俗語で one-armed bandit(片腕の盗賊)と呼んだことに由来します。腕が何本もあるスロットマシンの前で、どの台が当たりやすいか分からないまま限られたコインで遊ぶ状況を想像すると、問題設定がそのまま掴めます。

強化学習との関係

強化学習は、行動によって状態が移り変わり、その先の報酬まで見越して方策を学ぶ枠組みです。多腕バンディット問題には状態の遷移がなく、毎回同じ状況で「行動→即時報酬」を繰り返します。強化学習の標準的な教科書である Sutton & Barto『Reinforcement Learning: An Introduction』(第2版)も、第2章を Multi-armed Bandits に充て、探索と活用の入門として扱っています。状態遷移のある方策学習へ進むときは、PPOとDPOの違いとは?強化学習PPOの仕組みとDPOの選好学習をコードで比較やUnity ML-Agentsとは?4.1の導入手順と強化学習の流れが次の段階にあたります。

3つの定式化:割引・確率的・敵対的

人工知能学会誌の解説「多腕バンディット問題(私のブックマーク)」は、研究の流れを3つの定式化に分けています。

  • 割引定式化:将来の報酬を割り引いて合計を最大化する。最適方策はGittins指数で特徴づけられる。
  • 確率的定式化:各アームの報酬分布は固定で、割引はしない。UCB法、トンプソン抽出、MED法のいずれかをベースにした手法が多い(Web最適化の多くはこの設定で考える)。
  • 敵対的定式化:報酬の出方を敵対者が決めるとみなし、分布の仮定を置かない。Auerらの Exp3 が基本のアルゴリズム。

探索と活用のトレードオフとリグレット

探索(exploration)は評価が定まらないアームを引いて情報を集めること、活用(exploitation)は今いちばん良さそうなアームを引いて稼ぐことです。探索に偏ると勝ち筋を使わずに損をし、活用に偏ると序盤にたまたま良く見えたアームに固執します。

リグレットの定義

手法の良し悪しはリグレット(regret)で比べます。最初から最適アームだけを引き続けた場合の期待報酬の合計と、実際に引いたアームの期待報酬の合計の差です。式で書くと、最適アームの平均をμ*として、RT = Σt=1..T(μ* − μa(t))。小さいほど、劣るアームに使った試行が少なかったことを意味します。

理論下界:Lai & Robbins(1985)

確率的定式化では、どのような分布でも性能が崩れない(一貫性のある)手法なら、リグレットを log T のオーダーより小さくはできません。Lai と Robbins が1985年の論文「Asymptotically efficient adaptive allocation rules」(Advances in Applied Mathematics 6巻1号)で示した下界で、係数は最適アームと各アームの分布の近さ(KLダイバージェンス)で決まります。最適アームとの差が小さいアームほど見分けるのに試行が要り、リグレットが膨らみます。CVRが4.5%と5%のように近い案を比べるWeb最適化は、この「見分けにくい」側の問題です。

代表的なアルゴリズムとPython実装

4手法を同じインターフェース(select() でアームを選び、update() で結果を反映)のクラスで示します。numpyだけで動き、次の章のシミュレーションもこのクラスをそのまま使っています。

ε-greedy:一定確率でランダムに試す

確率εでランダムなアームを引き、それ以外は推定平均が最大のアームを引きます。ε=0.1なら10回に1回が探索です。仕組みが一行で説明できる反面、勝者が分かった後も同じ割合で探索を続けるので、リグレットは試行回数に比例して増えます。試行とともにεを小さくする方法(ε-decreasing、焼きなまし)にすると改善しますが、減らす速さの調整が結果を左右します。

import numpy as np

class EpsilonGreedy:
    def __init__(self, n_arms, epsilon=0.1, rng=None):
        self.epsilon = epsilon
        self.rng = rng or np.random.default_rng()
        self.counts = np.zeros(n_arms)   # 各アームを引いた回数
        self.values = np.zeros(n_arms)   # 各アームの推定平均報酬

    def select(self):
        if self.rng.random() < self.epsilon:
            return int(self.rng.integers(len(self.values)))   # 探索
        return int(np.argmax(self.values))                    # 活用

    def update(self, arm, reward):
        self.counts[arm] += 1
        # 逐次平均で更新するので過去の報酬を保存しなくてよい
        self.values[arm] += (reward - self.values[arm]) / self.counts[arm]

UCB1:不確かなアームを楽観的に評価する

推定平均に「試行回数が少ないほど大きいボーナス」を足した値が最大のアームを選びます。Auer・Cesa-Bianchi・Fischerの論文「Finite-time Analysis of the Multiarmed Bandit Problem」(Machine Learning誌, 2002年)が示した手法で、選択式は x̄i + √(2 ln t / ni)(tは総試行回数、niはアームiの試行回数)です。乱数を使わず、報酬が0〜1の範囲にあるときに有限回でのリグレット上界が保証されます。

class UCB1:
    def __init__(self, n_arms, rng=None):
        self.counts = np.zeros(n_arms)
        self.values = np.zeros(n_arms)

    def select(self):
        for i in range(len(self.counts)):
            if self.counts[i] == 0:
                return i                      # 未選択のアームは必ず1度引く
        t = self.counts.sum()
        bonus = np.sqrt(2 * np.log(t) / self.counts)
        return int(np.argmax(self.values + bonus))

    def update(self, arm, reward):
        self.counts[arm] += 1
        self.values[arm] += (reward - self.values[arm]) / self.counts[arm]

トンプソン抽出:事後分布から引いて選ぶ

各アームの成功確率をベイズの事後分布で持ち、そこから1つずつ値を引いて最大のアームを選びます。クリックの有無のような0か1の報酬なら、成功回数と失敗回数からベータ分布 Beta(成功+1, 失敗+1) を事後分布にします。起源は William R. Thompson の1933年の論文「On the Likelihood that One Unknown Probability Exceeds Another in View of the Evidence of Two Samples」(Biometrika 25巻3/4号, 285〜294ページ)で、2つの治療法について「一方が他方より優れる確率P」を観測データから求め、Pに応じた割合で次の患者を割り付ける方法として提案されました。分布の幅そのものが探索の量になるので、調整するパラメータがありません。

class ThompsonSampling:
    def __init__(self, n_arms, rng=None, discount=1.0):
        self.rng = rng or np.random.default_rng()
        self.discount = discount           # 1.0未満にすると古い結果を忘れる
        self.alpha = np.ones(n_arms)       # 成功回数 + 1
        self.beta = np.ones(n_arms)        # 失敗回数 + 1

    def select(self):
        return int(np.argmax(self.rng.beta(self.alpha, self.beta)))

    def update(self, arm, reward):
        if self.discount < 1.0:
            self.alpha = 1 + (self.alpha - 1) * self.discount
            self.beta = 1 + (self.beta - 1) * self.discount
        if reward > 0:
            self.alpha[arm] += 1
        else:
            self.beta[arm] += 1

Exp3:報酬分布を仮定しない敵対的バンディット

各アームの重みを指数的に更新し、重みに比例した確率と一様な確率γを混ぜてアームを選びます。Auerらの「The Nonstochastic Multiarmed Bandit Problem」(SIAM Journal on Computing, 2002年)で提案され、リグレット上界は O(√(TK ln K)) です。確率的な設定の log T より大きく見えますが、Lai & Robbins の下界は分布を固定したまま T を大きくした漸近評価で、Exp3 の上界は有限の T で成り立つ評価です。論文は、見かけの差の原因は敵対的な設定ではなくこの評価の順序の違いだと述べています。重みは長く回すと桁あふれするので、下のコードは対数で持っています。

class Exp3:
    def __init__(self, n_arms, gamma=0.1, rng=None):
        self.gamma = gamma
        self.rng = rng or np.random.default_rng()
        self.log_w = np.zeros(n_arms)      # 重みを対数で保持(桁あふれ防止)

    def select(self):
        w = np.exp(self.log_w - self.log_w.max())
        k = len(w)
        self.probs = (1 - self.gamma) * w / w.sum() + self.gamma / k
        return int(self.rng.choice(k, p=self.probs))

    def update(self, arm, reward):
        x_hat = reward / self.probs[arm]  # 選ばれにくいアームほど重く補正
        self.log_w[arm] += self.gamma * x_hat / len(self.log_w)

4手法を同じ条件で回したシミュレーション結果

教科書の比較は報酬確率が0.1〜0.9のように大きく離れた設定が多く、CVRが数%で案どうしの差が0.5ポイントしかないWeb施策とは条件が違います。そこで、上の4クラスと「全案に均等配分」(A/B/nテストの配分)を、Web施策に近い条件で実行しました。

実験条件と実行コード

  • アーム5本、各アームの成功確率(CVRに相当)は 5.0%・4.5%・4.0%・3.0%・2.0%。
  • 1回の実験で10,000回引き、乱数の種を変えて200回繰り返した平均。ε-greedyはε=0.1、Exp3はγ=0.1。
  • リグレットは期待値で計算(最適アームの5.0%と、引いたアームの成功確率の差を足し上げる)。
def simulate(make_agent, probs_at, T=10000, runs=200, seed=0):
    regrets = []
    for r in range(runs):
        rng = np.random.default_rng(seed + r)
        agent = make_agent(rng)
        regret = 0.0
        for t in range(T):
            p = probs_at(t)                    # 時刻tの各アームの成功確率
            arm = agent.select()
            reward = 1.0 if rng.random() < p[arm] else 0.0
            agent.update(arm, reward)
            regret += p.max() - p[arm]         # 期待値ベースのリグレット
        regrets.append(regret)
    return np.mean(regrets), np.std(regrets)

P = np.array([0.05, 0.045, 0.04, 0.03, 0.02])
print(*map(float, simulate(lambda rng: ThompsonSampling(5, rng=rng), lambda t: P)))
# 45.392275 17.1139...(手元の実行で約2分)

定常環境:1万回ではε-greedyが最小、10万回でトンプソン抽出が逆転

手法 リグレット平均 標準偏差 最適アームを引いた割合
均等配分(A/B/n) 130.0 0.0 20.0%
ε-greedy(ε=0.1) 29.6 24.6 69.6%
UCB1 107.2 3.2 26.0%
トンプソン抽出 45.4 17.1 53.3%
Exp3(γ=0.1) 69.3 10.8 40.9%

1万回の時点ではε-greedyのリグレットが最小でした。ただし標準偏差が24.6と大きく、200回中44回は序盤の偶然で2番手か3番手の案に張り付き、その回のリグレットは60〜100に達しています。1回きりの本番では外れを引きやすい手法です。

UCB1は均等配分の130.0から2割弱しか減っていません。ボーナス項 √(2 ln t / n) は報酬が0〜1に散らばる前提の大きさで、成功確率が5%前後の問題では推定平均の差(0.5ポイント)よりはるかに大きく、1万回たっても探索がほとんど終わらないためです。CVRのように小さい確率を扱うなら、UCB1をそのまま使わず、分散を考慮した変種(UCB-Vなど)、KLダイバージェンスで信頼上限を取るKL-UCB、トンプソン抽出を選びます。

試行回数を10万回に伸ばして、ε-greedyとトンプソン抽出を40回ずつ回した結果が次の表です(乱数の種と回数が上の表と違うため、1万回の値はわずかに異なります)。

試行回数 ε-greedy トンプソン抽出
10,000回 29.9 47.5
30,000回 77.3 75.4
100,000回 197.1 111.2

ε-greedyは探索を10%続けるので、リグレットが試行回数にほぼ比例して増えます。トンプソン抽出は対数的にしか増えないため、3万回付近で並び、10万回では6割弱になりました。月に数万回以上配信が続く広告や推薦ならトンプソン抽出、1万回程度で終わる施策ならε=0.1のε-greedyでも平均では十分(ただし外れを引く回がある)、というのがこの条件での結論です。

途中で最適案が入れ替わる場合:割引付きトンプソン抽出が最小

同じ5本のアームで、5,000回目に成功確率の並びを逆転させました(5.0%だったアームが2.0%になり、2.0%だったアームが5.0%になる)。割引係数0.999のトンプソン抽出(更新のたびに過去の成功・失敗回数に0.999を掛ける)も加えています。

手法 リグレット平均 標準偏差
均等配分(A/B/n) 130.0 0.0
ε-greedy(ε=0.1) 112.4 29.7
UCB1 113.5 3.1
トンプソン抽出 105.8 15.3
Exp3(γ=0.1) 125.4 9.8
割引付きトンプソン抽出(0.999) 89.3 6.6

入れ替わりが起きると、定常環境で29.6だったε-greedyが112.4まで悪化し、どの手法も均等配分との差がほとんどなくなりました。前半に溜めた「旧勝者が強い」という証拠が、後半の切り替えを遅らせるからです。割引を入れたトンプソン抽出だけが89.3と明確に小さく、標準偏差も6.6と、割引なしのトンプソン抽出(15.3)の半分以下でした。

Exp3は均等配分とほぼ同じでした。Exp3の論文が上界を示しているのは、あとから振り返って最も良かった1本のアームとの差(論文の用語でweak regret)であって、途中で入れ替わる最適アームへの追従ではありません。同じ論文は、アームを切り替える回数(hardness)を織り込んだ比較相手に対する変種(Exp3.S)も別に示しています。入れ替わりに追従させたいなら、その変種か、割引・スライディングウィンドウ付きの確率的手法を選びます。「報酬が変化するならExp3」と短絡しないほうが安全です。

A/Bテストとの違い:累積報酬最大化と最適腕識別

A/Bテストとバンディットはどちらも複数案から良いものを選ぶために使われますが、最小化している量が違います。

目的関数の違い

バンディット(累積報酬最大化)が減らすのは、試している間に劣る案へ配った分の損です。一方、多腕バンディットの研究には最適腕識別(best arm identification)という別の定式化があり、こちらは「誤り確率δ以下で最良のアームを当てるまでの試行回数」や「決められた試行回数で最良を外す確率」を最小化します。リクルートの技術ブログ「多腕バンディット問題とA/Bテスト (Part 1)」は、A/Bテストをアーム数2の最適腕識別とみなしています。A/Bテストの期間中に劣る案へトラフィックの半分を流すのは、識別の確からしさを買うための費用です。

観点 A/Bテスト バンディット
最小化する量 勝者を誤る確率 期間中の損(リグレット)
配分 期間中は固定 結果を見て毎回変える
出力 有意差と効果量 今配るべき案
終わり 期間か標本数で終了 回し続けられる

A/Bテストで必要な標本数と期間の決め方は、ABテストとは?必要サンプル数の計算コードと検証期間・判定を誤らせる条件で計算コード付きで扱っています。

バンディットのデータに検定を当てると誤りやすい

バンディットで配分したデータを、あとから通常の検定にかけて「有意差あり」と報告するのは危険です。Williamsらの論文「Challenges in Statistical Analysis of Data Collected by a Bandit Algorithm」(arXiv, 2021年)は、2群・0か1の報酬という最も一般的な設定で、トンプソン抽出でデータを集めると、一般的な仮説検定の偽陽性率と偽陰性率がそれぞれ最大2倍になると報告しています。配分が結果に依存して偏るため、検定が前提にする無作為割り付けが崩れるからです。商用ツールもこの前提で作られており、Optimizelyのドキュメント「Maximize lift with multi-armed bandit optimizations」は、MABでは結果ページに統計的有意性を出さないと明記しています。有意差やp値の意味は有意差検定とは?有意差・p値の意味と検定の種類・やり方をわかりやすく解説を参照してください。

どちらを使うかの判断基準

  • A/Bテストを選ぶ:結果を社内の意思決定の根拠として残す、効果量を報告する、UI刷新のように一度決めたら長く使う変更。
  • バンディットを選ぶ:キャンペーン期間が短く劣る案に配る損が痛い、候補が5案以上あり総当たりの検定が重い、広告や推薦のように終わりなく配り続ける。
  • 両方を使う:A/B/nで明らかな負け案を早めに落とすところまでバンディットに任せ、残った2案はA/Bテストで決着をつける。

本番の前にログで評価する:オフ方策評価

新しい手法をいきなり本番に出すと、悪かった場合の損はそのまま売上に出ます。そこで、過去の配信ログだけで「別の方策で配っていたら報酬はいくらだったか」を推定するのがオフ方策評価(off-policy evaluation, OPE)です。代表的な推定量であるIPS(逆傾向スコア重み付け)は、ログ上で実際に選ばれたアームが新方策でも選ばれる確率を、ログ方策がそのアームを選んだ確率で割った重みを報酬に掛けて平均します。ログ方策の選択確率を記録していないと使えないので、バンディットを入れる段階で「どのアームを、何%の確率で選んだか」を毎回ログに残しておくことが前提です。

実データで手法を試すなら、ZOZOTOWNのファッションECで集められたログを公開した Open Bandit Dataset と Open Bandit Pipeline(Saitoら, 2020年。改訂版はNeurIPS 2021 Datasets and Benchmarks Track に採択)が使えます。同じプラットフォームで異なる方策を走らせたログが含まれており、OPEの推定量どうしを比べられる点が特徴です。Yahoo!のLinUCB論文も、無作為に配信した過去のトラフィックを使えば任意のバンディット手法をオフラインで評価できることを貢献の一つに挙げています。

応用例と提供ツールの現状

広告・ニュース推薦・プッシュ通知での使われ方

文脈付きバンディットの代表例は、Liらの「A Contextual-Bandit Approach to Personalized News Article Recommendation」(WWW 2010)です。ユーザーと記事の特徴を使うLinUCBを提案し、Yahoo! Front Page Today Moduleの3,300万件超のイベントで評価して、文脈を使わない標準的なバンディットに比べクリックが12.5%増えたと報告しています。国内では、CyberAgentが広告配信のトンプソン抽出をユーザーのクラスタ別に改良し、本番でA/Bテストした記録を公開しています。クラスタごとにデータが割れて探索が足りず、改良版が元の手法に勝てなかったという失敗までが記録に残っています。プッシュ通知では、VASILY(現ZOZO)が2015年にタイトル文の配信比率を開封状況に応じて動的に変える施策を公開しており、採用したのはε-greedyと比べたうえでのSoftmaxアルゴリズムです。計算機の外では、結合した2台の半導体レーザーのカオスに生じるリーダ・ラガード関係でアームを選ぶ研究(Mihanaら, Optics Express, 2019年)もあります。

マネージドサービスとテストツール

自前で実装せずに使える選択肢は、ここ数年で入れ替わりました。

  • Optimizely:MAB最適化を提供。二値の指標にはトンプソン抽出、数値の指標にはε-greedyを使うとドキュメントに書かれている。
  • Amazon Personalize:User-Personalizationレシピの explorationWeight が探索の強さで、既定値は0.3(0〜1、1に近いほどインタラクションの少ないアイテムや関連度の低いアイテムを多く出す)。詳しくはAmazon Personalizeとは?レシピ選定とデータ要件・料金の見積もりで扱っている。
  • Azure AI Personalizer:文脈付きバンディットのマネージドサービスだったが提供終了。2023年9月20日から新規リソースを作れず、Microsoft Learnのドキュメントには2026年8月25日の提供終了と書かれている。
  • Google Optimize:2023年9月30日に提供終了。

推薦の基盤ごと選ぶ場合はAIレコメンドエンジン比較|主要8サービスの料金・特徴と選び方が比較の入り口になります。既製サービスで要件に合わない場合や、配信ログの設計から組み立てたい場合は、レコメンド・AIエンジン開発の支援も行っています。

実運用でつまずく条件と使うべきでない場面

最適案が途中で入れ替わる(非定常)

ε-greedy・UCB1・トンプソン抽出は、各アームの平均が変わらないことを前提にしています。季節やキャンペーン、在庫で勝ち案が入れ替わると、過去の全データを同じ重みで平均している限り古い勝者に固執します。前章の実測では、途中で最適案が逆転したときに割引なしのトンプソン抽出のリグレットが大きく増え、割引係数0.999を入れると抑えられました。直近の結果だけを数えるスライディングウィンドウも同じ発想です。割引を強くするほど変化には早く追従しますが、定常時の推定が粗くなるので、係数は過去ログのオフライン評価で決めます。

報酬の観測が遅れる・まとめてしか更新できない

購入のようにコンバージョンが数日後に確定する指標では、未確定の試行が「失敗」として数えられ、配信の多い案ほど見かけのCVRが下がります。報酬が確定するまで更新を保留するか、確定までの期間で報酬を定義し直します。

配信システムの都合で1時間に1回しか更新できない場合は、手法の選び方が変わります。UCB1のような決定的な手法の弱点は、更新までの間ずっと同じアームを出し続けること。トンプソン抽出は毎回乱数で選ぶので、更新が止まっていても配分が散ります。Chapelle と Li の「An Empirical Evaluation of Thompson Sampling」(NIPS 2011)は、Yahoo!のニュース推薦で更新を10分・30分・60分遅らせた条件を比べ、60分の遅延ではトンプソン抽出系が他の手法を上回ったと報告しています。

ユーザーによって最適案が違う(文脈付きバンディット)

基本形は全員に共通の最適アームを探します。年齢層や流入元で勝ち案が逆転するなら、ユーザーの特徴を入力にとる文脈付きバンディット(LinUCBなど)が必要です。ただしCyberAgentの事例のように、ユーザーを細かく分けるほど1区分あたりのデータが減り、探索が終わらないまま期間が尽きます。区分は、区分ごとに勝ち案が実際に違うことをログで確かめてから増やします。

バンディットを使うべきでない場面:2案だけ・価格施策・法務確認が要る変更

候補が2案だけでトラフィックが十分にあるなら、A/Bテストで足ります。価格のようにユーザー間で条件が違うこと自体が問題になる施策や、表示内容に法務確認が要る変更も、配分が動き続けるバンディットには向きません。「期間中の損を減らしたい」のでなければ、バンディットを選ぶ理由はありません。

よくある質問

多腕バンディット問題は英語で何と言いますか?

multi-armed bandit problem です。略してMAB、日本語ではマルチアームバンディット問題とも書きます。「多腕」は multi-armed の直訳で、腕(レバー)が複数あるスロットマシンを指します。腕が1本の普通のスロットマシンは one-armed bandit と呼ばれます。

バンディット問題と多腕バンディット問題は同じものですか?

同じものです。人工知能学会誌の解説も「多腕バンディット問題(バンディット問題, multi-armed bandit problem)」と併記しており、最適腕識別や文脈付きバンディットも、どちらの呼び方の下で扱われます。

多腕バンディット問題を体系的に学ぶにはどの本がよいですか?

日本語なら本多淳也・中村篤祥『バンディット問題の理論とアルゴリズム』(講談社, 2016年, ISBN 978-4-06-152917-5)が確率的・敵対的の両方の定式化と主要アルゴリズムの理論を扱っています。強化学習の文脈から入るなら Sutton & Barto『Reinforcement Learning: An Introduction』第2版の第2章、理論のサーベイなら Bubeck と Cesa-Bianchi の「Regret Analysis of Stochastic and Nonstochastic Multi-armed Bandit Problems」が定番です。

ε-greedy・UCB1・トンプソン抽出はどれを使えばよいですか?

報酬がクリックや購入のような0か1で、数万回以上配り続けるならトンプソン抽出です。この記事の実測では10万回でε-greedyの6割弱のリグレットでした。1万回程度で終わる短期施策ならε-greedyでも平均ではむしろ上回りましたが、ばらつきが大きく2番手や3番手の案に張り付く回が混じります。UCB1はCVRが数%の問題ではボーナス項が大きすぎて探索が終わらないので、そのままでは使いません。

多腕バンディットを使えばA/Bテストは不要になりますか?

なりません。バンディットは期間中の損を減らす手法で、どちらが優れているかを示す手法ではないからです。判断の根拠を残す検証はA/Bテスト、配り続ける運用の最適化はバンディット、と分担します。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.27 テックブログ Brotli 脆弱性:CVE-2026-111497の影響確認とNode.js・Python・.NETの更新手順
  2. 2026.10.28 テックブログ リンツ不正アクセス:314万件の対象確認とパスワード強制リセット後の対処
  3. 2026.10.27 テックブログ Joshin(ジョーシン)不正アクセス:最大600万件の対象とサブスク初期パスワードの対処
  4. 2026.10.23 テックブログ Renta!はいつ再開?不正アクセスでメールアドレス等が流出したおそれ・再開時のパスワード再設定と運営側の対応
  5. 2026.10.28 テックブログ 楽天トラベル不正アクセス:最大約260万件の対象確認とカード下4桁の詐欺対策

RELATED POSTS 関連記事

目次