AI時代系列(3) 機器學習三部曲: 📘 第三部:《強化學習 —— AI 的決策與進化》
23/100 第三週:📌 蒙地卡羅方法(Monte Carlo Methods)
23.從遊戲中學策略 🎮 AlphaGo 的基礎就是這個!
________________________________________
🎯 單元導讀:
在遊戲世界中,沒有現成答案能告訴 AI「哪一步一定對」。
那麼,AI 是怎麼學會打敗人類高手的?
答案就是:
從大量遊戲中累積經驗 → 蒙地卡羅方法 → 學出最強策略!
AlphaGo 的早期訓練階段,就是結合「自我對弈」與「蒙地卡羅控制(MC Control)」來逐步逼近最優策略。這種方法不靠老師、不用標籤,靠的全是自己玩出來的智慧。
________________________________________
🧠 一、什麼是蒙地卡羅控制(MC Control)?
控制(Control)與評估(Evaluation)的差別在於:
• 評估:只估算「給定策略 π」的好壞
• 控制:不只要評估,還要不斷改進策略 π → π' → π'',直到學出最好的!
🎯 目標:學會最優策略 π*
透過試錯模擬 + 回報統計 + Epsilon-Greedy 探索,不斷提升策略!
________________________________________
📦 二、MC 控制的核心流程(以 ε-Greedy 為例)
graph LR
A[初始化 π 隨機策略] --> B[執行多次 Episode]
B --> C[累積 Gt 更新 Q(s,a)]
C --> D[更新策略 π 為 ε-Greedy(Q)]
D --> B
步驟如下:
1️⃣ 執行策略 π 產生 episode
2️⃣ 對每個狀態-動作對 (s, a) 統計其回報 Gt
3️⃣ 更新動作價值函數 Q(s, a) ← 平均 Gt
4️⃣ 用 ε-Greedy 選擇行動,鼓勵探索新選項
5️⃣ 重複以上步驟,策略逐步逼近最優!
這個流程描述了**蒙地卡羅控制(MC Control)*的學習過程。首先,從一個隨機初始化的策略 π 開始,透過反覆執行多次完整的 episode 收集經驗。在每次 episode 中,對所有出現的狀態-動作對 (s, a) 計算其累積折扣報酬 Gₜ,並用平均 Gₜ 來更新動作價值函數 Q(s, a)。接著,使用 ε-Greedy 策略根據最新的 Q 值來選擇行動,在 exploitation 與 exploration 之間平衡,持續探索新可能的路徑。透過不斷重複這個過程,策略 π 會逐漸收斂,最終逼近最優策略 π,實現最佳決策行為。
________________________________________
🔁 三、Q 值更新公式
Q(s,a) {平均所有該對 (s,a) 的 G_t}
若用增量式更新,可寫成:
Q(s,a)←Q(s,a)+α[Gt−Q(s,a)]
其中:
• G:該次 episode 中從 (s,a) 開始的累積報酬
• α:學習率
________________________________________
🎮 四、AlphaGo 是怎麼用的?
階段 描述 技術
初期訓練 用人類棋譜訓練策略網路 監督學習(SL Policy Network)
中期進化 自我對弈 + 蒙地卡羅樹搜尋(MCTS) 蒙地卡羅控制方法
決策下棋 用 MCTS 根據局勢評估未來勝率 結合策略網路與價值網路
📌 AlphaGo 雖非純 MC 控制,但其核心概念「透過自我對弈學出策略」源自蒙地卡羅法!
________________________________________
💻 五、簡易實作框架(MC Control + ε-Greedy)
python
import numpy as np
from collections import defaultdict
def epsilon_greedy_policy(Q, state, n_actions, epsilon):
if np.random.rand() < epsilon:
return np.random.randint(n_actions)
else:
return np.argmax(Q[state])
Q = defaultdict(lambda: np.zeros(env.action_space.n))
returns = defaultdict(list)
for episode in range(num_episodes):
state = env.reset()
episode_data = []
done = False
while not done:
action = epsilon_greedy_policy(Q, state, env.action_space.n, epsilon)
next_state, reward, done, _ = env.step(action)
episode_data.append((state, action, reward))
state = next_state
G = 0
visited = set()
for state, action, reward in reversed(episode_data):
G = reward + gamma * G
if (state, action) not in visited:
returns[(state, action)].append(G)
Q[state][action] = np.mean(returns[(state, action)])
visited.add((state, action))
這段程式碼實現了**First-Visit 蒙地卡羅控制(MC Control)**的學習流程。首先定義 epsilon_greedy_policy 函式,讓智能體在每個狀態中以 ε-Greedy 策略在探索(隨機選擇)與利用(選擇當前 Q 值最大的動作)間平衡。對每個 episode,從環境重置後開始互動,持續依據策略選擇行動,並記錄每一筆 (state, action, reward) 資料直到回合結束。
當回合完成後,反向回溯整個 episode,計算每個 (state, action) 對應的累積報酬 G。利用 visited 集合確保在同一回合中每個 (state, action) 只統計第一次出現的 G 值(First-Visit MC 核心特徵),避免重複樣本偏誤。最後,將 G 累加進 returns 中,並以所有 G 值的平均作為該狀態-動作對 Q 值的估計。隨著多次 episode 累積,Q 值逐漸收斂,學出最佳策略。
________________________________________
🧩 六、挑戰與反思任務:
1️⃣ 為何 AlphaGo 初期不直接用強化學習,而要先從監督學習開始?
原因:
• 圍棋狀態空間極大,若一開始用強化學習從零探索,學習效率非常低,且容易陷入隨機亂走的低價值區域。
• 透過監督學習,先利用大量專業棋譜訓練出「模仿人類高手」的初始策略網路,快速建立合理基礎策略,讓後續強化學習有良好起點(即縮小探索空間,避免完全隨機)。
• 初期監督學習就像「先站在巨人肩膀上」,後續透過自我對弈的強化學習繼續優化、超越人類高手,成為 AlphaGo 突破的關鍵路徑設計。
________________________________________
2️⃣ ε-Greedy 探索機制的優點與風險是什麼?你會如何設計 ε 的變化曲線?
優點:
• 操作簡單、易於實作
• 保證每個行動都有被探索的機會(避免陷入早期錯誤固定策略)
風險:
• 若 ε 太高,容易長期做出過多隨機探索,浪費資源影響學習穩定性
• 若 ε 太低,容易太早過度利用現有知識,導致探索不足,陷入次優策略
ε 設計建議:
• 衰減式 ε (ε-decay)
o 例如初期設 ε = 1(完全隨機探索),隨訓練回合逐漸指數衰減:
ε = ε_min + (ε_start - ε_min) * exp(-decay_rate * episode)
o 讓探索從大量嘗試 → 逐步集中到穩定策略
• 固定下限 ε_min:避免學習後期仍保留少量探索(如 ε_min = 0.01)
________________________________________
3️⃣ 自我對弈是否有可能陷入「錯誤的策略迴圈」?如何避免?
確實有可能。
若智能體在自我對弈初期學到某些不合理但「互相能夠平衡」的次優策略組合,兩邊互相強化彼此的錯誤選擇,就會形成所謂的「錯誤策略迴圈(Self-reinforcing suboptimal loop)」。
避免方法:
• 多樣性探索:保留一定 ε-Greedy 探索比例,偶爾嘗試未曾出現的行動
• 引入外部樣本:適當參考人類高手棋譜或歷史數據,打破封閉性自我學習陷阱
• 隨機對手訓練:在訓練對手策略中注入隨機化成分,增加環境變異性
• 對抗訓練 (Adversarial Training):設計讓對手策略持續進化,提升策略穩健性
________________________________________
✅ 七、小結與啟示:
• 蒙地卡羅控制法讓 AI 可以「從玩中學」,不依賴人類標籤
• AlphaGo 的核心訓練之一就是讓 AI 反覆與自己對弈並逐步優化策略
• MC 控制結合 Q 值估算與 ε-Greedy 策略改進,是強化學習中最早的「策略進化法」之
• 為後續 Q-Learning、Actor-Critic 打下基礎!