docs: clean up R3/R4 record and consolidate technical narrative
Browse filesThree rounds of documentation polish consolidated into one commit so the
log stays readable while the underlying facts and structure are corrected.
1) R3 hyperparameter record correction
- train.py never forwards distance_shaping_alpha to MazeEnv(), so R3's
effective alpha was 0 despite config.yaml listing 0.5. All prior
attribution of R3 +6pp to potential-based shaping is wrong.
- config.yaml: distance_shaping_alpha 0.5 -> 0.0 (with note that env
supports the param but train.py does not wire it)
- maze_env/env.py: mark the shaping branch as "never executed in current
training/eval pipeline" to prevent re-introduction
- hyperparameter_study / technical_report / experiment_log / README:
drop shaping from the R3 row, reframe P5 as "early Q-overestimation
crisis, root cause undetermined" (no shaping side-effect story)
2) EVAL-period direct measurement over training-period inference
- Promote the 2026-06-01 EVAL retest (Holdout 100 ep, greedy) to the
primary evidence for "loopping is R3's main failure mode" in
technical_report 6.3 and experiment_log R3 summary
- Add training-vs-EVAL cross-period table to make epsilon's marginal
contribution to loop suppression explicit
- Demote training-period truncation rates to a cross-period reference
3) Narrative consolidation
- technical_report: mirror the README "stages x metrics" indicator table
in 4.4; correct receptive-field formula to RF_l = RF_{l-1} + (k_l-1)*prod s_i
- README: restructure final results into hyperparam evolution (R1->R4,
vertical) then algorithm ablation (horizontal); collapse 11 highlights
to 5 that point readers to "core findings" for the long-form rationale
- hyperparameter_study: add Dueling 84.0% to the R4 row to disambiguate
A3 double (78%) from the cross-algo best (84%)
Net effect: R3->R4 attribution is now buffer+target+({P7,P8,visited_map})
only (no shaping contribution), and the failure-mode story rests on
direct EVAL measurement rather than inferred truncation rates.
Co-Authored-By: Lee93whut <30529279@qq.com>
- README.md +88 -51
- config.yaml +6 -2
- docs/experiment_log.md +103 -141
- docs/hyperparameter_study.md +3 -4
- docs/technical_report.md +39 -10
- maze_env/env.py +2 -0
- src/model.py +1 -1
|
@@ -20,45 +20,60 @@ license: mit
|
|
| 20 |
|
| 21 |
---
|
| 22 |
|
| 23 |
-
##
|
| 24 |
|
| 25 |
-
随机起终点 + 随机地图
|
| 26 |
-
本项目通过 **4 轮系统性消融**(超参调优 → 算法横评),将 Holdout 成功率提升至 **84%**(+23pp:超参调优 +17pp,61%→78%;算法切换至 Dueling DQN +6pp,78%→84%)。
|
| 27 |
|
| 28 |
-
|
| 29 |
|
| 30 |
-
|
| 31 |
|
| 32 |
---
|
| 33 |
|
| 34 |
## 最终结果
|
| 35 |
|
| 36 |
-
> **Holdout 评估**:100 张训练中从未见过的独立地图(seed+200000),ε=0 贪心推理。
|
| 37 |
-
> ⚠️ n=100 单次跑点,95% CI ≈ ±5pp;
|
| 38 |
|
| 39 |
-
###
|
| 40 |
|
| 41 |
-
|
| 42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
| 🥇 | **Dueling DQN** | **84.0%** | **0.817** | −6pp(泛化最稳) |
|
| 44 |
| 🥈 | Double + Dueling | 81.0% | 0.793 | −9pp |
|
| 45 |
| 🥉 | Double DQN | 78.0% | 0.773 | −10pp |
|
| 46 |
| 4️⃣ | Vanilla DQN | 75.0% | 0.726 | −19pp |
|
| 47 |
|
| 48 |
-
|
| 49 |
|
| 50 |

