多拉桿老虎機

使用 Python 的 Gymnasium 進行強化學習

Fouad Trad

Machine Learning Engineer

多拉桿老虎機

 

  • 賭徒面對多台老虎機
  • 目標 → 最大化中獎
  • 解法 → 探索/利用

一名男子面對一排老虎機的圖片

使用 Python 的 Gymnasium 進行強化學習

老虎機設定

顯示 4 台老虎機有不同中獎機率:45%、35%、85%、62%,且使用者未知的圖片。

  • 每次拉桿的回饋為 0 或 1
  • 代理的目標 → 累積最大奖勵
使用 Python 的 Gymnasium 進行強化學習

問題求解

 

  • 衰減式 epsilon-greedy
  • epsilon → 隨機選機台

示意圖:以機率 epsilon 進行探索,隨機選擇一台機器。

使用 Python 的 Gymnasium 進行強化學習

問題求解

 

  • 衰減式 epsilon-greedy
  • epsilon → 隨機選機台
  • 1 - epsilon → 選目前最佳機台
  • epsilon 隨時間遞減

示意圖:以機率 epsilon 探索,隨機選機台;以機率 1 - epsilon 利用,選擇已知最佳機台。

使用 Python 的 Gymnasium 進行強化學習

初始化

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) # How many times each bandit was played
values = np.zeros(n_bandits) # Estimated winning probability of each bandit
rewards = np.zeros(n_iterations) # Reward history
selected_arms = np.zeros(n_iterations, dtype=int) # Arm selection history
使用 Python 的 Gymnasium 進行強化學習

互動迴圈

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 進行強化學習

選擇分析

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


流程第一步:建立大小為 (iterations, n_bandits) 的全零陣列。

使用 Python 的 Gymnasium 進行強化學習

選擇分析

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

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

流程第二步:在每次迭代中,將被選中的拉桿於陣列中標記為 1。

使用 Python 的 Gymnasium 進行強化學習

選擇分析

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 進行強化學習

選擇分析

  各機台的 selections_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 進行強化學習

一起來練習吧!

使用 Python 的 Gymnasium 進行強化學習

Preparing Video For Download...