Lee93whut commited on
Commit ·
34ad2cc
1
Parent(s): 10926f0
refactor(model): update architecture docs and set dueling as default algorithm
Browse files- model.py: add CNN vs MLP selection rationale, receptive field analysis,
correct DuelingDQN conclusion from R1 (45%) to R4 final (84% Holdout)
- config.yaml: switch default algorithm double -> dueling (R4 ablation best)
- config.yaml +3 -3
- src/model.py +14 -3
config.yaml
CHANGED
|
@@ -29,10 +29,10 @@ dqn:
|
|
| 29 |
|
| 30 |
# ── Algorithm variant ─────────────────────────────────────────────────
|
| 31 |
# vanilla : DQNNetwork + Vanilla Target (Mnih et al., 2015)
|
| 32 |
-
# double : DQNNetwork + Double DQN (van Hasselt et al., AAAI 2016)
|
| 33 |
-
# dueling : DuelingDQN + Vanilla Target (Wang et al., 2016)
|
| 34 |
# double_dueling : DuelingDQN + Double DQN (两项改进正交叠加)
|
| 35 |
-
algorithm: "
|
| 36 |
|
| 37 |
# ── Replay Buffer ────────────────────────────
|
| 38 |
buffer_capacity: 80000 # max transitions stored (ring-list, O(batch_size) sampling)
|
|
|
|
| 29 |
|
| 30 |
# ── Algorithm variant ─────────────────────────────────────────────────
|
| 31 |
# vanilla : DQNNetwork + Vanilla Target (Mnih et al., 2015)
|
| 32 |
+
# double : DQNNetwork + Double DQN (van Hasselt et al., AAAI 2016)
|
| 33 |
+
# dueling : DuelingDQN + Vanilla Target (Wang et al., 2016) ← 最优(R4 Holdout 84%)
|
| 34 |
# double_dueling : DuelingDQN + Double DQN (两项改进正交叠加)
|
| 35 |
+
algorithm: "dueling"
|
| 36 |
|
| 37 |
# ── Replay Buffer ────────────────────────────
|
| 38 |
buffer_capacity: 80000 # max transitions stored (ring-list, O(batch_size) sampling)
|
src/model.py
CHANGED
|
@@ -19,6 +19,17 @@
|
|
| 19 |
* Flatten 后接两层全连接,避免参数量随 N² 爆炸时 FC 层过大。
|
| 20 |
* 权重初始化:Conv 层用 Kaiming Normal(ReLU 最优),FC 层用 Xavier Uniform。
|
| 21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
验收断言(直接运行本文件)::
|
| 23 |
|
| 24 |
python src/model.py
|
|
@@ -118,9 +129,9 @@ class DuelingDQNNetwork(nn.Module):
|
|
| 118 |
|
| 119 |
相比 DQNNetwork 的优势:在大多数迷宫格子中,各动作的相对优劣差距很小
|
| 120 |
("往目标走"总是最优),此时 V(s) 可独立精确学习而无需每个动作都更新,
|
| 121 |
-
理论上参数效率更高
|
| 122 |
-
Holdout 成功率
|
| 123 |
-
分解
|
| 124 |
|
| 125 |
Args:
|
| 126 |
grid_size: 迷宫边长 N,决定 Flatten 后的特征维度。
|
|
|
|
| 19 |
* Flatten 后接两层全连接,避免参数量随 N² 爆炸时 FC 层过大。
|
| 20 |
* 权重初始化:Conv 层用 Kaiming Normal(ReLU 最优),FC 层用 Xavier Uniform。
|
| 21 |
|
| 22 |
+
架构选型论证
|
| 23 |
+
------------
|
| 24 |
+
* **CNN vs MLP**:观测为 (4, N, N) 结构化网格,CNN 具有平移等变性——"墙在左、目标在右"的
|
| 25 |
+
空间关系无论出现在地图何处,同一 filter 均可检测,参数效率优于 MLP。MLP 需要
|
| 26 |
+
将所有位置的空间关系独立学习,在随机起终点设定下泛化更差。
|
| 27 |
+
* **感受野分析**:三层 3×3 Conv(无 stride/pool)的理论感受野 = 3 + 2×(3-1) = 7×7。
|
| 28 |
+
对 10×10 迷宫,7×7 感受野无法覆盖全图(对角线距离约 14 格);但 Flatten 后接的
|
| 29 |
+
全连接层将所有位置特征全局混合,弥补了 CNN 局部感受野的不足。Flatten→FC 的
|
| 30 |
+
全局聚合使网络实际上能对全图状态建模,纯感受野计算低估了该架构的全局感知能力。
|
| 31 |
+
若迁移至更大迷宫(≥20×20),建议在第三层 Conv 后加 stride=2 或 Global Average Pooling。
|
| 32 |
+
|
| 33 |
验收断言(直接运行本文件)::
|
| 34 |
|
| 35 |
python src/model.py
|
|
|
|
| 129 |
|
| 130 |
相比 DQNNetwork 的优势:在大多数迷宫格子中,各动作的相对优劣差距很小
|
| 131 |
("往目标走"总是最优),此时 V(s) 可独立精确学习而无需每个动作都更新,
|
| 132 |
+
理论上参数效率更高。本项目完整消融实验(随机起终点,10×10 迷宫,R4 最终结果)
|
| 133 |
+
证实了这一优势:Dueling DQN Holdout 成功率 84%,优于 Double DQN(78%)和
|
| 134 |
+
Double+Dueling(81%),V/A 分解与迷宫"多动作等效"状态高度适配。
|
| 135 |
|
| 136 |
Args:
|
| 137 |
grid_size: 迷宫边长 N,决定 Flatten 后的特征维度。
|