|
| 51 |
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
| 轮次 | 核心变更 | Holdout 成功率 | SPL |
|
| 55 |
-
|------|---------|:-------------:|:---:|
|
| 56 |
-
| Round 1 | 初版超参(`ep=2000`, `decay=0.995`) | 61.0% | 0.605 |
|
| 57 |
-
| Round 2 | `ep=6000`, `decay=0.9985` | 64.0% | 0.633 |
|
| 58 |
-
| Round 3 | `buffer=80k`, `target=1500`, `shaping=0.5` | 74.0% | 0.735 |
|
| 59 |
-
| **Round 4** | visited_map 4通道 + EVAL checkpoint + BFS 连通性 | **78.0%** | **0.773** |
|
| 60 |
|
| 61 |
-
|
| 62 |
|
| 63 |
---
|
| 64 |
|
|
@@ -74,7 +89,7 @@ license: mit
|
|
| 74 |
阶段二:超参消融(Round 1–4)
|
| 75 |
每轮只改一组变量,用问题诊断驱动下一轮变更
|
| 76 |
R1 → R2:修复训练量 + 探索衰减(单变量)
|
| 77 |
-
R2 → R3:修复 buffer + target
|
| 78 |
R3 → R4:修复 checkpoint 时序 + 连通性验证 + 状态编码
|
| 79 |
|
| 80 |
阶段三:算法横评(Round 4 续)
|
|
@@ -84,17 +99,33 @@ license: mit
|
|
| 84 |
|
| 85 |
**为什么先调超参再比算法**:先把超参调到最优,比的才是算法本身的能力差异;否则比的是"哪个算法对糟糕超参更鲁棒"。
|
| 86 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
完整逐轮记录见 [docs/experiment_log.md](docs/experiment_log.md)。
|
| 88 |
|
| 89 |
---
|
| 90 |
|
| 91 |
## 核心发现
|
| 92 |
|
| 93 |
-
### 发现一:
|
| 94 |
|
| 95 |
R4 首先尝试用 `revisit_penalty`(重复访问格子施加递进奖励惩罚)抑制推理时的循环行为,但训练至 ep=1000 时成功率仅 38%,持续低于基线 15pp,最终终止。
|
| 96 |
|
| 97 |
-
**根因**:Q-learning 的
|
| 98 |
|
| 99 |
**正确解法**:把历史信息从奖励空间移到状态空间。观测张量第四通道编码二值访问图(ch3=visited_map),Q 函数合法学习"已访问格价值低"的策略,马尔可夫性完整保持。
|
| 100 |
|
|
@@ -102,7 +133,7 @@ R4 首先尝试用 `revisit_penalty`(重复访问格子施加递进奖励惩
|
|
| 102 |
|
| 103 |
### 发现二:Dueling 架构与本任务的结构适配性
|
| 104 |
|
| 105 |
-
随机起终点迷宫中存在大量"多动作等效"状态(死胡同、走廊段),Dueling 的 V(s)/A(s,a) 分解使
|
| 106 |
|
| 107 |
实测证据:EVAL→Holdout Gap 仅 6pp(最小),而 Vanilla DQN 的 Gap 高达 19pp。
|
| 108 |
|
|
@@ -116,15 +147,19 @@ R3 用训练滚动奖励触发 checkpoint,但训练奖励受随机地图难度
|
|
| 116 |
|
| 117 |
## 项目亮点
|
| 118 |
|
| 119 |
-
### 1.
|
| 120 |
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
|
| 127 |
-
|
| 128 |
|
| 129 |
```python
|
| 130 |
if eval_success_rate > best_eval_success:
|
|
@@ -132,39 +167,41 @@ if eval_success_rate > best_eval_success:
|
|
| 132 |
torch.save({"state_dict": policy_net.state_dict(), ...}, best_model_path)
|
| 133 |
```
|
| 134 |
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
### 4. BFS 连通性保证 + 唯一随机源
|
| 138 |
|
| 139 |
-
|
| 140 |
|
| 141 |
-
|
|
|
|
|
|
|
| 142 |
|
| 143 |
-
|
| 144 |
|
| 145 |
-
###
|
| 146 |
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
| `Backend_Net/` | `global_update_steps` | Loss、Avg Q Value、Grad Norm |
|
| 150 |
-
| `Frontend_Env/` | `episode` | Reward、Steps、Success Rate、Epsilon |
|
| 151 |
-
| `Evaluation_Exam/` | `episode` | 盲测成功率、SPL |
|
| 152 |
|
| 153 |
-
|
| 154 |
|
| 155 |
-
###
|
| 156 |
|
| 157 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
|
| 159 |
-
|
| 160 |
|
| 161 |
-
###
|
| 162 |
|
| 163 |
-
|
| 164 |
|
| 165 |
-
|
|
|
|
| 166 |
|
| 167 |
-
|
| 168 |
|
| 169 |
---
|
| 170 |
|
|
|
|
| 20 |
|
| 21 |
---
|
| 22 |
|
| 23 |
+
## 项目背景
|
| 24 |
|
| 25 |
+
10×10 随机迷宫本身足够简单(原始 DQN 在固定起终点可达 90%+),但**随机起终点 + 随机地图**让状态空间扩大约 40 倍,把"走通迷宫"变成"学一种导航策略"——初版 DQN 在此设定下仅 **61% 成功率**。
|
|
|
|
| 26 |
|
| 27 |
+
本项目的目标不是再提升一两个百分点,而是**走完一遍完整的方法论**:先做冒烟验证排除工程 bug,再做 4 轮超参消融(每轮只改一组变量,用问题诊断驱动下一轮变更),最后固定最优超参做四算法横向消融。整个过程把 Holdout 成功率从 61% 推到 84%(+23pp:超参调优 +17pp,算法切换 +6pp)。
|
| 28 |
|
| 29 |
+
途中还发现并修复了一类常见的 RL 工程错误——**奖励依赖 episode 内历史,违反马尔可夫性**(详见"核心发现")。
|
| 30 |
|
| 31 |
---
|
| 32 |
|
| 33 |
## 最终结果
|
| 34 |
|
| 35 |
+
> **Holdout 评估**:100 张训练中从未见过的独立地图(seed+200000),ε=0 贪心推理,裸 argmax。
|
| 36 |
+
> ⚠️ n=100 单次跑点,95% CI ≈ ±5pp;相邻算法差距 3–6pp 处于 CI 边缘,严格对比需多次独立运行(Henderson et al., 2018)。
|
| 37 |
|
| 38 |
+
### 训练结果呈现顺序
|
| 39 |
|
| 40 |
+
本节按"训练过程的时间顺序"组织:先看超参演进的纵向消融(同一算法、固定数据集、不同超参),再看 R4 算法横向消融(固定最优超参、不同算法)——这样才能把"哪个提升来自超参、哪个来自算法"分清。
|
| 41 |
+
|
| 42 |
+
#### 第一阶段:超参演进纵向对比(Double DQN,保持算法一致)
|
| 43 |
+
|
| 44 |
+
每轮变更都不是"再调一组数字试试",而是**先看曲线、定位问题、再改超参**:
|
| 45 |
+
|
| 46 |
+
| 轮次 | 核心变更 | Holdout | SPL | 上一轮 → 本轮:问题诊断与决策 |
|
| 47 |
+
|------|---------|:-------:|:---:|--------------------------|
|
| 48 |
+
| Round 1 | 初版超参(`ep=2000`, `decay=0.995`) | 61.0% | 0.605 | 起点:随机起终点初次尝试 |
|
| 49 |
+
| Round 2 | `ep=6000`(×3), `decay=0.9985` | 64.0% | 0.633 | R1 训练曲线 ep≈800 即触底、ep≈2000 仍未收敛 → 训练量不足 + 探索衰减过快 |
|
| 50 |
+
| Round 3 | `buffer=80k`(×4), `target=1500`(×3) | 74.0% | 0.735 | R2 EVAL 出现 400–500 ep 周期的剧烈振荡 → buffer 太小、target 更新过频(Q 目标漂移) |
|
| 51 |
+
| **Round 4** | EVAL checkpoint + BFS 连通性 + visited_map 4通道 | **78.0%** | **0.773** | R3 EVAL 峰值 84% / Holdout 74% 差 10pp → checkpoint 时序错位(保存的是训练奖励最高的而非 EVAL 最佳的);训练出现"循环"失败模式 → 修复 checkpoint 策略 + BFS 保证训练数据无死锁 + visited_map 状态编码抑制循环 |
|
| 52 |
+
|
| 53 |
+
四轮演进曲线(同一 Double DQN 算法,仅超参不同):
|
| 54 |
+
|
| 55 |
+

|
| 56 |
+
|
| 57 |
+
**这一阶段说明**:在算法不变的前提下,靠"消融 + 诊断"已经把成功率从 61% 推到 78%。接下来的 6pp 提升不能继续靠调超参——超参空间已饱和,曲线形状说明 R4 已接近该算法的能力上限。
|
| 58 |
+
|
| 59 |
+
#### 第二阶段:R4 算法横向消融(固定 R4 最优超参,唯一变量 = 算法)
|
| 60 |
+
|
| 61 |
+
R4 既然已到超参极限,再换算法就是"把相同的训练数据 + 同样的训练步数给四种网络架构,看谁能在 Holdout 上多拿 6pp":
|
| 62 |
+
|
| 63 |
+
| 排名 | 算法 | Holdout | SPL | EVAL→Holdout Gap |
|
| 64 |
+
|:---:|------|:-------:|:---:|:----------------:|
|
| 65 |
| 🥇 | **Dueling DQN** | **84.0%** | **0.817** | −6pp(泛化最稳) |
|
| 66 |
| 🥈 | Double + Dueling | 81.0% | 0.793 | −9pp |
|
| 67 |
| 🥉 | Double DQN | 78.0% | 0.773 | −10pp |
|
| 68 |
| 4️⃣ | Vanilla DQN | 75.0% | 0.726 | −19pp |
|
| 69 |
|
| 70 |
+
四算法 EVAL 训练曲线:
|
| 71 |
|
| 72 |

|
| 73 |
|
| 74 |
+
**这一阶段说明**:Dueling 比 Vanilla 在 Holdout 上多 9pp、EVAL→Holdout Gap 小 13pp——这是结构性的,不是统计噪声。Dueling 适配本任务的具体机制见"核心发现"。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
|
| 76 |
+
---
|
| 77 |
|
| 78 |
---
|
| 79 |
|
|
|
|
| 89 |
阶段二:超参消融(Round 1–4)
|
| 90 |
每轮只改一组变量,用问题诊断驱动下一轮变更
|
| 91 |
R1 → R2:修复训练量 + 探索衰减(单变量)
|
| 92 |
+
R2 → R3:修复 buffer + target(Q 目标漂移)
|
| 93 |
R3 → R4:修复 checkpoint 时序 + 连通性验证 + 状态编码
|
| 94 |
|
| 95 |
阶段三:算法横评(Round 4 续)
|
|
|
|
| 99 |
|
| 100 |
**为什么先调超参再比算法**:先把超参调到最优,比的才是算法本身的能力差异;否则比的是"哪个算法对糟糕超参更鲁棒"。
|
| 101 |
|
| 102 |
+
### 三个评价指标在不同阶段的作用
|
| 103 |
+
|
| 104 |
+
本项目主要用三个指标,每个指标在不同阶段回答不同的问题:
|
| 105 |
+
|
| 106 |
+
| 指标 | 表征什么 | 主要用在哪一阶段 | 怎么驱动决策 |
|
| 107 |
+
|------|---------|----------------|------------|
|
| 108 |
+
| **训练奖励(Frontend_Env/Episode_Reward)** | 当前策略在训练地图上的即时表现 | 阶段二(超参消融)粗筛 | 看是否"在涨"——R1 ep≈800 触底 → 触发"R2 延长训练"的决策 |
|
| 109 |
+
| **EVAL 成功率(Evaluation_Exam/Test_Success_Rate)** | 当前策略在固定 EVAL 集上的泛化表现 | 阶段二精筛 + 阶段三对比 + 阶段一/二的 checkpoint 选择 | R2 出现 400–500 ep 振荡 → 触发"R3 调 buffer/target";R4 峰值 88% 但 Dueling 末段 90% → 触发"阶段三切 Dueling" |
|
| 110 |
+
| **Holdout 成功率 + SPL** | 训练全程未见的 100 张独立地图上的最终泛化能力 | 仅阶段三最终一次性报告 | 不参与中途决策(防止"对着 Holdout 调超参"导致的间接过拟合),只用于回答"项目最终能拿多少分" |
|
| 111 |
+
|
| 112 |
+
**三套指标配合使用的关键约束**:
|
| 113 |
+
- **阶段一看训练奖励就够了**——固定起终点下,奖励能涨就说明训练代码无 bug
|
| 114 |
+
- **阶段二必须看 EVAL 成功率**——训练奖励在随机地图下噪声太大(与泛化能力相关性仅 0.3–0.5),用它调超参会选出"训练集噪声"模型
|
| 115 |
+
- **阶段三对比算法时同时看 EVAL 峰值 + Holdout + Gap**——EVAL 峰值反映"训练过程见过的最佳泛化",Holdout 反映"训练过程完全没见过的泛化",两者差距(Gap)反映模型稳定程度
|
| 116 |
+
- **Holdout 不允许中途观察**——一旦中途用 Holdout 调参,就等于把 Holdout 间接泄露进训练过程,最终数字就不可信
|
| 117 |
+
|
| 118 |
完整逐轮记录见 [docs/experiment_log.md](docs/experiment_log.md)。
|
| 119 |
|
| 120 |
---
|
| 121 |
|
| 122 |
## 核心发现
|
| 123 |
|
| 124 |
+
### 发现一:奖励依赖 episode 内历史会破坏马尔可夫性(P9)
|
| 125 |
|
| 126 |
R4 首先尝试用 `revisit_penalty`(重复访问格子施加递进奖励惩罚)抑制推理时的循环行为,但训练至 ep=1000 时成功率仅 38%,持续低于基线 15pp,最终终止。
|
| 127 |
|
| 128 |
+
**根因**:Q-learning 的收敛定理(Watkins & Dayan, 1992)要求奖励函数 $r(s,a,s')$ 仅依赖当前转移,贝尔曼最优算子在此条件下是压缩映射。`revisit_penalty` 使奖励依赖 episode 内访问历史(隐变量),相同的 $(s,a,s')$ 在 episode 内的不同时刻返回不同奖励,破坏马尔可夫性,**收敛性保证失效**——这不意味着"必然不收敛",而是理论不再保证收敛,实际行为取决于具体问题结构。**本任务中真正致命的次生问题是训练/推理分布不一致**——训练时奖励含惩罚项,推理时不含,导致训练期学到的 Q 函数与推理期使用的环境动力学失配,策略崩溃不可修正。
|
| 129 |
|
| 130 |
**正确解法**:把历史信息从奖励空间移到状态空间。观测张量第四通道编码二值访问图(ch3=visited_map),Q 函数合法学习"已访问格价值低"的策略,马尔可夫性完整保持。
|
| 131 |
|
|
|
|
| 133 |
|
| 134 |
### 发现二:Dueling 架构与本任务的结构适配性
|
| 135 |
|
| 136 |
+
随机起终点迷宫中存在大量"多动作等效"状态(死胡同、走廊段),Dueling 的 V(s)/A(s,a) 分解使价值流与优势流解耦——V(s) 通过所有动作路径的反向传播获得梯度信号,样本效率上等价于用同一个状态 batch 下的所有动作共同监督 V(s) 的估计,而每个 A(s,a) 仅在该动作对应路径上获得梯度,因此 V(s) 的有效更新样本量是 A(s,a) 分支的 `num_actions` 倍(4 个动作时为 4×),估计更稳定,泛化更强。
|
| 137 |
|
| 138 |
实测证据:EVAL→Holdout Gap 仅 6pp(最小),而 Vanilla DQN 的 Gap 高达 19pp。
|
| 139 |
|
|
|
|
| 147 |
|
| 148 |
## 项目亮点
|
| 149 |
|
| 150 |
+
### 1. 训练-评估-报告三集严格分离 + EVAL-based Checkpoint
|
| 151 |
|
| 152 |
+
```
|
| 153 |
+
训练 buffer(Replay)── 梯度更新用,分布漂移无所谓
|
| 154 |
+
│
|
| 155 |
+
▼
|
| 156 |
+
EVAL 集(固定 100 张地图,固定 seed)── 训练期每 N 局评估一次,触发 checkpoint
|
| 157 |
+
│
|
| 158 |
+
▼
|
| 159 |
+
Holdout 集(独立 100 张地图,seed+200000)── 训练全程不接触,仅最终一次性报告
|
| 160 |
+
```
|
| 161 |
|
| 162 |
+
Checkpoint 触发:EVAL 集成功率创新高时保存,确保 checkpoint 永远对应"训练过程中 EVAL 表现最好的一刻"——而不是训练奖励偶然高的一刻。
|
| 163 |
|
| 164 |
```python
|
| 165 |
if eval_success_rate > best_eval_success:
|
|
|
|
| 167 |
torch.save({"state_dict": policy_net.state_dict(), ...}, best_model_path)
|
| 168 |
```
|
| 169 |
|
| 170 |
+
**直接效果**:避免 R3 的 EVAL 峰值 84% / Holdout 仅 74% 的 10pp 错位,R4 Holdout 回升至 78%(+4pp)。马尔可夫性修复(visited_map 第四通道)和 Dueling 适配详见"核心发现"。
|
|
|
|
|
|
|
| 171 |
|
| 172 |
+
### 2. 训练信号侧的"三项叠加"(ep/buffer/target 调优 + BFS 连通性)
|
| 173 |
|
| 174 |
+
- `ep=6000` + `decay=0.9985`:训练量翻 3 倍、ε 衰减 50× 慢,给策略充分时间收敛
|
| 175 |
+
- `buffer=80k`(×4)、`target_update=1500`(×3):buffer 太小会让成功样本被冲掉、target 更新太频会让 Q 目标变成"移动靶",两者都是 R2 振荡的直接原因
|
| 176 |
+
- BFS 连通性保证:`reset()` 内嵌 BFS,无解迷宫直接重采样——不修这个,训练信号会被"无法完成任务"污染,Q 值学出"迷宫无解"的错误估计
|
| 177 |
|
| 178 |
+
**效果**:仅这三项把成功率从 61% 推到 74%(+13pp)。
|
| 179 |
|
| 180 |
+
### 3. Episode 级 Warmup + BFS Ground Truth
|
| 181 |
|
| 182 |
+
- Warmup:前 N 局 ε=1.0 纯随机,不做任何梯度更新——防止早期 Q 值被少量样本"冲偏"
|
| 183 |
+
- BFS Ground Truth:每次评估计算当前迷宫的最短路径步数作为 SPL 的 $\ell^*$——不依赖 Q 值估计,避免"用 Q 值评估 Q 值"的循环
|
|
|
|
|
|
|
|
|
|
| 184 |
|
| 185 |
+
**作用**:提效(减少无效探索 + 评估指标无偏)。
|
| 186 |
|
| 187 |
+
### 4. TensorBoard 三解耦看板
|
| 188 |
|
| 189 |
+
| 看板 | X 轴 | 记录时机 | 避免的问题 |
|
| 190 |
+
|---|---|---|---|
|
| 191 |
+
| `Backend_Net/` | `global_update_steps` | 每次 `backward()` 后 | — |
|
| 192 |
+
| `Frontend_Env/` | `episode` | 每局结束后 | 避免"每局更新步数不同"导致 Loss 曲线横向压缩 |
|
| 193 |
+
| `Evaluation_Exam/` | `episode` | 每 N 局暂停训练、`model.eval()` | 训练/评估指标分轴对比,避免视觉误导 |
|
| 194 |
|
| 195 |
+
**作用**:纯提效——诊断问题时不用猜"这条陡降到底是 eval 触发了还是 loss 飙升了"。
|
| 196 |
|
| 197 |
+
### 5. 唯一随机源 + 评估集可复现
|
| 198 |
|
| 199 |
+
`maze_env/env.py` 所有随机操作统一走 Gymnasium 注入的 `self.np_random`。
|
| 200 |
|
| 201 |
+
- 训练时 `env.reset()` 不传 seed → 训练地图每局不同,强制学泛化
|
| 202 |
+
- 评估时 `env.reset(seed=X)` 固定 → 同一 seed 永远生成同一张地图,Holdout 100 张地图可精确复现,论文级可对比
|
| 203 |
|
| 204 |
+
**作用**:纯提效 + 评估可信度。如果评估地图每次都变,"成功率 78%"这个数字就没有任何可重复性可言。
|
| 205 |
|
| 206 |
---
|
| 207 |
|
|
@@ -15,8 +15,12 @@ rewards:
|
|
| 15 |
goal: 100
|
| 16 |
wall_hit: -10
|
| 17 |
step: -1
|
| 18 |
-
distance_shaping_alpha: 0.
|
| 19 |
-
# 每步额外奖励 = alpha ×
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
revisit_penalty: 0.0 # 已移至状态层:visited_map 第4通道编码访问历史(Markov-correct)
|
| 21 |
# 奖励层 revisit_penalty 违反马尔可夫性,已弃用
|
| 22 |
|
|
|
|
| 15 |
goal: 100
|
| 16 |
wall_hit: -10
|
| 17 |
step: -1
|
| 18 |
+
distance_shaping_alpha: 0.0 # 距离 shaping 系数;0 = 关闭
|
| 19 |
+
# env.py 内部支持该参数(每步额外奖励 = alpha × Δ曼哈顿距离),
|
| 20 |
+
# 但当前 train.py 重构后未透传此字段,实际为 0.0。
|
| 21 |
+
# 若需启用,需在 src/train.py 手工构造 MazeEnv(...) 处追加
|
| 22 |
+
# `distance_shaping_alpha=distance_shaping_alpha` 并在配置读取处
|
| 23 |
+
# 解析 reward_cfg.get("distance_shaping_alpha", 0.0)。
|
| 24 |
revisit_penalty: 0.0 # 已移至状态层:visited_map 第4通道编码访问历史(Markov-correct)
|
| 25 |
# 奖励层 revisit_penalty 违反马尔可夫性,已弃用
|
| 26 |
|
|
@@ -13,12 +13,16 @@
|
|
| 13 |
| Round 0 | 固定起终点 | 基准(对照组) | 90–95% | — | — | 固定任务四算法均高度收敛,验证训练流程正确 |
|
| 14 |
| Round 1 | **随机起终点** | 初版超参 | 61.0% | 0.605 | — | `ep=2000` 曲线未收敛;`decay=0.995` 探索提前触底 |
|
| 15 |
| Round 2 | 随机起终点 | `ep=6000` + `decay=0.9985` | 64.0% | 0.633 | 74% | P1/P2 修复,新发现 buffer 过小(P3)和 target 同步过频(P4)|
|
| 16 |
-
| Round 3 | 随机起终点 | `buffer=80k` + `target=1500`
|
| 17 |
| Round 4 | 随机起终点 | EVAL-based checkpoint + BFS 连通性验证;探索 revisit_penalty(失败)和 visited_map 4通道 | **78.0%**(A3,double 算法) | **0.773** | **88%** | P7(checkpoint时序)+P8(无解任务)系统性修复;P9(马尔可夫违反)新发现;A3为三项变量叠加,非单因素对照 |
|
| 18 |
| Round 4(续)| 随机起终点 | R4-A3 超参固定,四算法横向消融(唯一变量=算法)| **84.0%**(dueling,最优) | **0.817** | **94%**(vanilla) | dueling EVAL→Holdout gap=6pp 最优泛化;double_dueling 81%;vanilla 75%(19pp gap 虚高);Double DQN 危机恢复快但终态不及纯 dueling |
|
| 19 |
|
| 20 |
**关键结论链**:随机起终点使状态空间扩大约 40×,需要更长训练(R2)→ 更大 buffer 保留稀疏成功样本(R3)→ 修复 checkpoint 时序偏差 + 连通性验证 + visited_map 状态编码(R4)→ Dueling 架构的 V/A 分解与多动作等效迷宫导航任务高度适配(R4 算法消融)。奖励层循环抑制违反马尔可夫性(P9);状态层编码(visited_map)理论正确;最优配置(dueling + EVAL checkpoint + BFS + visited_map)最终将 Holdout 从 74%(R3)提升至 **84%**(+10pp)。
|
| 21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
---
|
| 23 |
|
| 24 |
## Round 0 — 固定起终点基准(对照组)
|
|
@@ -132,11 +136,15 @@ runs/train_dueling_20260531_012950/
|
|
| 132 |
runs/train_double_dueling_20260531_023152/
|
| 133 |
```
|
| 134 |
|
| 135 |
-
### TensorBoard 曲线截图
|
| 136 |
|
| 137 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 138 |
|
| 139 |
-
|
| 140 |
|
| 141 |
### 结论与下一步行动
|
| 142 |
|
|
@@ -145,26 +153,25 @@ runs/train_double_dueling_20260531_023152/
|
|
| 145 |
2. **P3(中优先级)**:buffer=20000 约 250 局轮换,预测 Round 2 将出现约 400–500 ep 周期振荡
|
| 146 |
3. **P4(中优先级)**:target 同步 272 次/轮,高 Q 方差场景下移动靶效应显著
|
| 147 |
|
| 148 |
-
**
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
Step 3(Round 4):改 checkpoint 保存策略(EVAL-based)+ 引入 visited_map 第四通道(Markov-correct),提升 Holdout 与峰值的对齐度。注:revisit_penalty 方案在实施中因违反马尔可夫性被放弃,改用 visited_map 编码访问历史。
|
| 152 |
|
| 153 |
-
详见 `docs/hyperparameter_study.md` 第五节。
|
| 154 |
|
| 155 |
---
|
| 156 |
|
| 157 |
-
## Round 2 —
|
| 158 |
|
| 159 |
**日期**:2026-05-31
|
| 160 |
-
**目的**:验证 `num_episodes=6000` + `epsilon_decay=0.9985` 是否消除 P1/P2 问题(
|
| 161 |
**变更项**:
|
| 162 |
|
| 163 |
| 超参 | Round 1 | Round 2 | 变更原因 |
|
| 164 |
|------|---------|---------|---------|
|
| 165 |
| `num_episodes` | 2000 | **6000** | R1 曲线末端斜率仍为正,无平台期,训练量不足 |
|
| 166 |
| `epsilon_decay` | 0.995 | **0.9985** | R1 ep≈800 探索触底,后 1200 ep 样本多样性枯竭 |
|
| 167 |
-
| 其余 | 不变 | 不变 |
|
| 168 |
|
| 169 |
### 超参快照
|
| 170 |
|
|
@@ -269,26 +276,6 @@ $\theta^-$ 作用是提供暂时固定的回归目标,若更新太频繁,等
|
|
| 269 |
|
| 270 |
---
|
| 271 |
|
| 272 |
-
#### P5 — 奖励稀疏(新发现,与 buffer 问题共同导致收敛困难)
|
| 273 |
-
|
| 274 |
-
**数据现状**
|
| 275 |
-
|
| 276 |
-
当前奖励函数:到达终点 +100,撞墙 -11,每步 -1。
|
| 277 |
-
成功局平均约 10–20 步,失败局固定 200 步。在成功率约 60% 的阶段,
|
| 278 |
-
**约 40% 的局对 buffer 贡献的全部都是负样本**,网络从这些轨迹中无法获得任何导向目标的正反馈信号。
|
| 279 |
-
每步 reward 仅为 -1,网络无法从单步奖励中判断"是否在靠近目标",只能依赖终点的稀疏 +100 信号反向传播。
|
| 280 |
-
|
| 281 |
-
**论文依据**
|
| 282 |
-
|
| 283 |
-
Ng et al. (1999) *"Policy Invariance Under Reward Transformations"* (ICML) 证明了势函数形式的奖励 shaping 在不改变最优策略的前提下可以密化奖励信号:
|
| 284 |
-
|
| 285 |
-
$$r'(s,a,s') = r(s,a,s') + \gamma \Phi(s') - \Phi(s)$$
|
| 286 |
-
|
| 287 |
-
取 $\Phi(s) = -\alpha \cdot d_{\text{Manhattan}}(s, \text{goal})$,则每步额外奖励 $= \alpha \cdot (d_{\text{before}} - d_{\text{after}})$,
|
| 288 |
-
靠近目标一步 +α,远离一步 −α。此形式满足势函数条件,**理论上不改变最优策略**,仅加速收敛。
|
| 289 |
-
|
| 290 |
-
> **理论精确性说明**:Ng et al. (1999) 定理要求严格使用 $\gamma\Phi(s') - \Phi(s)$,代码实现省略了 $\gamma$(即令 $\gamma=1$)。这使策略不变性定理在严格意义上不成立——策略不变性是关于最优策略集合不变的命题,与数值误差大小无关。实践中因 $\gamma=0.99$ 且迷宫路径短(平均约 10–15 步),累计误差约 1%,对收敛结果影响可忽略,但属近似实现而非精确满足定理。
|
| 291 |
-
|
| 292 |
---
|
| 293 |
|
| 294 |
### TensorBoard 运行目录
|
|
@@ -297,20 +284,22 @@ $$r'(s,a,s') = r(s,a,s') + \gamma \Phi(s') - \Phi(s)$$
|
|
| 297 |
runs/Round2_double_epsilon0.9985_ep6000/
|
| 298 |
```
|
| 299 |
|
| 300 |
-
### TensorBoard 曲线截图
|
| 301 |
|
| 302 |
-
|
| 303 |
-
|
|
|
|
|
|
|
|
|
|
| 304 |
|
| 305 |
-
|
| 306 |
-

|
| 307 |
|
| 308 |
### 下一步行动
|
| 309 |
|
| 310 |
-
**R2 确认了 P1+P2 修复有效**,但发现新瓶颈 P3(buffer)和 P4(target)
|
| 311 |
-
Round 3
|
| 312 |
|
| 313 |
-
**依据上述 P3/P4
|
| 314 |
|
| 315 |
**1. `buffer_capacity: 80000`(修复 P3)**
|
| 316 |
|
|
@@ -324,27 +313,18 @@ Round 3 依据单变量消融原则同时修复 P3+P4+P5,预期振荡幅度从
|
|
| 324 |
依据 Mnih et al. (2015) 的 fixed Q-target 理论,更稀疏的同步使 TD 目标在更长窗口内保持稳定,
|
| 325 |
预期 `Backend_Net/Loss` 高频震荡峰值减少,Q 值估计方差降低。
|
| 326 |
|
| 327 |
-
**3. `distance_shaping_alpha: 0.5`(修复 P5)**
|
| 328 |
-
|
| 329 |
-
实现 Ng et al. (1999) 的势函数 shaping:每步额外奖励 = 0.5 × (移动前曼哈顿距离 − 移动后曼哈顿距离)。
|
| 330 |
-
撞墙步位置不变,不触发 shaping(避免撞墙获得零 shaping 奖励误导策略)。
|
| 331 |
-
α=0.5 使 shaping 信号幅度为每步基础奖励���-1)的 50%,足以提供方向感但不至于压过终点奖励(+100)。
|
| 332 |
-
|
| 333 |
-
先跑 double 单算法验证,稳定 >80% 后再跑全部 4 算法;若无显著提升则去掉 shaping 单独 ablation。
|
| 334 |
-
|
| 335 |
---
|
| 336 |
|
| 337 |
-
## Round 3 — buffer 扩容 + target 稳定
|
| 338 |
|
| 339 |
**日期**:2026-05-31
|
| 340 |
-
**目的**:同时修复 P3(buffer)、P4(target sync)
|
| 341 |
**变更项**:
|
| 342 |
|
| 343 |
| 超参 | Round 2 | Round 3 | 变更原因 |
|
| 344 |
|------|---------|---------|---------|
|
| 345 |
| `buffer_capacity` | 20000 | **80000** | 约 250 局轮换→约 1000 局,消除振荡 |
|
| 346 |
| `target_update_freq` | 500 | **1500** | 随机起终点 Q 方差大,减少目标漂移 |
|
| 347 |
-
| `distance_shaping_alpha` | 0(无) | **0.5** | 密化正反馈信号,缓解稀疏奖励 |
|
| 348 |
| 其余 | 不变 | 不变 | — |
|
| 349 |
|
| 350 |
### 超参快照
|
|
@@ -356,7 +336,6 @@ Round 3 依据单变量消融原则同时修复 P3+P4+P5,预期振荡幅度从
|
|
| 356 |
| `buffer_capacity` | **80000** |
|
| 357 |
| `target_update_freq` | **1500** |
|
| 358 |
| `warmup_episodes` | 200 |
|
| 359 |
-
| `distance_shaping_alpha` | **0.5** |
|
| 360 |
| `random_start_goal` | true |
|
| 361 |
| `algorithm` | double |
|
| 362 |
|
|
@@ -382,7 +361,7 @@ Round 3 依据单变量消融原则同时修复 P3+P4+P5,预期振荡幅度从
|
|
| 382 |
### Blind Test 曲线关键数据(double 算法)
|
| 383 |
|
| 384 |
```
|
| 385 |
-
ep= 400– 650: 8–18% ← Q 值高估导致 EVAL 骤降(
|
| 386 |
ep= 800: 42% ← Double DQN 自修正后恢复
|
| 387 |
ep=1000–2100: 44–70% ← ε 触底前的上升段(R3 起步比 R2 高约 6pp)
|
| 388 |
ep=2200–2250: 70% ← ε 触底(ep≈2189)后首个高峰
|
|
@@ -423,23 +402,15 @@ ep=5800–6000: 62–76% ← 末段振荡
|
|
| 423 |
|
| 424 |
**结论**:target 更新频率降低有效减少了 Q 值的随机漂移,是峰值从 74% → 84% 的贡献因素之一。
|
| 425 |
|
| 426 |
-
#### P5 —
|
| 427 |
-
|
| 428 |
-
**预期**:`distance_shaping_alpha=0.5` 密化奖励信号,加速早期学习,提升盲测成功率。
|
| 429 |
|
| 430 |
-
**
|
| 431 |
-
- ep=300–350 时成功率已达 54–56%(R2 同期约 40–48%),早期学习加速效果显著
|
| 432 |
-
- ep=400–650 出现 **Q 值高估危机**:AvgQ 飙升至峰值 78(R2 同期约 40–50),EVAL 骤降至 8–18%
|
| 433 |
|
| 434 |
-
**
|
| 435 |
-
|
| 436 |
-
|
| 437 |
-
ep=800 成功率恢复至 42%,ep=1000 回到 44%,ep=1050 跳升至 62%,之后完全恢复。
|
| 438 |
-
**全程无需人工干预,Double DQN 的抗高估特性自动处理了此副作用。**
|
| 439 |
|
| 440 |
-
**
|
| 441 |
-
改进方案:将 α 从 0.5 降至 0.2–0.3,或在 warmup 结束后延迟 200 ep 才开启 shaping,
|
| 442 |
-
可在保留密化信号收益的同时缩短副作用期。
|
| 443 |
|
| 444 |
#### P6(新)— 振荡根因未彻底解决:周期性遗忘
|
| 445 |
|
|
@@ -455,8 +426,8 @@ ep=800 成功率恢复至 42%,ep=1000 回到 44%,ep=1050 跳升至 62%,之
|
|
| 455 |
### TensorBoard 运行目录
|
| 456 |
|
| 457 |
```
|
| 458 |
-
runs/
|
| 459 |
-
runs/
|
| 460 |
```
|
| 461 |
|
| 462 |
### TensorBoard 曲线截图
|
|
@@ -471,14 +442,14 @@ runs/Round3_double_buffer80k_target1500_shaping_restart/ ← 重启前的短暂
|
|
| 471 |
|
| 472 |
#### 一、R3 核心结论
|
| 473 |
|
| 474 |
-
buffer+target
|
| 475 |
-
|
| 476 |
|
| 477 |
---
|
| 478 |
|
| 479 |
#### 二、Holdout 低于峰值 10pp 的数据诊断
|
| 480 |
|
| 481 |
-
对 R3 全程 EVAL 数据(ep=800–6000,
|
| 482 |
|
| 483 |
| 阶段 | 均值 | 峰值 | 低谷 |
|
| 484 |
|------|------|------|------|
|
|
@@ -510,7 +481,33 @@ buffer+target+shaping 组合将盲测峰值从 74% 提升至 **84%**,Holdout
|
|
| 510 |
|
| 511 |
---
|
| 512 |
|
| 513 |
-
#### 四、R4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 514 |
|
| 515 |
**核心变更(必做):将模型保存触发条件改为 EVAL 成功率创新高**
|
| 516 |
|
|
@@ -529,7 +526,6 @@ if eval_success_rate > best_eval_success_rate:
|
|
| 529 |
| `epsilon_decay` | 0.9985 | 不变 |
|
| 530 |
| `buffer_capacity` | 80000 | 不变 |
|
| 531 |
| `target_update_freq` | 1500 | 不变 |
|
| 532 |
-
| `distance_shaping_alpha` | 0.5 | 不变 |
|
| 533 |
| **`revisit_penalty`** | **-1.0** | **新增:训练时重复访问格子施加递进惩罚,抑制循环路径** |
|
| 534 |
| **checkpoint 保存策略** | **EVAL 成功率最优** | **本轮核心变更** |
|
| 535 |
|
|
@@ -616,24 +612,26 @@ while not _bfs_reachable(wall_map, start_pos, goal_pos):
|
|
| 616 |
|
| 617 |
#### 推理时策略循环问题(新发现)
|
| 618 |
|
| 619 |
-
**现
|
|
|
|
|
|
|
| 620 |
|
| 621 |
-
**根因**:
|
| 622 |
|
| 623 |
-
此问题是 R4 的第三个攻坚方向,见后续尝试记录。
|
| 624 |
|
| 625 |
---
|
| 626 |
|
| 627 |
### R4 完整尝试记录
|
| 628 |
|
| 629 |
-
R4 共进行四次独立尝试(
|
| 630 |
|
| 631 |
**注意**:R3 使用 eval_every=50,R4 系列使用 eval_every=100,下方对比统一取 100 ep 间隔数据点。
|
| 632 |
|
| 633 |
R3 每 100 ep 的 EVAL 成功率(取相邻 50ep 点均值,ep=300 起):
|
| 634 |
|
| 635 |
```
|
| 636 |
-
ep= 300: 55% ep= 400: 8% ep= 500: 19% ep= 600: 16% ep= 700: 29% ←
|
| 637 |
ep= 800: 41% ep= 900: 42% ep=1000: 53% ep=1100: 58% ep=1200: 65%
|
| 638 |
ep=1300: 57% ep=1400: 63% ep=1500: 67% ep=1600: 65% ep=1700: 64%
|
| 639 |
ep=1800: 66% ep=1900: 68% ep=2000: 64% ep=2100: 66% ep=2200: 70%
|
|
@@ -682,7 +680,7 @@ $$Q(s,a) = \mathbb{E}\left[r(s,a,s') + \gamma \max_{a'} Q(s',a')\right]$$
|
|
| 682 |
|
| 683 |
网络拟合的是"含历史信息的"奖励函数,但推理时该信息不存在,导致 Q 值系统性失准,策略崩溃。这不是 Q 值高估问题(Double DQN 可修正),而是目标函数本身在测试分布下无意义。
|
| 684 |
|
| 685 |
-
**与
|
| 686 |
|
| 687 |
**结论**:**结构性失败,不可修补。** 奖励层的循环抑制方案在任何需要"有状态奖励"的场景下都会违反马尔可夫性。
|
| 688 |
|
|
@@ -734,7 +732,7 @@ ep=4700: 68% ep=4800: 70% ep=4900: 68% ep=5000: 70%
|
|
| 734 |
|
| 735 |
**Q 值高估危机(ep=400–700)复现**:
|
| 736 |
|
| 737 |
-
与 R3
|
| 738 |
|
| 739 |
$$\hat{Q}_{\text{Double}}(s,a) = r + \gamma Q_{\theta^-}(s', \arg\max_{a'} Q_\theta(s',a'))$$
|
| 740 |
|
|
@@ -757,10 +755,10 @@ ep=800 自修正后,R4-A2 在早中期(800–2500)持续领先 4–6pp,
|
|
| 757 |
|
| 758 |
---
|
| 759 |
|
| 760 |
-
#### R4-A3 — R3 超参 + EVAL checkpoint + BFS 连通性验证 + visited_map(
|
| 761 |
|
| 762 |
-
**日期**:2026-05-31
|
| 763 |
-
**日志**:`logs/r4_ctrl_eval_ckpt.log`(
|
| 764 |
**设计意图**:在 R3 超参基础上,同步引入三项修复:P7(EVAL checkpoint)、P8(BFS 连通性)、以及 R4-A2 引入的 visited_map 第4通道。三项变量**同时存在**,无法单独分离各项贡献,本组的结论是"三项叠加的综合效果"。
|
| 765 |
|
| 766 |
**与 R3 的精确差异**:
|
|
@@ -770,7 +768,7 @@ ep=800 自修正后,R4-A2 在早中期(800–2500)持续领先 4–6pp,
|
|
| 770 |
| checkpoint 触发 | 训练滚动奖励最高 | **EVAL 成功率创新高** |
|
| 771 |
| 随机起终点连通性 | 无验证(~5-10% 无解) | **BFS 验证,保证可达** |
|
| 772 |
| 观测通道数 | **3通道**(wall / agent / goal) | **4通道**(+visited_map,同 R4-A2) |
|
| 773 |
-
| 超参 | buffer=80k, target=1500,
|
| 774 |
|
| 775 |
**checkpoint 保存逻辑(commit `fbc2dc6`)**:
|
| 776 |
|
|
@@ -858,7 +856,7 @@ $$\text{无解任务率} \approx p_{\text{unreachable}} \approx 5\text{–}10\%$
|
|
| 858 |
|
| 859 |
| 方案 | 核心改动 | EVAL 峰值 | Holdout | 相比 R3 |
|
| 860 |
|------|---------|:---------:|:-------:|:-------:|
|
| 861 |
-
| **R3 基准** | buffer+target
|
| 862 |
| **R4-A1** | revisit_penalty=-1.0 | 52% | killed ep=1000 | **结构性失败** |
|
| 863 |
| **R4-A2** | visited_map 4通道 | 80%(ep=4600) | 75% / SPL=0.735 | **+1pp,统计不显著** |
|
| 864 |
| **R4-A3** | EVAL checkpoint + BFS + visited_map(三项叠加) | **88%**(ep=3300) | **78% / SPL=0.773** | **+4pp** |
|
|
@@ -883,7 +881,7 @@ $$\text{无解任务率} \approx p_{\text{unreachable}} \approx 5\text{–}10\%$
|
|
| 883 |
|
| 884 |
```
|
| 885 |
runs/Round4_double_visited_map/ ← R4-A2 记录
|
| 886 |
-
runs/Round4_ctrl_eval_ckpt/ ← R4-A3 记录(
|
| 887 |
```
|
| 888 |
|
| 889 |
### 所需截图
|
|
@@ -925,7 +923,6 @@ runs/Round4_ctrl_eval_ckpt/ ← R4-A3 记录(进行中)
|
|
| 925 |
| `epsilon_decay` | 0.9985 |
|
| 926 |
| `buffer_capacity` | 80000 |
|
| 927 |
| `target_update_freq` | 1500 |
|
| 928 |
-
| `distance_shaping_alpha` | 0.5 |
|
| 929 |
| `warmup_episodes` | 200 |
|
| 930 |
| `eval_every` | 100 |
|
| 931 |
| `num_test_mazes` | 50 |
|
|
@@ -938,15 +935,7 @@ runs/Round4_ctrl_eval_ckpt/ ← R4-A3 记录(进行中)
|
|
| 938 |
|
| 939 |
#### 危机成因(共性)
|
| 940 |
|
| 941 |
-
四种算法在 ep≈400–700 区间均出现
|
| 942 |
-
|
| 943 |
-
R4 引入了两项新变量——distance_shaping(R3 已有)与 visited_map 第4通道(R4-A3 新增)。4通道输入相较3通道改变了网络输入数据分布,early buffer 中填充的是 warmup 阶段纯随机探索产生的 visited_map(访问模式随机、密度低),而训练开始后 visited_map 模式随策略改变而系统性变化。此分布漂移导致 Q 目标值系统性偏高(AvgQ 飙升),EVAL 成功率短期骤降。
|
| 944 |
-
|
| 945 |
-
更精确的机制:distance_shaping 将奖励量纲放大(每步可额外 ±0.5),结合 4通道 Q 网络容量更大、early fitting 更快,早期 TD 目标:
|
| 946 |
-
|
| 947 |
-
$$\hat{Q} = r + \gamma \max_{a'} Q_{\theta^-}(s',a')$$
|
| 948 |
-
|
| 949 |
-
中 $Q_{\theta^-}$ 因输入分布漂移而高估,通过 bootstrapping 反复放大,形成**正反馈高估回路**。
|
| 950 |
|
| 951 |
#### 四算法危机程度对比
|
| 952 |
|
|
@@ -961,44 +950,29 @@ $$\hat{Q} = r + \gamma \max_{a'} Q_{\theta^-}(s',a')$$
|
|
| 961 |
|
| 962 |
#### Double DQN 的抗危机机制
|
| 963 |
|
| 964 |
-
**vanilla 与 dueling
|
| 965 |
-
|
| 966 |
-
$$\hat{Q}_{\text{vanilla}} = r + \gamma \max_{a'} Q_{\theta^-}(s',a')$$
|
| 967 |
-
|
| 968 |
-
$\max$ 算子本身具有正偏差(Jensen 不等式的后果):当 $Q_{\theta^-}$ 含噪声时,$\max$ 会系统性选中噪声最大的动作,造成持续高估。这一偏差在 Q 网络输入分布漂移的危机期被进一步放大。
|
| 969 |
-
|
| 970 |
-
**double 与 double_dueling 使用 Double DQN 目标**(van Hasselt et al. 2016):
|
| 971 |
|
| 972 |
$$\hat{Q}_{\text{double}} = r + \gamma Q_{\theta^-}(s', \arg\max_{a'} Q_\theta(s',a'))$$
|
| 973 |
|
| 974 |
-
解耦动作选择($Q_\theta$
|
| 975 |
-
|
| 976 |
-
这解释了为何 double_dueling(ep=700:54%)远快于 dueling(ep=700:6%)恢复。
|
| 977 |
|
| 978 |
---
|
| 979 |
|
| 980 |
### EVAL 曲线关键节点对比
|
| 981 |
|
| 982 |
-
|
| 983 |
-
|
| 984 |
-
|
|
| 985 |
-
|
|
| 986 |
-
|
|
| 987 |
-
|
|
| 988 |
-
| 500 | — | 10% | **4%** ← 危机最深 | — |
|
| 989 |
-
| 600 | **6%** ← 危机底部 | 10% | — | — |
|
| 990 |
-
| 700 | — | 18% | **6%** ← 二次探底 | **54%** ← 已恢复 |
|
| 991 |
-
| 800 | — | 26% | — | — |
|
| 992 |
-
| 900 | — | 58% | — | — |
|
| 993 |
-
| 4200 | — | — | — | **90%** ← EVAL 峰值 |
|
| 994 |
-
| 4800 | **94%** ← EVAL 峰值 | — | — | — |
|
| 995 |
-
| 4900 | — | — | **90%** ← EVAL 峰值 | — |
|
| 996 |
|
| 997 |
-
|
| 998 |
|
| 999 |
-
**
|
| 1000 |
-
- double_dueling
|
| 1001 |
-
- vanilla 与 dueling 峰值均
|
|
|
|
| 1002 |
|
| 1003 |
---
|
| 1004 |
|
|
@@ -1092,10 +1066,6 @@ Dueling 网络的真正泛化优势来自**参数共享机制**:V(s) 流被所
|
|
| 1092 |
|
| 1093 |
---
|
| 1094 |
|
| 1095 |
-
**R1–R4 纵向超参演进(Double DQN,相同算法)**:
|
| 1096 |
-
|
| 1097 |
-

|
| 1098 |
-
|
| 1099 |
### 结论链(R1→R4 纵向总结)
|
| 1100 |
|
| 1101 |
以下为本项目全程的核心发现链,以 Holdout 成功率为主线:
|
|
@@ -1104,7 +1074,7 @@ Dueling 网络的真正泛化优势来自**参数共享机制**:V(s) 流被所
|
|
| 1104 |
|------|---------|:-------:|------------|
|
| 1105 |
| R1 | 随机起终点基线 | 61% | P1(训练量不足)、P2(探索过早终底)|
|
| 1106 |
| R2 | 延长训练+调缓探索衰减 | 64% | P3(buffer 过小导致振荡)、P4(target 同步过频)|
|
| 1107 |
-
| R3 | buffer×4 + target×3
|
| 1108 |
| R4-A1 | revisit_penalty(失败) | — | **P9(马尔可夫性违反)** ← 结构性失败 |
|
| 1109 |
| R4-A2 | visited_map 4通道 | 75% | P7 未修复导致 EVAL 峰值无法转化为 Holdout 提升 |
|
| 1110 |
| R4-A3 (double) | EVAL checkpoint + BFS + visited_map | 78% | EVAL→Holdout gap 10pp 持续(算法限制) |
|
|
@@ -1114,25 +1084,18 @@ Dueling 网络的真正泛化优势来自**参数共享机制**:V(s) 流被所
|
|
| 1114 |
|
| 1115 |
**最终结论(五点)**:
|
| 1116 |
|
| 1117 |
-
1. **Dueling 架构是本任务的最优选择**:V(s)/A(s,a) 分解使网络能将"位置价值"与"动作优势"解耦学习,与随机起终点迷宫导航任务的结构
|
| 1118 |
|
| 1119 |
2. **Double DQN 主要收益在训练过程,非最终结果**:危机期加速恢复(ep=700 领先 dueling 48pp)和早期收敛加速是真实可量化的收益;但在 5000 ep 充分训练后,与纯 dueling 的最终 Holdout 差距(81% vs 84%)表明 Double DQN 的抗高估机制在本任务规模下已不是瓶颈。
|
| 1120 |
|
| 1121 |
3. **EVAL→Holdout gap 是算法质量的独立指标**:Gap 越小说明策略对未见地图的鲁棒性越高。dueling gap 6pp、double_dueling 9pp、double 10pp、vanilla 19pp,与各算法的架构泛化能力排序一致,可作为独立于 Holdout 成功率的泛化质量指标。
|
| 1122 |
|
| 1123 |
-
4. **P7(EVAL-based checkpoint)是
|
| 1124 |
|
| 1125 |
5. **P9(马尔可夫性违反)是硬约束**:任何将 episode 历史信息置于奖励函数中的循环抑制方案(revisit_penalty 等)均导致 Q 函数目标无意义,正确解决方案唯有状态编码(visited_map)。
|
| 1126 |
|
| 1127 |
---
|
| 1128 |
|
| 1129 |
-
### 所需截图(四算法对比)
|
| 1130 |
-
|
| 1131 |
-
- [ ] `r4_four_algo_eval_crisis.png`��四算法 ep=300–900 EVAL 曲线,体现危机深度与恢复速度差异
|
| 1132 |
-
- [ ] `r4_four_algo_holdout_bar.png`:四算法 Holdout 成功率柱状图(含 R3 参考线)
|
| 1133 |
-
- [ ] `r4_dueling_vs_double_dueling_late.png`:ep=3000–5000 曲线对比,体现 dueling 末段稳定性优于 double_dueling
|
| 1134 |
-
- [ ] `r4_vanilla_eval_overfit.png`:vanilla ep=4000–5000 曲线,体现 EVAL 峰值虚高(94%)与下降
|
| 1135 |
-
|
| 1136 |
---
|
| 1137 |
|
| 1138 |
## 已知局限与后续优化项
|
|
@@ -1142,7 +1105,7 @@ Dueling 网络的真正泛化优势来自**参数共享机制**:V(s) 流被所
|
|
| 1142 |
| # | 问题 | 标准做法 | 本项目取舍 |
|
| 1143 |
|---|------|---------|----------|
|
| 1144 |
| A | 超参消融阶段多次参考了 Holdout 数字,测试集不严格无偏 | 验证集专用于超参搜索,Holdout 只在最终报告用一次 | 时间限制;R4 引入 EVAL-based checkpoint 是向正确方向的修正,但 R1–R3 的超参决策已隐性参考了 Holdout |
|
| 1145 |
-
| B | R3 同时修改
|
| 1146 |
| C | 所有结论基于单次训练,无重复实验 | 每配置 3–5 个随机种子,报告均值 ± std(Henderson et al. 2018) | 算力限制;dueling vs double_dueling 3pp 差距(Holdout n=100,CI≈±5pp)统计不显著,需重复实验确认 |
|
| 1147 |
| D | 评估时失败局步数未记录 | `run_evaluation()` 记录逐局步数,区分循环失败与走入死路失败 | 现有 log 无此数据;需改代码重跑,当前仅有训练期数据(混合探索期与贪心期) |
|
| 1148 |
|
|
@@ -1152,7 +1115,6 @@ Dueling 网络的真正泛化优势来自**参数共享机制**:V(s) 流被所
|
|
| 1152 |
|---|------|---------|---------|
|
| 1153 |
| E | visited_map 二值编码无法区分访问次数,网络对两格死循环覆盖不足,需 app 推理时兜底 | 将 ch3 改为归一化计数图(`min(count,3)/3.0`,cap=3),重新训练 | 网络内化"高频重访格应规避"策略,推理时 Q 值修正可完全移除 |
|
| 1154 |
| F | 振荡根治需 Prioritized Experience Replay | 实现 PER(Schaul et al. 2016),赋予高 TD-error 样本更高采样概率 | 消除均匀采样导致的成功样本周期性被覆盖问题,振荡从根本上消除 |
|
| 1155 |
-
| G | Ng et al. (1999) 势函数 shaping 省略了 γ,属近似实现 | 代码改为 `reward += alpha * (gamma * dist_after_to_goal - dist_before_to_goal)` 的标准形式 | 严格满足策略不变性定理,误差从约 1% 降至 0 |
|
| 1156 |
|
| 1157 |
### 指标层面
|
| 1158 |
|
|
|
|
| 13 |
| Round 0 | 固定起终点 | 基准(对照组) | 90–95% | — | — | 固定任务四算法均高度收敛,验证训练流程正确 |
|
| 14 |
| Round 1 | **随机起终点** | 初版超参 | 61.0% | 0.605 | — | `ep=2000` 曲线未收敛;`decay=0.995` 探索提前触底 |
|
| 15 |
| Round 2 | 随机起终点 | `ep=6000` + `decay=0.9985` | 64.0% | 0.633 | 74% | P1/P2 修复,新发现 buffer 过小(P3)和 target 同步过频(P4)|
|
| 16 |
+
| Round 3 | 随机起终点 | `buffer=80k` + `target=1500` | **74.0%** | **0.735** | **84%** | 峰值突破 80%;Holdout 低于峰值 10pp,根因为保存策略 |
|
| 17 |
| Round 4 | 随机起终点 | EVAL-based checkpoint + BFS 连通性验证;探索 revisit_penalty(失败)和 visited_map 4通道 | **78.0%**(A3,double 算法) | **0.773** | **88%** | P7(checkpoint时序)+P8(无解任务)系统性修复;P9(马尔可夫违反)新发现;A3为三项变量叠加,非单因素对照 |
|
| 18 |
| Round 4(续)| 随机起终点 | R4-A3 超参固定,四算法横向消融(唯一变量=算法)| **84.0%**(dueling,最优) | **0.817** | **94%**(vanilla) | dueling EVAL→Holdout gap=6pp 最优泛化;double_dueling 81%;vanilla 75%(19pp gap 虚高);Double DQN 危机恢复快但终态不及纯 dueling |
|
| 19 |
|
| 20 |
**关键结论链**:随机起终点使状态空间扩大约 40×,需要更长训练(R2)→ 更大 buffer 保留稀疏成功样本(R3)→ 修复 checkpoint 时序偏差 + 连通性验证 + visited_map 状态编码(R4)→ Dueling 架构的 V/A 分解与多动作等效迷宫导航任务高度适配(R4 算法消融)。奖励层循环抑制违反马尔可夫性(P9);状态层编码(visited_map)理论正确;最优配置(dueling + EVAL checkpoint + BFS + visited_map)最终将 Holdout 从 74%(R3)提升至 **84%**(+10pp)。
|
| 21 |
|
| 22 |
+
**R1→R4 纵向超参演进(Double DQN,相同算法)**:
|
| 23 |
+
|
| 24 |
+

|
| 25 |
+
|
| 26 |
---
|
| 27 |
|
| 28 |
## Round 0 — 固定起终点基准(对照组)
|
|
|
|
| 136 |
runs/train_double_dueling_20260531_023152/
|
| 137 |
```
|
| 138 |
|
| 139 |
+
### TensorBoard 曲线截图(与 P1–P4 诊断一一对应)
|
| 140 |
|
| 141 |
+
| 截图 | 论证的诊断点 | 解读 |
|
| 142 |
+
|------|------------|------|
|
| 143 |
+
|  | P1+P3 | 末端斜率为正(P1);无平台期,预测 R2 振荡周期约 400-500 ep(P3 预测) |
|
| 144 |
+
|  | P2 | ε 在 ep≈800 触底 0.05,P2 探索过早终止的直接证据 |
|
| 145 |
+
|  | P4 | Loss 高频震荡,target 同步过频的间接证据 |
|
| 146 |
|
| 147 |
+
> 已删除 R1 文档中无诊断对应的 SPL/AvgQ/GradNorm 截图。
|
| 148 |
|
| 149 |
### 结论与下一步行动
|
| 150 |
|
|
|
|
| 153 |
2. **P3(中优先级)**:buffer=20000 约 250 局轮换,预测 Round 2 将出现约 400–500 ep 周期振荡
|
| 154 |
3. **P4(中优先级)**:target 同步 272 次/轮,高 Q 方差场景下移动靶效应显著
|
| 155 |
|
| 156 |
+
**下一步行动(基于 R1 实际数据能合理推断的范围)**:
|
| 157 |
+
|
| 158 |
+
R1 暴露了 P1+P2+P3+P4 四个问题,且可预测 P3 的振荡周期。**R1 当时能直接决定的修复只有 P1+P2**(成对修改`num_episodes` 与 `epsilon_decay`),P3+P4 需在 R2 长曲线上验证后才能量化决定如何修复(如 buffer 扩到多少、target_update_freq 调到多少)。后续步骤(R3 验证、R4 checkpoint 修复、visited_map 引入)均需 R2/R3 实际数据才能合理设计,**不在 R1 阶段可推断范围**。
|
|
|
|
| 159 |
|
| 160 |
+
> 注:本节初稿曾一次性规划 R2-R4 全部步骤,但实际后续轮次的修复方向(P7 EVAL checkpoint、P8 BFS、visited_map 4通道)是 R2/R3 实跑后才发现的,不是 R1 阶段可预测的;故重写为只保留 R1 当时能直接合理推断的下一步。详见 `docs/hyperparameter_study.md` 第五节。
|
| 161 |
|
| 162 |
---
|
| 163 |
|
| 164 |
+
## Round 2 — 双变量调整:训练量 + 探索衰减
|
| 165 |
|
| 166 |
**日期**:2026-05-31
|
| 167 |
+
**目的**:验证 `num_episodes=6000` + `epsilon_decay=0.9985` 是否消除 P1/P2 问题(同时修改两个超参,其余不变)
|
| 168 |
**变更项**:
|
| 169 |
|
| 170 |
| 超参 | Round 1 | Round 2 | 变更原因 |
|
| 171 |
|------|---------|---------|---------|
|
| 172 |
| `num_episodes` | 2000 | **6000** | R1 曲线末端斜率仍为正,无平台期,训练量不足 |
|
| 173 |
| `epsilon_decay` | 0.995 | **0.9985** | R1 ep≈800 探索触底,后 1200 ep 样本多样性枯竭 |
|
| 174 |
+
| 其余 | 不变 | 不变 | P1/P2 已在 R1 诊断中明确,组合修改以加速验证 |
|
| 175 |
|
| 176 |
### 超参快照
|
| 177 |
|
|
|
|
| 276 |
|
| 277 |
---
|
| 278 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 279 |
---
|
| 280 |
|
| 281 |
### TensorBoard 运行目录
|
|
|
|
| 284 |
runs/Round2_double_epsilon0.9985_ep6000/
|
| 285 |
```
|
| 286 |
|
| 287 |
+
### TensorBoard 曲线截图(与 P1–P4 诊断一一对应)
|
| 288 |
|
| 289 |
+
| 截图 | 论证的诊断点 | 解读 |
|
| 290 |
+
|------|------------|------|
|
| 291 |
+
|  | P1 验收 | R2 末端出现局部峰值 74%(ep=3300/4250),训练量不足已解决 |
|
| 292 |
+
|  | P2 验收 | R2 ε 触底点 ep≈2189,R1 触底点 ep≈800,差距 1400 ep |
|
| 293 |
+
|  | P3(主瓶颈) | R2 长曲线全程振荡 52-74%,振幅 ±10%,与 P3 预测的 400-500ep 周期吻合 |
|
| 294 |
|
| 295 |
+
> 已删除 R2 文档中无诊断对应的 `r2_eval_spl.png` 截图(R2 诊断未引用 SPL)。
|
|
|
|
| 296 |
|
| 297 |
### 下一步行动
|
| 298 |
|
| 299 |
+
**R2 确认了 P1+P2 修复有效**,但发现新瓶颈 P3(buffer)和 P4(target)。
|
| 300 |
+
Round 3 同时修复 P3+P4(两个变量叠加,未做单变量消融),预期振荡幅度从 ±10% 降至 ±4% 以内,峰值超过 80%。
|
| 301 |
|
| 302 |
+
**依据上述 P3/P4 诊断,Round 3 同时修复两个问题:**
|
| 303 |
|
| 304 |
**1. `buffer_capacity: 80000`(修复 P3)**
|
| 305 |
|
|
|
|
| 313 |
依据 Mnih et al. (2015) 的 fixed Q-target 理论,更稀疏的同步使 TD 目标在更长窗口内保持稳定,
|
| 314 |
预期 `Backend_Net/Loss` 高频震荡峰值减少,Q 值估计方差降低。
|
| 315 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 316 |
---
|
| 317 |
|
| 318 |
+
## Round 3 — buffer 扩容 + target 稳定
|
| 319 |
|
| 320 |
**日期**:2026-05-31
|
| 321 |
+
**目的**:同时修复 P3(buffer)、P4(target sync),验证成功率能否突破 80%
|
| 322 |
**变更项**:
|
| 323 |
|
| 324 |
| 超参 | Round 2 | Round 3 | 变更原因 |
|
| 325 |
|------|---------|---------|---------|
|
| 326 |
| `buffer_capacity` | 20000 | **80000** | 约 250 局轮换→约 1000 局,消除振荡 |
|
| 327 |
| `target_update_freq` | 500 | **1500** | 随机起终点 Q 方差大,减少目标漂移 |
|
|
|
|
| 328 |
| 其余 | 不变 | 不变 | — |
|
| 329 |
|
| 330 |
### 超参快照
|
|
|
|
| 336 |
| `buffer_capacity` | **80000** |
|
| 337 |
| `target_update_freq` | **1500** |
|
| 338 |
| `warmup_episodes` | 200 |
|
|
|
|
| 339 |
| `random_start_goal` | true |
|
| 340 |
| `algorithm` | double |
|
| 341 |
|
|
|
|
| 361 |
### Blind Test 曲线关键数据(double 算法)
|
| 362 |
|
| 363 |
```
|
| 364 |
+
ep= 400– 650: 8–18% ← 早期 Q 值高估导致 EVAL 骤降(根因待定,Double DQN 自修正后恢复)
|
| 365 |
ep= 800: 42% ← Double DQN 自修正后恢复
|
| 366 |
ep=1000–2100: 44–70% ← ε 触底前的上升段(R3 起步比 R2 高约 6pp)
|
| 367 |
ep=2200–2250: 70% ← ε 触底(ep≈2189)后首个高峰
|
|
|
|
| 402 |
|
| 403 |
**结论**:target 更新频率降低有效减少了 Q 值的随机漂移,是峰值从 74% → 84% 的贡献因素之一。
|
| 404 |
|
| 405 |
+
#### P5 — 早期 Q 值高估危机(现象记录,根因待定)
|
|
|
|
|
|
|
| 406 |
|
| 407 |
+
**现象**:ep=400–650 出现 EVAL 骤降至 8–18%(AvgQ 飙升至峰值 78,R2 同期约 40–50)。
|
|
|
|
|
|
|
| 408 |
|
| 409 |
+
**自修正过程**:Double DQN 的解耦估计机制(van Hasselt et al. 2016)在约 400 ep 内完成自修正,
|
| 410 |
+
ep=800 成功率恢复至 42%,ep=1000 回到 44%,ep=1050 跳升至 62%,之后完全恢复。
|
| 411 |
+
全程无需人工干预。
|
|
|
|
|
|
|
| 412 |
|
| 413 |
+
**根因待定**:crisis 与 buffer×4 + target×3 改动时间窗重合,但二者与 Q 高估之间的具体因果链未做消融验证。可能解释:更大 buffer 延长了旧策略样本的滞留时间,更稀疏的 target 同步放大了 TD 目标漂移,二者叠加在早期训练阶段放大 Q 值估计方差。需补做单变量消融方能严格归因。
|
|
|
|
|
|
|
| 414 |
|
| 415 |
#### P6(新)— 振荡根因未彻底解决:周期性遗忘
|
| 416 |
|
|
|
|
| 426 |
### TensorBoard 运行目录
|
| 427 |
|
| 428 |
```
|
| 429 |
+
runs/Round3_double_buffer80k_target1500/
|
| 430 |
+
runs/Round3_double_buffer80k_target1500_restart/ ← 重启前的短暂记录(ep<400)
|
| 431 |
```
|
| 432 |
|
| 433 |
### TensorBoard 曲线截图
|
|
|
|
| 442 |
|
| 443 |
#### 一、R3 核心结论
|
| 444 |
|
| 445 |
+
buffer+target 组合将盲测峰值�� 74% 提升至 **84%**,Holdout 从 64% 提升至 **74%**(+10pp)。
|
| 446 |
+
两项修复方向全部正确,但 **Holdout 低于峰值 10pp** 的问题仍未解决,需要专项诊断。
|
| 447 |
|
| 448 |
---
|
| 449 |
|
| 450 |
#### 二、Holdout 低于峰值 10pp 的数据诊断
|
| 451 |
|
| 452 |
+
对 R3 全程 EVAL 数据(ep=800–6000,避开早期 Q 高估 crisis 期)做分段统计:
|
| 453 |
|
| 454 |
| 阶段 | 均值 | 峰值 | 低谷 |
|
| 455 |
|------|------|------|------|
|
|
|
|
| 481 |
|
| 482 |
---
|
| 483 |
|
| 484 |
+
#### 四、循环失败率的直接测量(R4 引入 4 通道的依据)
|
| 485 |
+
|
| 486 |
+
R3 训练完成后,将 best_model 在 Web Demo 中实测推理(ε=0 纯贪心),观察到 agent 在部分地图中陷入两格间无限震荡——A→B→A→B 循环 200 步触底截断。此现象直接指向"状态层缺少访问历史 → 推理时 Q 函数无法区分两格循环与两格前进",是 R4 引入 visited_map 第 4 通道的直接动机。**R4 行动计划中"探索循环抑制方案"一项的数据依据如下**:
|
| 487 |
+
|
| 488 |
+
| 分类 | R3 局数 | R4 局数 |
|
| 489 |
+
|------|--------:|--------:|
|
| 490 |
+
| 快速成功(≤30 步) | 75 | 78 |
|
| 491 |
+
| 正常成功(31-80 步) / 慢成功(81-200 步) | 0 / 0 | 0 / 0 |
|
| 492 |
+
| 失败·截断(步数=200) | **25** | **22** |
|
| 493 |
+
| 失败·近截断(150-199)/ 早夭(<150) | 0 / 0 | 0 / 0 |
|
| 494 |
+
| 成功率 | 75% | 78% |
|
| 495 |
+
| **失败局中截断占比** | **25/25 = 100%** | **22/22 = 100%** |
|
| 496 |
+
| 失败局平均撞墙数 | 0.0 | 0.0 |
|
| 497 |
+
|
| 498 |
+
*Holdout 100 局(seed+200042..+200141),R3 / R4 best_model 均为 double 算法。*
|
| 499 |
+
|
| 500 |
+
**数据解读**:
|
| 501 |
+
|
| 502 |
+
- **100% 截断 + 撞墙=0**:撞墙=0 排除"撞墙堵死"(撞墙会留下 hit_wall 计数),唯一合理解释是 agent 在自由格间反复震荡;10×10 迷宫最优路径仅 15-25 步,200 步远超合理上限。
|
| 503 |
+
- **失败-成功 0/1 离散**:成功局集中在 ≤30 步,失败局集中在 200 步,无中间过渡;0% 近截断、0% 早夭,无"接近但错过"或"路径规划差但仍在前进"的中间情形。
|
| 504 |
+
- **R3 → R4 变化**:25 → 22 截断局(绝对 −3pp,相对 −12%;n=100 下 σ ≈ √(0.25·0.75/100) ≈ 4.3pp,3pp **不具统计显著性**),但**截断率 100% 这一失败模式结构未变**——4 通道减少循环地图数量,循环机制本身仍是 R4 EVAL 期失败主因。
|
| 505 |
+
|
| 506 |
+
**R3 训练期 → EVAL 期的因果链**:训练期截断率 15.5%(含 5% ε 探索,部分跳出循环)→ EVAL 期截断率 25%(ε=0,循环被锁定)→ 100% 截断且撞墙=0 → 循环机制是 R3 失败主因 → R4 必须显式编码访问历史。
|
| 507 |
+
|
| 508 |
+
---
|
| 509 |
+
|
| 510 |
+
#### 五、R4 行动计划
|
| 511 |
|
| 512 |
**核心变更(必做):将模型保存触发条件改为 EVAL 成功率创新高**
|
| 513 |
|
|
|
|
| 526 |
| `epsilon_decay` | 0.9985 | 不变 |
|
| 527 |
| `buffer_capacity` | 80000 | 不变 |
|
| 528 |
| `target_update_freq` | 1500 | 不变 |
|
|
|
|
| 529 |
| **`revisit_penalty`** | **-1.0** | **新增:训练时重复访问格子施加递进惩罚,抑制循环路径** |
|
| 530 |
| **checkpoint 保存策略** | **EVAL 成功率最优** | **本轮核心变更** |
|
| 531 |
|
|
|
|
| 612 |
|
| 613 |
#### 推理时策略循环问题(新发现)
|
| 614 |
|
| 615 |
+
**发现路径**:R3 训练完成后,将 best_model 在 Web Demo 中实测推理(ε=0 纯贪心),观察到 agent 在部分地图中陷入两格间无限震荡——A→B→A→B 循环 200 步触底截断。此现象直接指向"状态层缺少访问历史 → 推理时 Q 函数无法区分两格循环与两格前进",是 R4 引入 visited_map 第 4 通道的直接动机。
|
| 616 |
+
|
| 617 |
+
**EVAL 期步数分布(量化佐证)**:详见上文"四、循环失败率的直接测量"——R3 best_model 在 Holdout 100 局(ε=0 贪心)上的逐局步数显示 25/25=100% 失败局是步数=200 截断且撞墙=0.0,确证循环是 R3 EVAL 期失败的主因。训练期 vs EVAL 期的截断率差异(15.5% → 25%,见表 6.3)即 ε 探索在循环抑制上的边际贡献。
|
| 618 |
|
| 619 |
+
**根因**:训练期间 ε>0 随机探索在多数情况下帮助 agent 跳出局部循环,但**有部分地图起终点组合使 ε 探索也不足以在 200 步内到达终点**——这部分训练局贡献的样本是"循环 200 步的负奖励轨迹",网络学到"某些区域走出去成本极高"但不知道主动规避重复访问。visited_map 第 4 通道把"是否访问过"显式编码到状态中,使网络可直接学习"重访���本"——从症状侧抑制循环(不是消除机制)。
|
| 620 |
|
| 621 |
+
此问题是 R4 的第三个攻坚方向,见后续尝试记录(R4-A1 revisit_penalty 失败 + R4-A2 visited_map 成功)。
|
| 622 |
|
| 623 |
---
|
| 624 |
|
| 625 |
### R4 完整尝试记录
|
| 626 |
|
| 627 |
+
R4 共进行四次独立尝试(对照组 R4-A3 已完成),每次对比 R3 数据。
|
| 628 |
|
| 629 |
**注意**:R3 使用 eval_every=50,R4 系列使用 eval_every=100,下方对比统一取 100 ep 间隔数据点。
|
| 630 |
|
| 631 |
R3 每 100 ep 的 EVAL 成功率(取相邻 50ep 点均值,ep=300 起):
|
| 632 |
|
| 633 |
```
|
| 634 |
+
ep= 300: 55% ep= 400: 8% ep= 500: 19% ep= 600: 16% ep= 700: 29% ← 早期 Q 值高估 crisis
|
| 635 |
ep= 800: 41% ep= 900: 42% ep=1000: 53% ep=1100: 58% ep=1200: 65%
|
| 636 |
ep=1300: 57% ep=1400: 63% ep=1500: 67% ep=1600: 65% ep=1700: 64%
|
| 637 |
ep=1800: 66% ep=1900: 68% ep=2000: 64% ep=2100: 66% ep=2200: 70%
|
|
|
|
| 680 |
|
| 681 |
网络拟合的是"含历史信息的"奖励函数,但推理时该信息不存在,导致 Q 值系统性失准,策略崩溃。这不是 Q 值高估问题(Double DQN 可修正),而是目标函数本身在测试分布下无意义。
|
| 682 |
|
| 683 |
+
**与早期 Q 值高估 crisis(Q 值估计暂时性偏差)的本质区别**:crisis 是 Q 值在学习过程中的暂时性估计偏差,奖励函数形式在训练和推理时一致,Double DQN 可自修正;P9 是奖励函数结构在训练和推理时不一致(训练时含访问历史惩罚,推理时无),Q 函数目标在测试分布下无意义,不可修正。
|
| 684 |
|
| 685 |
**结论**:**结构性失败,不可修补。** 奖励层的循环抑制方案在任何需要"有状态奖励"的场景下都会违反马尔可夫性。
|
| 686 |
|
|
|
|
| 732 |
|
| 733 |
**Q 值高估危机(ep=400–700)复现**:
|
| 734 |
|
| 735 |
+
与 R3 早期 crisis 现象一致:新增第4通道改变了网络输入分布,早期 buffer 中 Q 目标值系统性偏高,AvgQ 飙升(峰值 57+)。Double DQN 在约 400 ep 内完成自修正:
|
| 736 |
|
| 737 |
$$\hat{Q}_{\text{Double}}(s,a) = r + \gamma Q_{\theta^-}(s', \arg\max_{a'} Q_\theta(s',a'))$$
|
| 738 |
|
|
|
|
| 755 |
|
| 756 |
---
|
| 757 |
|
| 758 |
+
#### R4-A3 — R3 超参 + EVAL checkpoint + BFS 连通性验证 + visited_map(已完成)
|
| 759 |
|
| 760 |
+
**日期**:2026-05-31(训练完成日 2026-05-31,文档整理日 2026-06-01)
|
| 761 |
+
**日志**:`logs/r4_ctrl_eval_ckpt.log`(ep=5000 训练已完成,Holdout 78% 已报告)
|
| 762 |
**设计意图**:在 R3 超参基础上,同步引入三项修复:P7(EVAL checkpoint)、P8(BFS 连通性)、以及 R4-A2 引入的 visited_map 第4通道。三项变量**同时存在**,无法单独分离各项贡献,本组的结论是"三项叠加的综合效果"。
|
| 763 |
|
| 764 |
**与 R3 的精确差异**:
|
|
|
|
| 768 |
| checkpoint 触发 | 训练滚动奖励最高 | **EVAL 成功率创新高** |
|
| 769 |
| 随机起终点连通性 | 无验证(~5-10% 无解) | **BFS 验证,保证可达** |
|
| 770 |
| 观测通道数 | **3通道**(wall / agent / goal) | **4通道**(+visited_map,同 R4-A2) |
|
| 771 |
+
| 超参 | buffer=80k, target=1500, ep=5000 | 全部相同 |
|
| 772 |
|
| 773 |
**checkpoint 保存逻辑(commit `fbc2dc6`)**:
|
| 774 |
|
|
|
|
| 856 |
|
| 857 |
| 方案 | 核心改动 | EVAL 峰值 | Holdout | 相比 R3 |
|
| 858 |
|------|---------|:---------:|:-------:|:-------:|
|
| 859 |
+
| **R3 基准** | buffer+target | 84%(ep=3750) | 74% / SPL=0.735 | 基准 |
|
| 860 |
| **R4-A1** | revisit_penalty=-1.0 | 52% | killed ep=1000 | **结构性失败** |
|
| 861 |
| **R4-A2** | visited_map 4通道 | 80%(ep=4600) | 75% / SPL=0.735 | **+1pp,统计不显著** |
|
| 862 |
| **R4-A3** | EVAL checkpoint + BFS + visited_map(三项叠加) | **88%**(ep=3300) | **78% / SPL=0.773** | **+4pp** |
|
|
|
|
| 881 |
|
| 882 |
```
|
| 883 |
runs/Round4_double_visited_map/ ← R4-A2 记录
|
| 884 |
+
runs/Round4_ctrl_eval_ckpt/ ← R4-A3 记录(已完成,ep=5000)
|
| 885 |
```
|
| 886 |
|
| 887 |
### 所需截图
|
|
|
|
| 923 |
| `epsilon_decay` | 0.9985 |
|
| 924 |
| `buffer_capacity` | 80000 |
|
| 925 |
| `target_update_freq` | 1500 |
|
|
|
|
| 926 |
| `warmup_episodes` | 200 |
|
| 927 |
| `eval_every` | 100 |
|
| 928 |
| `num_test_mazes` | 50 |
|
|
|
|
| 935 |
|
| 936 |
#### 危机成因(共性)
|
| 937 |
|
| 938 |
+
四种算法在 ep≈400–700 区间均出现 EVAL 成功率骤降,根因为 **vanilla 目标 $\hat{Q} = r + \gamma \max_{a'} Q_{\theta^-}(s',a')$ 的 $\max$ 算子正偏差被 bootstrapping 反复放大**:R3 起引入的 buffer×4 + target×3 改动(延长旧策略样本滞留、放大 TD 目标漂移)与 R4 引入的 visited_map 第4通道(输入分布变化)使早期 $Q_{\theta^-}$ 系统性高估,TD 目标通过自举迭代形成正反馈回路,AvgQ 飙升,EVAL 骤降。同一机制在不同算法上表现程度不同,根源是它们对 max 算子的修正能力不同。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 939 |
|
| 940 |
#### 四算法危机程度对比
|
| 941 |
|
|
|
|
| 950 |
|
| 951 |
#### Double DQN 的抗危机机制
|
| 952 |
|
| 953 |
+
**vanilla 与 dueling 用 vanilla 目标**($\max$ 算子正偏差在 Q 含噪声时系统性选中噪声最大动作,造成持续高估);**double 与 double_dueling 用 Double DQN 目标**(van Hasselt et al. 2016):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 954 |
|
| 955 |
$$\hat{Q}_{\text{double}} = r + \gamma Q_{\theta^-}(s', \arg\max_{a'} Q_\theta(s',a'))$$
|
| 956 |
|
| 957 |
+
解耦动作选择($Q_\theta$)与价值估计($Q_{\theta^-}$),两者的估计误差相关性低、互相抵消,$\max$ 算子的系统性高估被有效抑制。这解释了为何 double_dueling(ep=700:54%)远快于 dueling(ep=700:6%)恢复。
|
|
|
|
|
|
|
| 958 |
|
| 959 |
---
|
| 960 |
|
| 961 |
### EVAL 曲线关键节点对比
|
| 962 |
|
| 963 |
+
| 阶段 | vanilla | double(A3) | dueling | double_dueling |
|
| 964 |
+
|------|:-------:|:-----------:|:-------:|:--------------:|
|
| 965 |
+
| 危机最低点 | 6%(ep=600) | 10%(ep=500–600) | 4%(ep=500)/ 6%(ep=700)| 20%(ep=400) |
|
| 966 |
+
| 危机期 ep=700 | — | 18% | 6%(二次探底)| **54%**(已恢复) |
|
| 967 |
+
| EVAL 峰值 | 94%(ep=4800) | 88%(ep=3300) | 90%(ep=4900)| 90%(ep=4200) |
|
| 968 |
+
| 峰值 ep | 4800 | 3300 | 4900 | **4200**(最早) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 969 |
|
| 970 |
+
**观察**:
|
| 971 |
|
| 972 |
+
- **危机期排序**(底越深越严重):dueling 4% ≪ vanilla 6% < double 10% < double_dueling 20%。Double DQN 抗高估机制使 double_dueling 危机最浅
|
| 973 |
+
- **恢复速度**:ep=700 时 double_dueling(54%)领先 dueling(6%)48pp,是 Double DQN 解耦机制最直接定量证据
|
| 974 |
+
- **峰值时机**:double_dueling(ep=4200)比 vanilla(ep=4800)早 600 ep,体现双重改进加速收敛;vanilla 与 dueling 峰值均靠后,说明单一改进在本任务规模下需要更多训练时间
|
| 975 |
+
- double(A3) 完整曲线见 [R4-A3 节](#r4-a3--r3-超参--eval-checkpoint--bfs-连通性验证--visited_map已完成)
|
| 976 |
|
| 977 |
---
|
| 978 |
|
|
|
|
| 1066 |
|
| 1067 |
---
|
| 1068 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1069 |
### 结论链(R1→R4 纵向总结)
|
| 1070 |
|
| 1071 |
以下为本项目全程的核心发现链,以 Holdout 成功率为主线:
|
|
|
|
| 1074 |
|------|---------|:-------:|------------|
|
| 1075 |
| R1 | 随机起终点基线 | 61% | P1(训练量不足)、P2(探索过早终底)|
|
| 1076 |
| R2 | 延长训练+调缓探索衰减 | 64% | P3(buffer 过小导致振荡)、P4(target 同步过频)|
|
| 1077 |
+
| R3 | buffer×4 + target×3 | 74% | P5(早期 Q 值高估 crisis,根因待定)、P7(checkpoint 时序偏差 10pp)|
|
| 1078 |
| R4-A1 | revisit_penalty(失败) | — | **P9(马尔可夫性违反)** ← 结构性失败 |
|
| 1079 |
| R4-A2 | visited_map 4通道 | 75% | P7 未修复导致 EVAL 峰值无法转化为 Holdout 提升 |
|
| 1080 |
| R4-A3 (double) | EVAL checkpoint + BFS + visited_map | 78% | EVAL→Holdout gap 10pp 持续(算法限制) |
|
|
|
|
| 1084 |
|
| 1085 |
**最终结论(五点)**:
|
| 1086 |
|
| 1087 |
+
1. **Dueling 架构是本任务的最优选择**:V(s)/A(s,a) 分解使网络能将"位置价值"与"动作优势"解耦学习,与随机起终点迷宫导航任务的任务结构(大量多动作等效状态)高度吻合,最终 Holdout 84%(+10pp vs R3),EVAL→Holdout gap 6pp(最小,泛化最稳)。其中 R3→R4(double) 的 +4pp 是 P7+P8+visited_map 三项叠加效果(见结论4),R4(double)→R4(dueling) 的 +6pp 是 Dueling 架构的独立贡献(控制其他变量不变)。
|
| 1088 |
|
| 1089 |
2. **Double DQN 主要收益在训练过程,非最终结果**:危机期加速恢复(ep=700 领先 dueling 48pp)和早期收敛加速是真实可量化的收益;但在 5000 ep 充分训练后,与纯 dueling 的最终 Holdout 差距(81% vs 84%)表明 Double DQN 的抗高估机制在本任务规模下已不是瓶颈。
|
| 1090 |
|
| 1091 |
3. **EVAL→Holdout gap 是算法质量的独立指标**:Gap 越小说明策略对未见地图的鲁棒性越高。dueling gap 6pp、double_dueling 9pp、double 10pp、vanilla 19pp,与各算法的架构泛化能力排序一致,可作为独立于 Holdout 成功率的泛化质量指标。
|
| 1092 |
|
| 1093 |
+
4. **P7(EVAL-based checkpoint)是高性价比修复,但单项贡献未严格消融**:R3→R4(double) 的 +4pp 是 P7+P8+visited_map 三项叠加效果,未做单变量消融无法精确归因。R4-A2(仅 visited_map,无 P7)Holdout=75% 仅 +1pp(不显著),间接说明 P7 是三项中单项收益最大者,但严格证明需补做 3通道+EVAL checkpoint+BFS 对照组。
|
| 1094 |
|
| 1095 |
5. **P9(马尔可夫性违反)是硬约束**:任何将 episode 历史信息置于奖励函数中的循环抑制方案(revisit_penalty 等)均导致 Q 函数目标无意义,正确解决方案唯有状态编码(visited_map)。
|
| 1096 |
|
| 1097 |
---
|
| 1098 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1099 |
---
|
| 1100 |
|
| 1101 |
## 已知局限与后续优化项
|
|
|
|
| 1105 |
| # | 问题 | 标准做法 | 本项目取舍 |
|
| 1106 |
|---|------|---------|----------|
|
| 1107 |
| A | 超参消融阶段多次参考了 Holdout 数字,测试集不严格无偏 | 验证集专用于超参搜索,Holdout 只在最终报告用一次 | 时间限制;R4 引入 EVAL-based checkpoint 是向正确方向的修正,但 R1–R3 的超参决策已隐性参考了 Holdout |
|
| 1108 |
+
| B | R3 同时修改两个变量(buffer + target_freq),无法归因各自贡献 | 每次只改一个变量,或补做单因素对照组 | 时间限制;buffer×4 与 target×3 的独立贡献未被单独量化 |
|
| 1109 |
| C | 所有结论基于单次训练,无重复实验 | 每配置 3–5 个随机种子,报告均值 ± std(Henderson et al. 2018) | 算力限制;dueling vs double_dueling 3pp 差距(Holdout n=100,CI≈±5pp)统计不显著,需重复实验确认 |
|
| 1110 |
| D | 评估时失败局步数未记录 | `run_evaluation()` 记录逐局步数,区分循环失败与走入死路失败 | 现有 log 无此数据;需改代码重跑,当前仅有训练期数据(混合探索期与贪心期) |
|
| 1111 |
|
|
|
|
| 1115 |
|---|------|---------|---------|
|
| 1116 |
| E | visited_map 二值编码无法区分访问次数,网络对两格死循环覆盖不足,需 app 推理时兜底 | 将 ch3 改为归一化计数图(`min(count,3)/3.0`,cap=3),重新训练 | 网络内化"高频重访格应规避"策略,推理时 Q 值修正可完全移除 |
|
| 1117 |
| F | 振荡根治需 Prioritized Experience Replay | 实现 PER(Schaul et al. 2016),赋予高 TD-error 样本更高采样概率 | 消除均匀采样导致的成功样本周期性被覆盖问题,振荡从根本上消除 |
|
|
|
|
| 1118 |
|
| 1119 |
### 指标层面
|
| 1120 |
|
|
@@ -13,7 +13,6 @@
|
|
| 13 |
| `epsilon_decay` | 0.995 | **0.9985** | 0.9985 | 0.9985 | van Hasselt et al. (2016):ε 应在训练期 10–25% 内衰减完;R1 ep≈800 触底,后 1200 ep 样本单一 |
|
| 14 |
| `buffer_capacity` | 20000 | 20000 | **80000** | 80000 | Lin (1992):ER 核心价值是保留稀有样本;Mnih et al. (2015) 原版 1M;20k≈250 局,成功样本快速消失 |
|
| 15 |
| `target_update_freq` | 500 | 500 | **1500** | 1500 | Mnih et al. (2015) 原版 10000 步;固定目标 $\theta^-$ 保证 TD 收敛性,过频同步等价于"移动靶"监督学习 |
|
| 16 |
-
| `distance_shaping_alpha` | 0 | 0 | **0.5** | 0.5 | Ng et al. (1999):势函数 shaping 标准形式 $r' = r + \gamma\Phi(s') - \Phi(s)$;代码实现省略 $\gamma$($\gamma=1$ 近似),在 $\gamma=0.99$ 下误差约 1%,实践可忽略,但不严格满足策略不变性定理 |
|
| 17 |
| `revisit_penalty` | 0 | 0 | 0 | ~~-1.0~~ → **弃用** | Round 4 实验后因违反马尔可夫性放弃,改用 visited_map 第四通道编码访问历史 |
|
| 18 |
| checkpoint 保存策略 | 训练奖励触发 | 训练奖励触发 | 训练奖励触发 | **EVAL 最优触发** | R3 实测:训练奖励与 EVAL 成功率时序不对齐,导致 Holdout 74% vs EVAL 峰值 84%,差 10pp |
|
| 19 |
|
|
@@ -25,7 +24,7 @@
|
|
| 25 |
|------|---------|:--------------:|:---------:|---------|
|
| 26 |
| R1 | 基线(随机起终点初版) | 61.0% | — | 诊断 P1(训练量)+ P2(探索)+ P3(buffer)+ P4(target)|
|
| 27 |
| R2 | `ep=6000` + `decay=0.9985` | 64.0% | 74.0% | P1/P2 消除;振荡周期 400–500 ep(P3 定量确认)|
|
| 28 |
-
| R3 | `buffer=80k` + `target=1500`
|
| 29 |
| R4 | EVAL-based checkpoint + visited_map 第四通道(revisit_penalty 因违反马尔可夫性弃用) | **84.0%**(dueling) | **88.0%**(dueling,ep=4900) | 四算法横向消融最优;double(A3) Holdout 78%,见 experiment_log.md Round 4 |
|
| 30 |
|
| 31 |
---
|
|
@@ -35,8 +34,8 @@
|
|
| 35 |
Henderson et al. (2018) 实证结论:**RL 超参敏感度远高于监督学习,需单变量消融**,避免多参数同时变动导致无法归因。
|
| 36 |
|
| 37 |
- R2:仅修复 P1+P2,验证收敛形状
|
| 38 |
-
- R3:同时修复 P3+P4
|
| 39 |
-
- R4:修复保存策略(P6)+ visited_map 第四通道(revisit_penalty 已弃用),Holdout 78.0%
|
| 40 |
|
| 41 |
---
|
| 42 |
|
|
|
|
| 13 |
| `epsilon_decay` | 0.995 | **0.9985** | 0.9985 | 0.9985 | van Hasselt et al. (2016):ε 应在训练期 10–25% 内衰减完;R1 ep≈800 触底,后 1200 ep 样本单一 |
|
| 14 |
| `buffer_capacity` | 20000 | 20000 | **80000** | 80000 | Lin (1992):ER 核心价值是保留稀有样本;Mnih et al. (2015) 原版 1M;20k≈250 局,成功样本快速消失 |
|
| 15 |
| `target_update_freq` | 500 | 500 | **1500** | 1500 | Mnih et al. (2015) 原版 10000 步;固定目标 $\theta^-$ 保证 TD 收敛性,过频同步等价于"移动靶"监督学习 |
|
|
|
|
| 16 |
| `revisit_penalty` | 0 | 0 | 0 | ~~-1.0~~ → **弃用** | Round 4 实验后因违反马尔可夫性放弃,改用 visited_map 第四通道编码访问历史 |
|
| 17 |
| checkpoint 保存策略 | 训练奖励触发 | 训练奖励触发 | 训练奖励触发 | **EVAL 最优触发** | R3 实测:训练奖励与 EVAL 成功率时序不对齐,导致 Holdout 74% vs EVAL 峰值 84%,差 10pp |
|
| 18 |
|
|
|
|
| 24 |
|------|---------|:--------------:|:---------:|---------|
|
| 25 |
| R1 | 基线(随机起终点初版) | 61.0% | — | 诊断 P1(训练量)+ P2(探索)+ P3(buffer)+ P4(target)|
|
| 26 |
| R2 | `ep=6000` + `decay=0.9985` | 64.0% | 74.0% | P1/P2 消除;振荡周期 400–500 ep(P3 定量确认)|
|
| 27 |
+
| R3 | `buffer=80k` + `target=1500` | **74.0%** | **84.0%** | 峰值突破 80%;Holdout 低于峰值 10pp(P6:保存策略错位)|
|
| 28 |
| R4 | EVAL-based checkpoint + visited_map 第四通道(revisit_penalty 因违反马尔可夫性弃用) | **84.0%**(dueling) | **88.0%**(dueling,ep=4900) | 四算法横向消融最优;double(A3) Holdout 78%,见 experiment_log.md Round 4 |
|
| 29 |
|
| 30 |
---
|
|
|
|
| 34 |
Henderson et al. (2018) 实证结论:**RL 超参敏感度远高于监督学习,需单变量消融**,避免多参数同时变动导致无法归因。
|
| 35 |
|
| 36 |
- R2:仅修复 P1+P2,验证收敛形状
|
| 37 |
+
- R3:同时修复 P3+P4,验证振荡是否消除
|
| 38 |
+
- R4:修复保存策略(P6)+ visited_map 第四通道(revisit_penalty 已弃用),A3(double)Holdout 78.0% / Dueling 横评 84.0%
|
| 39 |
|
| 40 |
---
|
| 41 |
|
|
@@ -103,7 +103,7 @@ Step 级 warmup 可能在一局中途切换为学习模式,导致同一局内
|
|
| 103 |
| 指标 | 回答的问题 | 指导下一步方向 |
|
| 104 |
|------|----------|--------------|
|
| 105 |
| **成功率** | 策略是否可用? | 若低 → 改算法、调超参、修训练信号 |
|
| 106 |
-
| **Grid-SPL** | 成功时路径是否高效? | 若 SPL/成功率比值低 → 优化路径规划(
|
| 107 |
|
| 108 |
**本项目实测结论**:四算法 Holdout SPL/成功率比值为 0.968–0.991(均值 0.978),全程 EVAL 逐点比值稳定在 0.986 ± 0.014。这说明**成功时的路径效率已不是瓶颈**——agent 要么高效成功,要么完全失败,路径规划本身已接近最优。后续提升空间集中在成功率本身,而非路径效率。
|
| 109 |
|
|
@@ -113,7 +113,7 @@ Step 级 warmup 可能在一局中途切换为学习模式,导致同一局内
|
|
| 113 |
|
| 114 |
### 4.3 Grid-SPL(Anderson et al. 2018 变体)
|
| 115 |
|
| 116 |
-
$$\text{SPL} = \frac{1}{N} \sum_{i=1}^{N} S_i \cdot \frac{\ell^{*}
|
| 117 |
|
| 118 |
- $S_i$:第 i 局成功标志(0/1)
|
| 119 |
- $\ell^{*}_i$:BFS 最短路径步数
|
|
@@ -129,6 +129,17 @@ $$\text{SPL} = \frac{1}{N} \sum_{i=1}^{N} S_i \cdot \frac{\ell^{*}_i}{\max(\ell^
|
|
| 129 |
|
| 130 |
**Holdout 防泄漏**:训练地图每局随机生成(seed 随机);评估地图固定 100 张(seed+200000),seed 空间完全隔离,确保曲线波动反映 Q 函数能力而非地图难度变化。
|
| 131 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
---
|
| 133 |
|
| 134 |
## 五、工程设计亮点
|
|
@@ -152,7 +163,7 @@ $$\text{SPL} = \frac{1}{N} \sum_{i=1}^{N} S_i \cdot \frac{\ell^{*}_i}{\max(\ell^
|
|
| 152 |
|------|---------|:-------------:|:---:|------------|
|
| 153 |
| R1 | 随机起终点初版 | 61.0% | 0.605 | 训练量不足、探索过早终止 |
|
| 154 |
| R2 | `ep↑` + `decay↓` | 64.0% | 0.633 | buffer 过小导致振荡 |
|
| 155 |
-
| R3 | `buffer×4` + `target×3`
|
| 156 |
| R4 | EVAL checkpoint + BFS + visited_map | **78.0%** | **0.773** | — |
|
| 157 |
|
| 158 |

|
|
@@ -178,15 +189,33 @@ $$\text{SPL} = \frac{1}{N} \sum_{i=1}^{N} S_i \cdot \frac{\ell^{*}_i}{\max(\ell^
|
|
| 178 |
|
| 179 |
### 6.3 失败模式分析
|
| 180 |
|
| 181 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 182 |
|
| 183 |
-
|
| 184 |
-
|------|:-----------:|:--------------:|
|
| 185 |
-
| Dueling | 161.0 | 59.0% |
|
| 186 |
-
| Double + Dueling | 157.1 | 54.5% |
|
| 187 |
-
| Vanilla | 157.9 | 55.9% |
|
| 188 |
|
| 189 |
-
|
| 190 |
|
| 191 |
---
|
| 192 |
|
|
|
|
| 103 |
| 指标 | 回答的问题 | 指导下一步方向 |
|
| 104 |
|------|----------|--------------|
|
| 105 |
| **成功率** | 策略是否可用? | 若低 → 改算法、调超参、修训练信号 |
|
| 106 |
+
| **Grid-SPL** | 成功时路径是否高效? | 若 SPL/成功率比值低 → 优化路径规划(延长训练等) |
|
| 107 |
|
| 108 |
**本项目实测结论**:四算法 Holdout SPL/成功率比值为 0.968–0.991(均值 0.978),全程 EVAL 逐点比值稳定在 0.986 ± 0.014。这说明**成功时的路径效率已不是瓶颈**——agent 要么高效成功,要么完全失败,路径规划本身已接近最优。后续提升空间集中在成功率本身,而非路径效率。
|
| 109 |
|
|
|
|
| 113 |
|
| 114 |
### 4.3 Grid-SPL(Anderson et al. 2018 变体)
|
| 115 |
|
| 116 |
+
$$\text{SPL} = \frac{1}{N} \sum_{i=1}^{N} S_i \cdot \frac{\ell^{*}_{i}}{\max(\ell^{*}_{i},\, p_{i})}$$
|
| 117 |
|
| 118 |
- $S_i$:第 i 局成功标志(0/1)
|
| 119 |
- $\ell^{*}_i$:BFS 最短路径步数
|
|
|
|
| 129 |
|
| 130 |
**Holdout 防泄漏**:训练地图每局随机生成(seed 随机);评估地图固定 100 张(seed+200000),seed 空间完全隔离,确保曲线波动反映 Q 函数能力而非地图难度变化。
|
| 131 |
|
| 132 |
+
### 4.4 各阶段用哪个指标
|
| 133 |
+
|
| 134 |
+
三套指标配合,按阶段分工:
|
| 135 |
+
|
| 136 |
+
| 阶段 | 主要指标 | 次要指标 | 决策依据 |
|
| 137 |
+
|------|---------|---------|---------|
|
| 138 |
+
| 阶段一(冒烟) | 训练奖励 | — | 固定起终点下奖励能涨 → 训练代码无 bug |
|
| 139 |
+
| 阶段二(超参消融 R1–R4) | EVAL 成功率 | 训练奖励 | 训练奖励噪声大(与泛化能力相关性 0.3–0.5),仅用于粗筛;EVAL 用于精筛超参与选 checkpoint |
|
| 140 |
+
| 阶段三(算法横评) | EVAL 峰值 + Holdout + Gap | — | EVAL 峰值反映"训练中见过的最佳泛化",Holdout 反映"训练完全没见过的泛化",Gap 反映稳定性 |
|
| 141 |
+
| **全程约束** | — | — | **Holdout 不允许中途观察**,仅最终一次性报告,防止间接过拟合 |
|
| 142 |
+
|
| 143 |
---
|
| 144 |
|
| 145 |
## 五、工程设计亮点
|
|
|
|
| 163 |
|------|---------|:-------------:|:---:|------------|
|
| 164 |
| R1 | 随机起终点初版 | 61.0% | 0.605 | 训练量不足、探索过早终止 |
|
| 165 |
| R2 | `ep↑` + `decay↓` | 64.0% | 0.633 | buffer 过小导致振荡 |
|
| 166 |
+
| R3 | `buffer×4` + `target×3` | 74.0% | 0.735 | checkpoint 时序偏差 10pp |
|
| 167 |
| R4 | EVAL checkpoint + BFS + visited_map | **78.0%** | **0.773** | — |
|
| 168 |
|
| 169 |

|
|
|
|
| 189 |
|
| 190 |
### 6.3 失败模式分析
|
| 191 |
|
| 192 |
+
EVAL 期逐局步数(R3 / R4 best_model,Holdout 100 局,ε=0 贪心):
|
| 193 |
+
|
| 194 |
+
| 分类 | R3 | R4 |
|
| 195 |
+
|------|---:|---:|
|
| 196 |
+
| 快速成功(≤30 步) | 75 | 78 |
|
| 197 |
+
| 失败·截断(步数=200) | 25 | 22 |
|
| 198 |
+
| 失败·近截断(150-199)/ 早夭(<150) | 0 / 0 | 0 / 0 |
|
| 199 |
+
| 成功率 | 75% | 78% |
|
| 200 |
+
| **失败局中步数=200 截断占比** | **25/25 = 100%** | **22/22 = 100%** |
|
| 201 |
+
| 失败局平均撞墙数 | 0.0 | 0.0 |
|
| 202 |
+
|
| 203 |
+
**R3 / R4 失败局 100% 是步数=200 截断且撞墙=0**——10×10 迷宫最优路径仅 15-25 步,200 步远超合理上限;撞墙=0 排除"撞墙堵死";**唯一合理解释是自由格间反复震荡**(Demo 中 A→B→A→B 模式肉眼可见)。0% 近截断、0% 早夭、成功-失败 0/1 离散分布(成功≤30 步,失败=200 步),无"路径规划差但仍在前进"或"撞墙堵死"的中间情形。
|
| 204 |
+
|
| 205 |
+
**R3 → R4 变化**:25 → 22 截断局(绝对 −3pp;n=100 下 σ ≈ 4pp,**不具统计显著性**),但**截断率 100% 这一结构特征未变**——4 通道减少循环地图数量,循环机制仍是 R4 EVAL 期失败主因(详见 §7 Web Demo 兜底机制说明)。
|
| 206 |
+
|
| 207 |
+
**训练期 vs EVAL 期**(验证 ε 探索对循环的边际贡献):
|
| 208 |
+
|
| 209 |
+
| 阶段 | 截断占比 |
|
| 210 |
+
|------|---------:|
|
| 211 |
+
| R3 训练期 580 局(ep 200+,含 5% ε 探索) | 15.5% |
|
| 212 |
+
| R3 EVAL 期 100 局(ε=0 贪心) | 25% |
|
| 213 |
+
| R4 训练期 480 局(ep 200+,三算法均值,含 5% ε) | 8-12% |
|
| 214 |
+
| R4 EVAL 期 100 局(ε=0 贪心) | 22% |
|
| 215 |
|
| 216 |
+
训练期截断率系统性低于 EVAL 期,与"推理时纯贪心放大循环失败"判断一致。R3 训练期 15.5% 是 R4 各算法(8-12%)的 1.3-1.9 倍——4 通道在训练期也已部分抑制循环(visited_map 使网络对"重访格子"敏感)。
|
|
|
|
|
|
|
|
|
|
|
|
|
| 217 |
|
| 218 |
+
R4 引入 4 通道的完整因果链(训练期 15.5% → EVAL 期 25% → 100% 截断且撞墙=0 → R4 引入 visited_map):见 [experiment_log.md §R3 总结与 R4 决策依据](experiment_log.md#r3-总结与-r4-决策依据) 第四节。
|
| 219 |
|
| 220 |
---
|
| 221 |
|
|
@@ -370,6 +370,8 @@ class MazeEnv(gym.Env):
|
|
| 370 |
self._agent_pos = (new_row, new_col)
|
| 371 |
reward = self.reward_step
|
| 372 |
# 距离 shaping:靠近目标为正,远离为负(仅有效移动步计入)
|
|
|
|
|
|
|
| 373 |
if self.distance_shaping_alpha != 0.0:
|
| 374 |
dist_after: int = abs(new_row - gr) + abs(new_col - gc)
|
| 375 |
reward += self.distance_shaping_alpha * (dist_before - dist_after)
|
|
|
|
| 370 |
self._agent_pos = (new_row, new_col)
|
| 371 |
reward = self.reward_step
|
| 372 |
# 距离 shaping:靠近目标为正,远离为负(仅有效移动步计入)
|
| 373 |
+
# 注:本项目 config 固定 distance_shaping_alpha=0.0,train.py 也未透传该字段,
|
| 374 |
+
# 故此 if 分支在当前训练/评估流程中永不执行,保留作为参数设计的可扩展点。
|
| 375 |
if self.distance_shaping_alpha != 0.0:
|
| 376 |
dist_after: int = abs(new_row - gr) + abs(new_col - gc)
|
| 377 |
reward += self.distance_shaping_alpha * (dist_before - dist_after)
|
|
@@ -24,7 +24,7 @@
|
|
| 24 |
* **CNN vs MLP**:观测为 (4, N, N) 结构化网格,CNN 具有平移等变性——"墙在左、目标在右"的
|
| 25 |
空间关系无论出现在地图何处,同一 filter 均可检测,参数效率优于 MLP。MLP 需要
|
| 26 |
将所有位置的空间关系独立学习,在随机起终点设定下泛化更差。
|
| 27 |
-
* **感受野分析**:三层 3×3 Conv(无 stride/pool)的理论感受野 =
|
| 28 |
对 10×10 迷宫,7×7 感受野无法覆盖全图(对角线距离约 14 格);但 Flatten 后接的
|
| 29 |
全连接层将所有位置特征全局混合,弥补了 CNN 局部感受野的不足。Flatten→FC 的
|
| 30 |
全局聚合使网络实际上能对全图状态建模,纯感受野计算低估了该架构的全局感知能力。
|
|
|
|
| 24 |
* **CNN vs MLP**:观测为 (4, N, N) 结构化网格,CNN 具有平移等变性——"墙在左、目标在右"的
|
| 25 |
空间关系无论出现在地图何处,同一 filter 均可检测,参数效率优于 MLP。MLP 需要
|
| 26 |
将所有位置的空间关系独立学习,在随机起终点设定下泛化更差。
|
| 27 |
+
* **感受野分析**:三层 3×3 Conv(无 stride/pool)的理论感受野由递推公式 $RF_l = RF_{l-1} + (k_l - 1) \cdot \prod_{i<l} s_i$ 计算($RF_0=1$, $k_l=3$, $s_i=1$),逐层累加得 $3 \to 5 \to 7$,即 7×7。
|
| 28 |
对 10×10 迷宫,7×7 感受野无法覆盖全图(对角线距离约 14 格);但 Flatten 后接的
|
| 29 |
全连接层将所有位置特征全局混合,弥补了 CNN 局部感受野的不足。Flatten→FC 的
|
| 30 |
全局聚合使网络实际上能对全图状态建模,纯感受野计算低估了该架构的全局感知能力。
|