AI時代系列(3) 機器學習三部曲: 📘 第三部:《強化學習 —— AI 的決策與進化》
29/100 第三週:📌 蒙地卡羅方法(Monte Carlo Methods)
29.模擬遊戲實作:21 點 BlackJack 🃏 訓練會算牌的 AI!
_______________________________________
🎯 單元導讀:
在理論學習了蒙地卡羅控制法後,現在是時候實戰演練!
我們選擇經典遊戲《Blackjack(21 點)》來進行模擬訓練,目標是:
✅ 透過蒙地卡羅學習,讓 AI 學會何時該「要牌」或「停牌」,最大化勝率!
這不只是遊戲,更是強化學習策略訓練的絕佳練習場!
________________________________________
🧠 一、什麼是 Blackjack?
Blackjack 的基本規則簡單明確:每輪開始玩家會獲得兩張起始牌,之後可以選擇「要牌」(拿一張新牌)或「停牌」(停止拿牌)。若手中點數超過 21 點則稱為爆牌,立即輸掉該局。遊戲不僅取決於自己的手牌點數,莊家的明牌與行為規則同樣影響勝負,因此在設計學習模型時,必須將「對手資訊」也納入決策考量。這樣的完整資訊與決策平衡,正好適合強化學習訓練策略選擇能力。
________________________________________
🧪 二、使用 OpenAI Gym 環境
Gym 提供了內建的 Blackjack-v1 環境:
pip install gym
環境特性:
• observation: tuple of (player sum, dealer’s visible card, usable ace)
• action: 0 = 停牌(stick), 1 = 要牌(hit)
________________________________________
💻 三、完整實作:First-Visit MC Control(On-policy)
python
import gym
import numpy as np
from collections import defaultdict
env = gym.make("Blackjack-v1")
def epsilon_greedy(Q, state, n_actions, epsilon):
if np.random.rand() < epsilon:
return np.random.randint(n_actions)
else:
return np.argmax(Q[state])
def mc_control_blackjack(num_episodes=500_000, gamma=1.0, epsilon=0.1):
Q = defaultdict(lambda: np.zeros(env.action_space.n))
returns = defaultdict(list)
for _ in range(num_episodes):
episode = []
state = env.reset()
done = False
while not done:
action = epsilon_greedy(Q, state, env.action_space.n, epsilon)
next_state, reward, done, _, _ = env.step(action)
episode.append((state, action, reward))
state = next_state
G = 0
visited = set()
for state, action, reward in reversed(episode):
G = gamma * G + reward
if (state, action) not in visited:
returns[(state, action)].append(G)
Q[state][action] = np.mean(returns[(state, action)])
visited.add((state, action))
return Q
這段程式碼利用蒙地卡羅控制(MC-Control)搭配 ε-greedy 策略來訓練 Blackjack 智能體。每次完整執行一場遊戲,記錄所有 (state, action, reward) 序列,並透過回溯累加回報 G 來更新 Q 值。採用 First-Visit 策略,避免重複更新同一回合內的相同行為,並用多次觀察到的回報平均值來穩定 Q 值估計。透過 ε-greedy 策略平衡探索與利用,AI 逐漸學會在不同手牌與莊家資訊下,什麼時候該要牌、什麼時候該停牌,最終形成穩定的決策策略。
________________________________________
📊 四、訓練後結果觀察(視覺化)
python
import matplotlib.pyplot as plt
def plot_policy(Q):
usable_ace = np.zeros((10, 10))
no_usable_ace = np.zeros((10, 10))
for player_sum in range(12, 22):
for dealer_card in range(1, 11):
state_1 = (player_sum, dealer_card, True)
state_2 = (player_sum, dealer_card, False)
usable_ace[player_sum - 12, dealer_card - 1] = np.argmax(Q[state_1])
no_usable_ace[player_sum - 12, dealer_card - 1] = np.argmax(Q[state_2])
fig, axs = plt.subplots(1, 2, figsize=(12, 5))
axs[0].imshow(usable_ace, cmap="gray")
axs[0].set_title("可用 A(usable ace)")
axs[1].imshow(no_usable_ace, cmap="gray")
axs[1].set_title("不可用 A(no usable ace)")
plt.show()
• 黑色格子代表「停牌」策略,白色代表「要牌」
• 可以觀察 AI 是否學會正確的行為選擇
這段程式碼用來將蒙地卡羅學習得到的 Q 值視覺化,幫助觀察 AI 在不同狀態下學會了什麼策略。plot_policy(Q) 函式會分別繪製在**有可用 A(usable ace)與沒有可用 A(no usable ace)**的兩種情況下,當玩家手牌總和為 12 到 21、莊家明牌為 1 到 10 的所有狀態,AI 選擇的動作。
對每個狀態,透過 np.argmax(Q[state]) 取出 AI 在該狀態下學到的最佳動作(0 代表停牌,1 代表要牌)。最後透過 matplotlib 繪製出灰階圖像,其中黑色格子代表 AI 選擇「停牌」,白色格子代表「要牌」。從圖像中可以清楚觀察 AI 在不同手牌與莊家情境下是否學會正確的策略,例如當玩家手牌總和大且莊家弱時應選擇停牌,當手牌小或莊家強時偏向要牌,這是驗證學習結果的重要工具。
________________________________________
🎮 五、訓練觀察與啟發
在蒙地卡羅學習過程中,AI 的策略會經歷逐步演變。初期因樣本不足,策略混亂且高度依賴探索;隨著經驗累積與 G 值平均,AI 逐漸形成穩定的 Q 值與較佳策略。在面對強莊家時,AI 會學會降低要牌風險,增加停牌的機率,以避免爆牌;而當手中有可用 A(軟牌)時,因具備超過 21 點時仍可轉換成 1 點的緩衝優勢,AI 更敢於採取積極的要牌行動。這些現象正反映出強化學習逐步學習環境風險與機會的能力。
________________________________________
🧩 六、延伸任務與思考
1️⃣ 將 ε 改為遞減,觀察收斂效果是否更穩定?
當 ε 固定時,後期仍持續有固定比例的隨機探索,可能在已經學到穩定策略後仍不必要地嘗試次優行動,影響穩定性。若改用遞減 ε(例如 ε = max(ε_min, ε × decay_rate)),則在初期大量探索、後期專注利用,可以加快收斂速度,讓 Q 值波動更小,策略更穩定。但若遞減太快,也可能早早陷入次優解,因此需要設計合理的衰減速度。
2️⃣ 嘗試用 Every-Visit MC 控制法,與 First-Visit 成效比較
First-Visit MC 每個 (state, action) 在一個 episode 內只更新第一次出現的樣本,能避免重複樣本偏差,收斂較穩定;而 Every-Visit MC 則對該 episode 內出現多次的 (state, action) 都進行更新,利用樣本數更多,學習速度通常較快,但若樣本變異性高,可能導致收斂過程震盪較大。兩者各有優缺點,實務上可依任務特性選擇。
3️⃣ 如果想讓 AI 學會「數牌」,你會如何增加觀察資訊?
目前的 state 只包含玩家手牌總點、莊家明牌與是否有 usable ace,無法反映牌堆剩餘牌型。若要讓 AI 學會「數牌」,可將牌堆中剩餘牌的資訊納入狀態表示,例如:
增加「已發出高牌 / 低牌的比例」作為額外狀態特徵;
設計簡化版的 running count;
使用部分可觀測記憶模擬卡牌流失情況。
如此 AI 不僅根據當前手牌做決策,也能依整體牌堆狀況調整策略,真正模擬人類數牌技巧。
________________________________________
✅ 七、小結與啟示:
• Blackjack 是強化學習中最經典的 MC 控制實驗平台
• 不需要模型,只靠試錯與統計就能學會接近最優策略
• 強化學習訓練出的策略會自動形成「算牌般」的邏輯行為
• 能有效理解 ε-Greedy、Q 值更新與 episode 累積報酬的實作方法!