AI時代系列(3) 機器學習三部曲: 📘 第三部:《強化學習 —— AI 的決策與進化》
48/100 第五週:📌 Deep Q-Network(DQN)與深度強化學習入門
48.DQN 訓練技巧與超參數調整 ⚙️ 學會讓模型更快收斂!
_______________________________________
🎯 單元導讀
DQN 架構雖強大,但若沒有妥善的訓練策略與參數調校,
容易出現 不收斂、震盪、陷入局部最優 等問題。
本單元整理了 DQN 訓練時常見的技巧與超參數調整指南,
幫助你打造一個「穩定、高效、泛化力強」的強化學習模型!
________________________________________
🧠 一、常見超參數總覽表
- γ(折扣因子):0.95 ~ 0.99 → 控制未來獎勵的重要性
- α / lr(學習率):1e-4 ~ 1e-3 → 神經網路更新步伐
- ε 初始值:1.0 → 完全探索(random)
- ε 最小值:0.01 ~ 0.1 → 保留部分探索行為
- ε 衰減速率:0.995 ~ 0.999 → 每步逐漸減少 ε 值
- Replay Buffer 大小:10⁴ ~ 10⁶ → 儲存過去經驗的容量
- Batch Size:32 ~ 128 → 每次學習所抽樣資料數量
- Target Network 更新頻率:每 1000 ~ 10000 步 → 控制學習穩定性關鍵參數
- Gradient Clipping:10.0 → 限制梯度範圍,防止梯度爆
________________________________________
🔁 二、訓練技巧總整理
✅ 1. 使用 ε-Greedy + 衰減策略
• 初始以完全隨機行動探索環境
• 隨時間慢慢轉為根據 Q 值選擇最優動作
• 可用線性、指數或階段式衰減方式控制 ε 值下降速度
✅ 2. 使用 Gradient Clipping
為了避免反向傳播時梯度過大導致爆炸:
python
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=10)
在反向傳播後,限制所有參數梯度的總範數不超過指定值,防止梯度爆炸,穩定訓練過程。
________________________________________
✅ 3. Replay Buffer 預熱(warm-up)
不要一開始就訓練模型,應先收集足夠經驗:
python
if len(buffer) < min_buffer_size:
continue # 先觀察一段時間,避免過擬合初始資料
當經驗回放緩衝區 buffer 還沒累積到足夠樣本(小於 min_buffer_size)時,先跳過訓練,避免模型在早期資料過少且偏態明顯時學到不穩定或過擬合的錯誤策略。
________________________________________
✅ 4. 使用 Huber Loss 取代 MSE Loss
Huber Loss 對異常值更穩定,能改善 TD 誤差過大導致震盪的問題:
python
loss = nn.SmoothL1Loss()(predicted_q, target_q)
使用 Smooth L1 Loss(又稱 Huber Loss) 來計算預測 Q 值 predicted_q 與目標 Q 值 target_q 之間的誤差,結合了均方誤差 (MSE) 和絕對誤差 (MAE) 的優點,對異常值較不敏感,能提升學習穩定性。
________________________________________
✅ 5. 正確初始化神經網路
避免權重初始化過小或過大,常用方式:
• Xavier / He initialization
• 使用 PyTorch 預設 nn.Linear() 通常已可接受
________________________________________
✅ 6. 增加觀測穩定性
若輸入是影像資料,建議:
• 使用 畫面下採樣(如 84×84 灰階)
• 使用 frame stacking(多張圖像合併,模擬記憶)
________________________________________
🧪 三、訓練流程建議範例
python
for step in range(total_steps):
# 1. ε-Greedy 選擇動作
if random.random() < ε:
action = env.sample()
else:
action = argmax(Q(state))
# 2. 執行動作、收集資料
next_state, reward, done = env.step(action)
buffer.append((state, action, reward, next_state, done))
# 3. 預熱期間不訓練
if len(buffer) < batch_size:
continue
# 4. 隨機取樣訓練
transitions = random.sample(buffer, batch_size)
# 5. 計算 TD 目標並反向傳播
# 6. 每隔一定步數同步 Target Network
# 7. ε 衰減
ε = max(ε_min, ε * ε_decay)
在整個訓練循環中,智慧體每一步透過 ε-Greedy 策略在隨機探索與現有 Q 值最佳行動間做選擇,執行動作後收集新狀態、回饋與終止訊號,並存入經驗回放緩衝區。當緩衝區樣本數累積足夠後,隨機抽取小批次樣本進行訓練,計算 TD 目標誤差並反向傳播更新模型,期間定期同步 Target Network 以穩定學習,並隨訓練逐漸衰減 ε,降低隨機性、提高利用已學知識的比例。
________________________________________
📊 四、觀察訓練是否有效的指標
在強化學習訓練過程中,可透過多個指標監控學習效果:首先觀察 Episode Reward 曲線 是否隨訓練逐步上升並趨於穩定,代表整體策略在進步;其次檢查 Loss 曲線 是否收斂穩定,避免出現劇烈震盪影響學習穩定性;再者,觀察 ε 值變化,確認是否順利從早期大量探索逐步過渡到後期主要利用已學知識;最後分析 Q 值分布,檢查是否有持續偏高或偏低的現象,以避免過度高估或低估狀態價值,確保模型預測合理可靠。
________________________________________
🔍 五、生活中的訓練類比
例子 1:健身訓練計畫 🏋️
在健身初期,你可能會嘗試不同器材與方法(探索 ε 高),但隨著經驗累積,會專注於最有效的動作(利用 ε 低)。這就像 DQN 的探索與利用平衡。
例子 2:學習語言 📚
學新語言時,不會每天改教材(就像 Target Network 不是每天更新),而是定期檢討進度,調整學習方向。這種「固定一段時間再更新」能讓學習更穩定。
例子 3:準備考試 ✍️
複習時,你不只看最新的題目,而是從筆記或歷屆試題中隨機抽題練習(Replay Buffer),避免偏向單一經驗,讓知識更全面、學習更穩固。
________________________________________
✅ 六、小結與啟示
• 調參是強化學習成功與否的關鍵!
• 訓練過程要穩、參數要合、資料要多樣
• 使用合適的技巧能有效提升收斂速度與策略品質
• 和人生一樣:穩定學習 + 定期檢討 + 持續微調 → 最終通往最優策略!