🦔

バンディットアルゴリズム入門:強化学習の基本と応用

に公開

🌐 バンディットアルゴリズムとは?

バンディットアルゴリズム(Bandit Algorithm)は、強化学習の中でも基本的かつ重要なアルゴリズムで、限られた試行の中で最適な選択を見つけるための手法です。

🎰 スロットマシンを想像してみよう

  • あなたの前に複数のスロットマシン(腕)がある。
  • 各マシンは異なる確率で報酬を返すが、その確率は不明。
  • あなたの目的は、できるだけ多くの報酬を得ること。

このとき、

  • 探索(Exploration):まだよく知らないマシンを試す
  • 活用(Exploitation):今までで一番良さそうなマシンを繰り返し使う

この2つをうまくバランスさせるのが、バンディットアルゴリズムの核心です。

🚀 代表的なバンディット手法

手法 概要
ε-greedy法 確率εでランダムに探索、それ以外は最大の推定報酬を選択
UCB(Upper Confidence Bound) 推定報酬に信頼区間を加味して選択
Thompson Sampling ベイズ推論に基づいて確率的に選択

💻 Pythonによるε-greedy法の実装

import numpy as np
import matplotlib.pyplot as plt

class Bandit:
    def __init__(self, true_mean):
        self.true_mean = true_mean
        self.estimated_mean = 0
        self.n = 0

    def pull(self):
        return np.random.randn() + self.true_mean

    def update(self, reward):
        self.n += 1
        self.estimated_mean += (reward - self.estimated_mean) / self.n

def run_experiment(epsilon, bandit_probs, N=1000):
    bandits = [Bandit(p) for p in bandit_probs]
    rewards = np.zeros(N)

    for i in range(N):
        if np.random.rand() < epsilon:
            j = np.random.choice(len(bandits))
        else:
            j = np.argmax([b.estimated_mean for b in bandits])

        reward = bandits[j].pull()
        bandits[j].update(reward)
        rewards[i] = reward

    cumulative_average = np.cumsum(rewards) / (np.arange(N) + 1)

    plt.plot(cumulative_average)
    plt.xlabel("試行回数")
    plt.ylabel("平均報酬")
    plt.title(f"ε = {epsilon}")
    plt.show()

    for i, b in enumerate(bandits):
        print(f"Bandit {i}: 推定値 = {b.estimated_mean:.4f}, 本当の平均 = {b.true_mean}")

run_experiment(epsilon=0.1, bandit_probs=[1.0, 2.0, 3.0])

💡 応用分野まとめ

分野 具体例 説明
オンライン広告 バナーの表示選択 クリック率を最大化する広告表示
UI最適化 ボタン色や文言のテスト A/Bテストの自動化版
ECサイト レコメンド表示 売れる商品を探索・活用
医療 治験での治療法選択 効果の高い治療法を優先しつつ探索も行う
教育 出題問題の最適化 効果的な学習問題を出題
ゲームAI 戦略選択 ゲームプレイ時の行動最適化
ロボティクス 操作戦略選択 効率の良い動作選択

🤖 LLM(大規模言語モデル)への応用

バンディットアルゴリズムは、LLMのような動的かつ複雑な環境でも以下のように使われます。

🔄 応答ランキングの最適化(RLHF)

  • LLMが複数の応答案を生成 → 人間のフィードバックにより評価
  • 各応答案を「腕」として、報酬に基づき次回出力を最適化

⚖️ ツール/API選択の最適化

  • LLMが複数のツールを使える場合、どのツールが有効かを逐次学習
  • バンディットで選択と学習を並行して行う

📖 Few-shotプロンプトの最適化

  • 複数のプロンプト例からベストなものを見つけて活用

✨ なぜLLMと相性が良いのか?

特徴 理由
試行が可能 LLMは何度でも出力できるため探索が容易
報酬が不確実 人間評価など曖昧な報酬を扱うのに適している
計算が軽量 他の深層学習に比べてバンディットは軽い

🔹 まとめ

  • バンディット問題は、限られた資源の中で最適な意思決定をするためのフレームワーク
  • 現実世界の広告、医療、教育、そして最新のLLM応用まで幅広く活用されている
  • 初心者でもε-greedyなどから学びやすく、実装もシンプル!

さらに深掘りしたい方には、Thompson SamplingやContextual Banditの実装もおすすめです。
気になる方はぜひコメントやメッセージをください!

Discussion