🦔
バンディットアルゴリズム入門:強化学習の基本と応用
🌐 バンディットアルゴリズムとは?
バンディットアルゴリズム(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