AI時代系列(3) 機器學習三部曲: 📘 第三部:《強化學習 —— AI 的決策與進化》
47/100 第五週:📌 Deep Q-Network(DQN)與深度強化學習入門
47.Dueling DQN 架構 💥 將狀態價值與動作優勢分開估算!
________________________________________
🎯 單元導讀
在傳統 DQN 中,神經網路會直接學出每個動作的 Q 值:
Q(s, a) → 表示在狀態 s 下,執行動作 a 的預期總報酬
但在某些情境中,有些動作的選擇幾乎不影響總價值,例如在安全區內左右移動的差異不大。
這時,若硬是學所有動作的 Q 值,反而會干擾學習進度。
Dueling DQN 是一種改良架構,它將 Q 值拆解為兩部分:
• 狀態價值 V(s)
• 動作優勢 A(s, a)
讓神經網路能更有效率地學習「狀態好壞」與「動作差異」!
________________________________________
🧠 一、Dueling DQN 的核心觀念
Dueling 架構將 Q 函數拆解為:
Q(s, a) = V(s) + A(s, a)
但這樣拆會造成問題:Q 值可能不唯一(因為任意常數可加到 A 上)
所以實務中使用以下修正公式:
Q(s, a) = V(s) + [A(s, a) - mean_a A(s, a)]
這樣能保證 A(s, a) 是「相對優勢」,可正可負且和為零。
________________________________________
🧱 二、神經網路架構改動
在傳統 DQN 中:
Input(s) → Shared Hidden Layers → Q(s, a)
在 Dueling DQN 中:
Input(s)
↓
Shared Hidden Layers
↓
分支一:估算 V(s)
分支二:估算 A(s, a)
↓
組合輸出 Q(s, a) = V(s) + (A(s, a) - mean(A(s, ·)))
這種架構讓模型即使在無法明確區分動作貢獻時,也能先學好整體狀態價值!
| 主要優點:
----------------------------------------
- 即使動作間貢獻難以分辨,仍能穩定學習狀態價值。
- 提高學習穩定性與效率。
- 對樣本利用更有效率,收斂更快。
________________________________________
🧪 三、PyTorch 架構範例
python
class DuelingDQN(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.shared = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU()
)
self.value_stream = nn.Sequential(
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 1)
)
self.advantage_stream = nn.Sequential(
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, action_dim)
)
def forward(self, x):
x = self.shared(x)
v = self.value_stream(x)
a = self.advantage_stream(x)
q = v + (a - a.mean(dim=1, keepdim=True))
return q
這段程式碼定義了一個 Dueling DQN 的神經網路結構。輸入為狀態向量 x,首先經過共享的隱藏層 self.shared,提取通用特徵。接著,特徵分別送入兩個不同的分支:
Value Stream:
Linear(128 -> 64) -> ReLU -> Linear(64 -> 1)
Advantage Stream:
Linear(128 -> 64) -> ReLU -> Linear(64 -> action_dim)
最後,兩個分支輸出合併成最終 Q 值
Q(s, a) = V(s) + [ A(s, a) - mean_A ]
其中:
mean_A = 平均所有動作的 A(s, a)
mean_A = sum(A(s, a)) / action_dim
這樣的結構可以讓模型即使在各動作貢獻難以分辨時,仍能先穩定學習整體狀態價值 V(s),提升學習穩定性與收斂速度。
________________________________________
📈 四、Dueling 架構的好處
優點 說明
更快速辨別「好狀態」 即使動作無明顯差異,也可單獨學到 V(s)
穩定訓練 對無區別性的動作具有更高容忍度
模型可解釋性提升 可明確區分狀態價值與動作優勢
________________________________________
📸 五、應用場景舉例
在許多實務場景中,Dueling DQN 架構特別適用,因為許多時候「動作之間的差異不明顯」。例如:
在遊戲內的非關鍵區域,無論選擇哪個動作,對狀態價值影響不大,此時重點在學好 V(s);
自駕車的巡航行駛階段,像是微幅轉向、輕微加減速,多數行動對整體狀態沒有明顯改變;
資產配置中,當多個投資組合在某個經濟狀態下的預期報酬相近,便可聚焦於估算整體的 V(s),而無需過度分辨 A(s, a)。
透過分離 V(s) 與 A(s, a),模型能更有效率地學習核心狀態價值,節省資源並提升學習穩定性。
________________________________________
🔍 六、生活中的類比與啟發
1️⃣ V(s) 像是你當下處境的總體價值
👉 例如「現在在學習AI」,就是一個高 V(s) 狀態
2️⃣ A(s, a) 像是在這個情境下的選項比較
👉 例如「是繼續讀書還是練習程式」,都在同個狀態下比較哪個行動更值得
3️⃣ 為何要扣除平均 A?
👉 就像要知道某個選項好不好,必須相對於「整體平均」才有意義!
________________________________________
✅ 七、小結與啟示
• Dueling DQN 拆解 Q(s, a) 成 V(s) + A(s, a),提升學習效率與穩定性
• 特別適合處理某些動作無明顯價值差異的環境
• 加強模型對「狀態好壞」與「動作優劣」的分離理解能力
• 有效提升訓練效果,並具備更好的泛化能力!