多腕バンディット

Pythonで学ぶGymnasiumによるReinforcement Learning

Fouad Trad

Machine Learning Engineer

多腕バンディット

 

  • スロットに向き合うギャンブラー
  • 課題 → 勝率最大化
  • 解法 → 探索と活用の両立

男性がスロットマシンの列に向き合っている画像

Pythonで学ぶGymnasiumによるReinforcement Learning

スロットマシン

4つのスロットに未知の勝率45%、35%、85%、62%がある図。

  • 各腕の報酬は0または1
  • 目標 → 報酬の総和を最大化
Pythonで学ぶGymnasiumによるReinforcement Learning

問題の解法

 

  • 減衰付きε-greedy
  • ε → ランダムに選択

確率εでランダムに探索してマシンを選ぶ図。

Pythonで学ぶGymnasiumによるReinforcement Learning

問題の解法

 

  • 減衰付きε-greedy
  • ε → ランダムに選択
  • 1−ε → 現時点の最良を選択
  • εは時間とともに減少

確率εでランダムに探索し、1−εで既知の最良を活用して選択する図。

Pythonで学ぶGymnasiumによるReinforcement Learning

初期化

n_bandits = 4  
true_bandit_probs = np.random.rand(n_bandits)

n_iterations = 100000 epsilon = 1.0 min_epsilon = 0.01 epsilon_decay = 0.999
counts = np.zeros(n_bandits) # 各バンディットの試行回数
values = np.zeros(n_bandits) # 各バンディットの推定勝率
rewards = np.zeros(n_iterations) # 報酬履歴
selected_arms = np.zeros(n_iterations, dtype=int) # 選択履歴(腕)
Pythonで学ぶGymnasiumによるReinforcement Learning

相互作用ループ

for i in range(n_iterations):
    arm = epsilon_greedy()

reward = np.random.rand() < true_bandit_probs[arm]
rewards[i] = reward selected_arms[i] = arm counts[arm] += 1
values[arm] += (reward - values[arm]) / counts[arm]
epsilon = max(min_epsilon, epsilon * epsilon_decay)
Pythonで学ぶGymnasiumによるReinforcement Learning

選択の分析

selections_percentage = np.zeros((n_iterations, n_bandits))


プロセスの最初のステップを示す図:(iterations, n_bandits)サイズの配列を0で初期化。

Pythonで学ぶGymnasiumによるReinforcement Learning

選択の分析

selections_percentage = np.zeros((n_iterations, n_bandits))

for i in range(n_iterations): selections_percentage[i, selected_arms[i]] = 1

プロセスの第2ステップを示す図:各反復で選ばれた腕を配列内で1としてマーク。

Pythonで学ぶGymnasiumによるReinforcement Learning

選択の分析

selections_percentage = np.zeros((n_iterations, n_bandits))

for i in range(n_iterations): selections_percentage[i, selected_arms[i]] = 1
selections_percentage = np.cumsum(selections_percentage, axis=0) / np.arange(1, n_iterations + 1).reshape(-1, 1)

最終ステップの図:選択回数の累積和を取り、反復数で割って各反復の腕の選択割合を得る。

Pythonで学ぶGymnasiumによるReinforcement Learning

選択の分析

  各バンディットのselection_percentage曲線。反復が進むと、エージェントは#2をより多く選ぶ傾向を示す。

for arm in range(n_bandits):
    plt.plot(selections_percentage[:, arm], label=f'Bandit #{arm+1}')
plt.xscale('log')
plt.title('Bandit Action Choices Over Time')
plt.xlabel('Episode Number')
plt.ylabel('Percentage of Bandit Selections (%)')
plt.legend()
plt.show()

for i, prob in enumerate(true_bandit_probs, 1): print(f"Bandit #{i} -> {prob:.2f}")
Bandit #1 -> 0.37
Bandit #2 -> 0.95
Bandit #3 -> 0.73
Bandit #4 -> 0.60
  • エージェントは最も高い確率のバンディットを選ぶよう学習
Pythonで学ぶGymnasiumによるReinforcement Learning

Let's practice!

Pythonで学ぶGymnasiumによるReinforcement Learning

Preparing Video For Download...