interview / docs /experiment_log.md
Lee93whut
docs: drop R4-续 retrospective paragraph — it reintroduced the wrong shaping=0.5 value
8eeeb67

实验记录日志

记录每一轮完整训练的配置、结果与结论。
格式规范:每次训练对应一个 ## Round N 节,包含超参快照、结果数据、问题诊断与下一步行动。
原则:只记录事实,结论需有数据支撑,不写主观猜测。


总览

轮次 任务设定 核心变更 Holdout 成功率 SPL 峰值 主要发现
Round 0 固定起终点 基准(对照组) 90–95% 固定任务四算法均高度收敛,验证训练流程正确
Round 1 随机起终点 初版超参 61.0% 0.605 ep=2000 曲线未收敛;decay=0.995 探索提前触底
Round 2 随机起终点 ep=6000 + decay=0.9985 64.0% 0.633 74% P1/P2 修复,新发现 buffer 过小(P3)和 target 同步过频(P4)
Round 3 随机起终点 buffer=80k + target=1500 74.0% 0.735 84% 峰值突破 80%;Holdout 低于峰值 10pp,根因为保存策略
Round 4 随机起终点 EVAL-based checkpoint + BFS 连通性验证;探索 revisit_penalty(失败)和 visited_map 4通道 **78.0%**(A3,double 算法) 0.773 88% P7(checkpoint时序)+P8(无解任务)系统性修复;P9(马尔可夫违反)新发现;A3为三项变量叠加,非单因素对照
Round 4(续) 随机起终点 R4-A3 超参固定,四算法横向消融(唯一变量=算法) **84.0%**(dueling,最优) 0.817 **94%**(vanilla) dueling EVAL→Holdout gap=6pp 最优泛化;double_dueling 81%;vanilla 75%(19pp gap,仅在固定 50 张 EVAL 集上成立);Double DQN 危机恢复快但终态不及纯 dueling

关键结论链:随机起终点使状态空间扩大约 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)。

R1→R4 纵向超参演进(Double DQN,相同算法)

R1→R4 超参演进 EVAL 成功率对比


Round 0 — 固定起终点基准(对照组)

日期:2026-05-30
目的:建立基准性能,验证四种 DQN 变体在标准设定下的表现。
关键配置random_start_goal: false,其余见 config.yaml 默认值

超参快照

超参
num_episodes 2000
epsilon_decay 0.995
buffer_capacity 20000
target_update_freq 500
warmup_episodes 200
random_start_goal false
grid_size 10
obstacle_density 0.25

Holdout 结果(100 张独立地图,seed+200000)

排名 算法 成功率 POR 保存 Episode 训练 AvgReward
🥇 dueling 95.0% 0.995 1403 83.5
🥈 double 93.0% 0.999 1668 83.8
🥉 double_dueling 90.0% 0.999 1210 82.1
4️⃣ vanilla 90.0% 1.000 1850 81.4

注:本轮使用 POR(Path Optimality Ratio)指标,Round 1 起替换为标准 SPL。

结论

  • 固定起终点任务下,四种算法均能高度收敛(90%+)
  • dueling 结构在"大量无效动作"场景(撞墙后原地踏步)下泛化最好
  • double_dueling 收敛最快(ep=1210),vanilla 收敛最慢(ep=1850)
  • POR 均接近 1.0,说明成功路径质量几乎等同 BFS 最优解

Round 1 — 随机起终点,初版超参

日期:2026-05-31
目的:验证随机起终点设定下的性能基线,诊断当前超参的瓶颈。
主要变更random_start_goal: true;评估指标从 POR 替换为 SPL(Anderson et al. 2018)

超参快照

超参 备注
num_episodes 2000 ⚠️ 事后诊断:不足
epsilon_decay 0.995 ⚠️ 事后诊断:衰减过快
buffer_capacity 20000 ⚠️ 事后诊断:偏小
target_update_freq 500 ⚠️ 事后诊断:同步偏频
warmup_episodes 200 次要问题
random_start_goal true 本轮新增
grid_size 10 不变
obstacle_density 0.25 不变

Holdout 结果(100 张独立地图,seed+200000,SPL 指标)

排名 算法 成功率 SPL 保存 Episode 训练 AvgReward
🥇 double 61.0% 0.605 948 37.3
🥈 vanilla 56.0% 0.559 1921 49.8
🥉 dueling 45.0% 0.445 759 36.0
4️⃣ double_dueling 43.0% 0.425 1843 42.1

Blind Test 曲线关键数据(double 算法,Evaluation_Exam/Test_Success_Rate)

ep= 500:  30.0%  SPL=0.300
ep= 700:  44.0%  SPL=0.431
ep=1000:  ~50%   (估算)
ep=1400:  54.0%  SPL=0.529  ← 阶段峰值
ep=1500:  48.0%  SPL=0.470  (震荡)
ep=2000:  ~48%   (无收敛平台)

问题诊断

P1 — 曲线未收敛(高优先级)
ep=2000 时 Blind Test 成功率仍在上升,无收敛平台期。
直接证据:Evaluation_Exam/Test_Success_Rate 曲线末端斜率仍为正。
根因:num_episodes=2000 对于随机起终点任务的状态空间严重不足。

P2 — 探索过早终止(高优先级)
epsilon_decay=0.995 导致 ep≈800 时 ε 已触底(0.05),
后续约 1200 个 episode 全程以最低探索率运行,buffer 样本多样性枯竭。
Backend_Net/Loss ep=800 后趋于平稳但成功率仍在缓慢上升,
说明网络仍在学习但受限于样本质量。

P3 — buffer 容量偏小(中优先级)
20000 容量约对应 250 局,warmup 结束后早期成功样本很快被覆盖。
成功率仅 50–60% 意味着失败样本占多数,成功样本(高价值稀疏奖励)存留时间极短。
依据:Lin (1992) 指出 ER 核心价值之一是保留历史稀有样本;Mnih et al. (2015) 原版使用 1M transitions buffer,本项目仅约其 1/50。
预测:buffer=20000(约 250 局轮换)将产生约 400–500 ep 周期的性能振荡,可在 Round 2 长曲线中验证。

P4 — target net 同步过频(中优先级)
136000 梯度步 / 500 = 272 次同步。
随机起终点导致 Q 值估计方差更高,频繁同步加剧 bootstrapping instability。
依据:Mnih et al. (2015) 原版更新周期 10000 步,DQN loss $\mathcal{L}(\theta) = \mathbb{E}[(r + \gamma \max_{a'} Q_{\theta^-}(s',a') - Q_\theta(s,a))^2]$ 中 $\theta^-$ 须提供固定回归目标,同步过频等价于用移动靶做监督学习。

TensorBoard 曲线截图(与 P1–P4 诊断一一对应)

截图 论证的诊断点 解读
Test Success Rate P1+P3 末端斜率为正(P1);无平台期,预测 R2 振荡周期约 400-500 ep(P3 预测)
Epsilon P2 ε 在 ep≈800 触底 0.05,P2 探索过早终止的直接证据
Loss P4 Loss 高频震荡,target 同步过频的间接证据

P3 在 R1 中为预测,验证在 R2 截图(见下)。

结论与下一步行动

已确认问题(按优先级):

  1. P1+P2(高优先级):训练量不足 + 探索过早终止是最直接的瓶颈
  2. P3(中优先级):buffer=20000 约 250 局轮换,预测 R2 将出现 400–500 ep 周期振荡
  3. P4(中优先级):target 同步 272 次/轮,高 Q 方差场景下移动靶效应显著

下一步行动:R1 当时能直接决定的修复只有 P1+P2(成对修改num_episodesepsilon_decay)。P3+P4 需在 R2 长曲线上验证后才能量化修复(buffer 扩到多少、target_update_freq 调到多少);R4 的修复方向(EVAL checkpoint、BFS、visited_map)均需 R2/R3 实跑后才有依据,不在 R1 阶段可推断范围。


Round 2 — 双变量调整:训练量 + 探索衰减

日期:2026-05-31
目的:验证 num_episodes=6000 + epsilon_decay=0.9985 是否消除 P1/P2 问题(同时修改两个超参,其余不变)
变更项

超参 Round 1 Round 2 变更原因
num_episodes 2000 6000 R1 曲线末端斜率仍为正,无平台期,训练量不足
epsilon_decay 0.995 0.9985 R1 ep≈800 探索触底,后 1200 ep 样本多样性枯竭
其余 不变 不变 P1/P2 已在 R1 诊断中明确,组合修改以加速验证

超参快照

超参
num_episodes 6000
epsilon_decay 0.9985
buffer_capacity 20000
target_update_freq 500
warmup_episodes 200
random_start_goal true
algorithm double

Holdout 结果(100 张独立地图,seed+200000)

指标
成功率 64.0%
SPL 0.633
训练中盲测峰值 74.0%(ep=3300, ep=4250)
训练中盲测最低 52.0%(ep=5300, ep=5900)
总 Episode 6000
总梯度步 325542

验收标准评估

  • Evaluation_Exam/Test_Success_Rate 出现 >70% 评估点(ep=3300 & ep=4250 均达 74%)
  • 相比 Round 1 提升 > 10%(盲测峰值 74% vs 54%,+20pp;注:Holdout 仅 +3pp,64% vs 61%,未达 10%,本条以盲测峰值口径通过)
  • Evaluation_Exam/Test_Success_Rate 出现收敛平台(未满足,见问题诊断)

问题诊断

P1 / P2 验收(已解决)

P1 — 训练量不足:已消除

R1 末端 Test_Success_Rate 斜率仍为正,无平台期;R2 将 num_episodes 从 2000 扩至 6000, 曲线在 ep=3300 首次出现局部峰值 74%,并在 ep=4250 再现,说明模型已获得充分学习时间。
依据:Mnih et al. (2015) 指出"当训练曲线仍在上升时,提前停止只是截断了学习曲线,不是真实性能上限"。

P2 — 探索过早终止:已消除

R1 中 epsilon_decay=0.995 导致 ep≈800 触底($0.995^{596} \approx 0.05$),后 1200 ep 以最低探索率运行,Avg_Reward_Window 在 ep=400–600 出现明显回落。
R2 调整为 epsilon_decay=0.9985,ep≈2189 才触底($0.9985^{1989} \approx 0.05$), 覆盖约 35% 的有效训练期(ep=200–6000),符合 van Hasselt et al. (2016) 建议的 10%–25% 探索期比例。
验证方法:截图②(Global_Epsilon 对比)可见 R1 触底点 ep≈800,R2 触底点 ep≈2189,差距约 1400 ep;
截图①(Test_Success_Rate 对比)中 R2 触底后成功率仍继续上升,而非停滞,说明延长探索期确实带来了样本多样性改善。


P3 — buffer 容量不足(当前主瓶颈,新发现)

数据现状

Round 2 全程 Blind Test 成功率呈持续振荡,无收敛平台

ep=2100: 66%(ε 触底后首次高峰)
ep=3300: 74%(历史峰值 #1)
ep=3950: 54%(振荡低谷)
ep=4250: 74%(历史峰值 #2)
ep=5300: 52%(最深低谷)
ep=5900: 52%(末段低谷)

振荡周期约 400–500 ep,振幅 ±10%。
以平均每局 ~80 步估算,buffer=20000 约可存 250 局数据; 每隔约 250 局 buffer 完成一次满轮换,早期积累的成功样本被完全覆盖 → 性能骤降; 之后新的成功样本逐渐回填 → 性能回升;如此往复形成规律振荡。 周期 250–400 局与实测振荡周期 400–500 ep 定量吻合,是 P3 为主因的直接定量证据。

论文依据

Lin (1992) 最早指出 Experience Replay 的核心价值之一是保留历史稀有样本,防止网络在稀疏奖励场景中反复学习低价值轨迹。
Mnih et al. (2015) 原版 DQN 使用 1M transitions buffer;本项目 20000 约为其 1/50,在成功率仅 50–70% 的阶段(失败局约 200 步),失败样本占 buffer 绝对多数,稀疏的成功样本(+100 奖励)极易被覆盖。
Schaul et al. (2016) Prioritized Experience Replay 进一步量化了成功样本留存时间短对 Q 值估计的系统性影响:buffer 过小会导致高 TD-error 的稀疏奖励 transition 被反复覆盖,产生持续低估。

Holdout 64% 低于盲测峰值 74% 的原因

模型保存触发于近 50 局滚动奖励最高点,而非盲测峰值点; 振荡导致两者时间错位,保存时刻处于振荡波峰和盲测高点之间的灰色地带。 buffer 修复后振荡消除,两者差距预计显著缩小。


P4 — target network 同步过频(次要,与 P3 共同作用)

数据现状

Round 2 共完成约 325542 梯度步,target_update_freq=500 意味着同步约 651 次
随机起终点任务中不同起终点的最优路径长度差异悬殊,Q 值估计方差高; Backend_Net/Loss 曲线全程高频震荡(峰值可达 2.5+),是 Q 目标持续移动的间接证据。

论文依据

Mnih et al. (2015) 原版 target net 更新周期为 10000 步,理论基础为 fixed Q-target:

L(θ)=E ⁣[(r+γmaxaQθ(s,a)Qθ(s,a))2]\mathcal{L}(\theta) = \mathbb{E}\!\left[\left(r + \gamma \max_{a'} Q_{\theta^-}(s',a') - Q_\theta(s,a)\right)^2\right]

$\theta^-$ 作用是提供暂时固定的回归目标,若更新太频繁,等价于用"移动靶"做监督学习, 收敛性无法保证。本项目 500 步同步约为原版的 1/20,在高 Q 方差场景下加剧了 bootstrapping instability。



TensorBoard 曲线截图(与 P1–P4 诊断一一对应)

截图 论证的诊断点 解读
R1 vs R2 Eval Success P1 验收 R2 末端出现局部峰值 74%(ep=3300/4250),训练量不足已解决
R1 vs R2 Epsilon P2 验收 R2 ε 触底点 ep≈2189,R1 触底点 ep≈800,差距 1400 ep
R2 Eval Success P3(主瓶颈) R2 长曲线全程振荡 52-74%,振幅 ±10%,与 P3 预测的 400-500ep 周期吻合

P4(target 同步)的截图在 R3 给出(r3_backend_avg_q.png 显示 Q 值稳定性提升)。

下一步行动

R2 确认了 P1+P2 修复有效,但发现新瓶颈 P3(buffer)和 P4(target)。
Round 3 同时修复 P3+P4(两个变量叠加,未做单变量消融),预期振荡幅度从 ±10% 降至 ±4% 以内,峰值超过 80%。

依据上述 P3/P4 诊断,Round 3 同时修复两个问题:

1. buffer_capacity: 80000(修复 P3)

将 buffer 从 20000 扩至 80000,覆盖约 1000 局。 按 Lin (1992) 的稀疏样本保留原则,成功样本在 buffer 中的留存时间延长 4 倍, 振荡周期应从 400–500 ep 延长至 1600–2000 ep(或直接消除,取决于成功率提升后的样本比例变化)。

2. target_update_freq: 1500(修复 P4)

将同步频率从每 500 步降至每 1500 步,每轮 325542 梯度步对应约 217 次同步(R2 的 1/3)。 依据 Mnih et al. (2015) 的 fixed Q-target 理论,更稀疏的同步使 TD 目标在更长窗口内保持稳定, 预期 Backend_Net/Loss 高频震荡峰值减少,Q 值估计方差降低。


Round 3 — buffer 扩容 + target 稳定

日期:2026-05-31
目的:同时修复 P3(buffer)、P4(target sync),验证成功率能否突破 80%
变更项

超参 Round 2 Round 3 变更原因
buffer_capacity 20000 80000 约 250 局轮换→约 1000 局,消除振荡
target_update_freq 500 1500 随机起终点 Q 方差大,减少目标漂移
其余 不变 不变

超参快照

超参
num_episodes 6000
epsilon_decay 0.9985
buffer_capacity 80000
target_update_freq 1500
warmup_episodes 200
random_start_goal true
algorithm double

Holdout 结果(100 张独立地图,seed+200000)

指标 R3 值 R2 值 提升
成功率 74.0% 64.0% +10pp
SPL 0.735 0.633 +0.102
训练中盲测峰值 **84.0%**(ep=3750) 74.0%(ep=3300/4250) +10pp
训练中盲测最低 **56.0%**(ep=2450) 52.0%(ep=5300/5900) +4pp
振荡幅度 ±14pp(56–84%) ±11pp(52–74%) 峰值更高但振幅仍大
总 Episode 6000 6000
总梯度步 272,100 325,542

验收标准评估

  • Blind Test 出现 >80% 评估点(ep=3500: 80%,ep=3750: 84%)
  • Holdout 成功率 >70%(74% > 70%,+10pp vs R2)
  • 振荡幅度从 ±10% 降至 ±4% 以内(未满足,实测振幅 ±14pp)
  • Holdout 成功率 >78%(未满足,实测 74%)

Blind Test 曲线关键数据(double 算法)

ep= 400– 650: 8–18%    ← 早期 Q 值高估导致 EVAL 骤降(根因待定,Double DQN 自修正后恢复)
ep= 800:      42%      ← Double DQN 自修正后恢复
ep=1000–2100: 44–70%   ← ε 触底前的上升段(R3 起步比 R2 高约 6pp)
ep=2200–2250: 70%      ← ε 触底(ep≈2189)后首个高峰
ep=3350–3400: 78%      ← 第一个大峰值区
ep=3500:      80%      ← 历史峰值 #1
ep=3750:      84%      ← 历史峰值 #2(最高点)
ep=4200–4300: 78%      ← 第二个峰值区
ep=4500–5150: 60–68%   ← 振荡低谷段
ep=5300–5500: 72–76%   ← 第三个峰值区
ep=5800–6000: 62–76%   ← 末段振荡

问题诊断

P3 — buffer 容量修复效果验证(部分有效)

预期:buffer 从 20000(约 250 局)扩至 80000(约 1000 局),振荡周期应从 400–500 ep 延长至 1600–2000 ep。

实测

  • 振荡周期约 700–900 ep(比 R2 的 400–500 ep 延长约 1.5–2 倍)
  • 低谷底部从 R2 的 52% 提升至 56%(+4pp)
  • 峰值从 R2 的 74% 提升至 84%(+10pp)

结论:buffer 扩容方向正确,效果部分符合预期,但振荡未被消除,仅被缓解。
原因:即使 buffer=80000(约 1000 局),在成功率 60–80% 的阶段,仍约有 20–40% 的失败局(200步)持续填入 buffer;成功样本的相对比例虽有改善,但绝对数量仍不足以彻底稳定策略。
依据 Schaul et al. (2016):根治方案需使用 Prioritized Experience Replay(PER),让高 TD-error 的成功样本被优先重复采样,而非依赖更大 buffer。

P3 与 P6 关系:P3 是"扩容缓解"(短效工程修复),P6 是"采样策略根因"(长效方案)。两者不矛盾,对应不同层面。

P4 — target network 修复效果验证(有效)

预期target_update_freq 从 500 提升至 1500,TD 目标稳定性提升,Loss 峰值减少。

实测

  • R3 AvgQ 在 ep=1000 后稳定在 35–60,比 R2 的 35–70 波动范围收窄
  • R3 Loss 全程震荡峰值比 R2 略低(难以从日志量化,需 TensorBoard 截图确认)
  • R3 峰值出现在更高的成功率区间,说明 Q 估计稳定性改善对策略质量有正贡献

结论:target 更新频率降低有效减少了 Q 值的随机漂移,是峰值从 74% → 84% 的贡献因素之一。

P5 — 早期 Q 值高估危机(现象记录,根因待定)

现象:ep=400–650 出现 EVAL 骤降至 8–18%(AvgQ 飙升至峰值 78,R2 同期约 40–50)。

自修正过程:Double DQN 的解耦估计机制(van Hasselt et al. 2016)在约 400 ep 内完成自修正, ep=800 成功率恢复至 42%,ep=1000 回到 44%,ep=1050 跳升至 62%,之后完全恢复。 全程无需人工干预。

根因待定:crisis 与 buffer×4 + target×3 改动时间窗重合,但二者与 Q 高估之间的具体因果链未做消融验证。可能解释:更大 buffer 延长了旧策略样本的滞留时间,更稀疏的 target 同步放大了 TD 目标漂移,二者叠加在早期训练阶段放大 Q 值估计方差。需补做单变量消融方能严格归因。

P6(新)— 振荡根因未彻底解决:周期性遗忘

即使 buffer=80000,振荡仍持续存在(幅度 ±14pp),根本原因不在于 buffer 大小,而在于均匀随机采样策略本身:

  • 成功样本与失败样本被等概率采样,失败局(200步)数量更多,占 buffer 主体
  • 当模型进入"好状态"时,产生更多成功样本填入 buffer;但此时失败样本仍大量存在,下次采样时反复学习失败轨迹导致性能回退
  • 振荡周期≈ buffer 完成一次成功样本更新所需时间,buffer 越大振荡周期越长,但幅度不减

理论根源:Lin (1992) 指出 ER 的核心价值之一是保留稀有样本,但均匀采样无法主动偏向高价值样本。
解决方案:Prioritized Experience Replay(Schaul et al. 2016)——赋予高 TD-error 样本更高采样概率,使成功样本被更频繁地学习,振荡可从根本上消除。

TensorBoard 曲线截图(与 P3–P6 诊断一一对应)

截图 论证的诊断点 解读
R2 vs R3 Eval Success P3 验证 振荡周期从 R2 的 400-500 ep 延长至 R3 的 700-900 ep(约 1.5-2 倍),低谷从 52% 抬至 56%,符合 buffer×4 预测
R3 Eval Success P3 验证 + P6 R3 振荡周期延长但幅度未减(±14pp),指向 P6(均匀采样本身是周期性遗忘的根因)
R3 AvgQ P4 验证 R3 AvgQ 后期稳定在 35-60 区间,波动范围比 R2(35-70)收窄,target 更新频率降低有效

P5(早期 Q 值高估危机)以 r3_eval_success_rate.png 中 ep=400-650 骤降区域作为佐证,无独立截图。SPL 曲线(r3_eval_spl.png)未引用进诊断,已删除。

R3 总结与 R4 决策依据

一、R3 核心结论

buffer+target 组合将盲测峰值从 74% 提升至 **84%**,Holdout 从 64% 提升至 **74%**(+10pp)。
两项修复方向全部正确,但 Holdout 低于峰值 10pp 的问题仍未解决,需要专项诊断。


二、Holdout 低于峰值 10pp 的数据诊断

对 R3 全程 EVAL 数据(ep=800–6000,避开早期 Q 高估 crisis 期)做分段统计:

阶段 均值 峰值 低谷
ep=800–2000 58.5% 68% 40%
ep=2000–3000 63.8% 70% 56%
ep=3000–4000 72.9% 84% 62%
ep=4000–5000 70.5% 78% 64%
ep=5000–6000 69.9% 76% 60%

关键发现 1:均值在 ep=3000 后不再增长(72.9% → 70.5% → 69.9%)
说明当前配置的策略能力上限已达到饱和,不是"还没学够"的问题。继续加 ep 只会重复相同的振荡区间,均值不会系统性提升。

关键发现 2:ep=4000 后,≥74% 的评估点仅占 27%(41 次里 11 次)
模型保存触发于"近 50 局训练滚动奖励最高",与 EVAL 峰值的时序本来就不对齐——训练奖励反映的是当前遇到的地图难度组合,而不是泛化能力。两个信号错位导致保存时刻大概率不处于 EVAL 峰值,Holdout 因此系统性偏低 10pp。

结论:Holdout 偏低的根因是保存策略,不是模型能力。


三、为什么改模型保存策略是最高性价比的选择

训练奖励 ≠ 泛化能力,两者在随机起终点任务中相关性弱:遇到一批"容易的随机地图"时训练奖励高,但 EVAL 未必同步处于峰值(R3 实测差距 10pp)。

主流标准做法(Evaluation-based Checkpoint Selection):每次 EVAL 后,若成功率创新高则保存 checkpoint(即 RL 版的 save_best_only=True,Stable-Baselines3、CleanRL 的默认逻辑)。Holdout 因此直接对应训练过程中出现过的最佳泛化能力。

用 EVAL 集做 checkpoint 选择会引入隐式过拟合,偏差约 2–4pp;但本项目已满足三集分离:训练 buffer(学习)、EVAL 集(训练开始前由 seed+100000 派生固定生成,整个训练期间恒定,checkpoint 选择)、Holdout 集(seed+200000 固定 100 张,仅最终报告使用,不参与任何决策)。2–4pp 偏差远小于当前 10pp 时序错位损失,净收益为正

注意:若用 Holdout 挑最优 checkpoint,Holdout 失去无偏评估资格,报告数字会严重高估真实泛化能力。


四、R3 失败模式直接测量(提供 R4 引入 4 通道的数据依据)

R3 训练完成后,将 best_model 在 Web Demo 中实测推理(ε=0 纯贪心),观察到 agent 在部分地图中陷入两格间无限震荡——A→B→A→B 循环 200 步触底截断。逐局步数测量如下:

分类 R3 局数
快速成功(≤30 步) 75
失败·截断(步数=200) 25
其他(中间步数失败/慢成功) 0
成功率 75%
失败局中截断占比 25/25 = 100%
失败局平均撞墙数 0.0

Holdout 100 局(seed+200042..+200141),R3 best_model(double 算法)。

数据解读

  • 100% 截断 + 撞墙=0:撞墙=0 排除"撞墙堵死"(撞墙会留下 hit_wall 计数),唯一合理解释是 agent 在自由格间反复震荡;10×10 迷宫最优路径仅 15-25 步,200 步远超合理上限。
  • 失败-成功 0/1 离散:成功局集中在 ≤30 步,失败局集中在 200 步,无中间过渡;0% 近截断、0% 早夭,无"接近但错过"或"路径规划差但仍在前进"的中间情形。
  • 直接指向训练侧缺陷:状态层缺少访问历史 → 推理时 Q 函数无法区分两格循环与两格前进 → 修复方向 = 把访问历史编码进状态(visited_map 第 4 通道),而非在奖励层加惩罚(会破坏马尔可夫性,详见 P9)。

R3 训练期 → EVAL 期的因果链:训练期截断率 15.5%(含 5% ε 探索,部分跳出循环)→ EVAL 期截断率 25%(ε=0,循环被锁定)→ 100% 截断且撞墙=0 → 循环机制是 R3 失败主因 → R4 必须显式编码访问历史。


五、R4 行动计划

核心变更(必做):将模型保存触发条件改为 EVAL 成功率创新高

# 当前逻辑(训练奖励触发)→ 改为:
if eval_success_rate > best_eval_success_rate:
    best_eval_success_rate = eval_success_rate
    save_model()

R4 行动计划(R3 收尾时的最初规划,按"问题驱动"组织):

变更项 内容 对应 R3 遗留问题
EVAL-based checkpoint 每次评估若成功率创新高则保存 修复 P7(10pp 时序错位)
BFS 连通性验证 reset() 内嵌 BFS,无解迷宫重采样 修复 P8(训练信号被无解任务污染)
visited_map 第 4 通道 状态层编码访问历史 修复循环失败(P5 根因候选,需消融验证)
备注:revisit_penalty 计划作为循环抑制的另一候选方案,与 visited_map 并行消融 不确定状态层 vs 奖励层哪个有效

预期:R3 中 double 算法 EVAL 峰值达 84%,改保存策略后 Holdout 预期接近 80–84%(消除 10pp 保存时机损失,剩余 2–4pp 为评估集过拟合的正常偏差)。


Round 4 — 系统性问题修复:Checkpoint 策略 + 训练信号质量

日期:2026-05-31
目的:解决 R3 遗留的两个系统性问题:① Holdout 低于 EVAL 峰值 10pp(checkpoint 保存策略错误);② 训练/评估中存在无解任务污染信号(连通性验证缺失)。同时探索推理时策略循环的抑制方案。
Git 变更集fbc2dc6(EVAL checkpoint)、413b4eb(BFS 连通性)
Rollback 点fa1b63d(R3 配置基线)


背景:R3 遗留问题全貌

P7 — Checkpoint 保存时机错误(核心问题)

R3 模型保存逻辑:每当近 50 局训练滚动奖励创新高时触发保存。

问题根源:训练奖励受当局随机地图难度影响,与泛化能力相关性弱。R3 全程 EVAL 数据(eval_every=50,ep=800–6000 共 105 个数据点)显示:

ep=3000–4000:EVAL 均值 72.9%,峰值 84%(ep=3750)
ep=4000–5000:EVAL 均值 70.5%
ep=5000–6000:EVAL 均值 69.9%

EVAL 峰值出现在 ep=3750,但模型保存触发于训练奖励峰值,两者时序不对齐。ep=3750 对应的权重从未被写入磁盘,Holdout 因此系统性偏低。

定量证据:R3 实测 Holdout=74%,EVAL 峰值=84%,差距 10pp。若 checkpoint 对应 EVAL 峰值,理论 Holdout 上限为 84% - 2–4pp(EVAL 集隐式过拟合)≈ **80–82%**。

标准做法(Evaluation-based Checkpoint Selection)
Stable-Baselines3、CleanRL 均默认 save_best_only=True——每次评估若成功率创新高则保存。三集分离原则保证此做法不引入严重过拟合:

  • 训练 buffer:学习用
  • EVAL 集(训练开始前固定生成的 50 张,seed+100000 派生,整轮训练恒定):checkpoint 选择用
  • Holdout 集(固定 seed+200000 的 100 张):仅最终报告,不参与任何决策

EVAL 集与 Holdout 集独立,用 EVAL 集挑 checkpoint 引入的偏差约 2–4pp,远小于当前 10pp 时序错位损失,净收益为正


P8 — 随机起终点缺乏连通性验证(信号污染)

代码现状(修复前):train.py 在训练循环和 EVAL 循环的随机起终点逻辑中,从自由格中随机选取两点后直接注入 env.reset(),不做连通性检验——原代码注释甚至误称"env 内 BFS 保证连通"。

影响量化:obstacle_density=0.25 的 10×10 地图,约 5–10% 的随机起终点对不可达。

  • 训练侧:无解局在 max_steps=200 内必然 truncated,贡献 200 步全负奖励进入 buffer。无解局步数是正常局 2.5 倍,在 buffer 中样本权重被放大
  • 评估侧:Holdout 不连通任务必然失败,成功率被系统性低估约 0.25–1pp

修复方案(commit 413b4eb:选完起终点后 BFS 验证,不通则重新采样:

while not _bfs_reachable(wall_map, start_pos, goal_pos):
    idxs = rng.choice(len(inner), size=2, replace=False)
    start_pos, goal_pos = inner[idxs[0]], inner[idxs[1]]

训练循环和 EVAL 循环均同步修复,同时删除错误注释。


推理时策略循环问题(新发现)

发现路径与量化佐证:R3 best_model 在 Web Demo 实测推理(ε=0 纯贪心)陷入两格震荡(A→B→A→B 循环 200 步触底截断)。逐局步数详见上文"四、R3 失败模式直接测量"——100% 失败局为步数=200 截断且撞墙=0.0,确证循环是 R3 EVAL 期失败主因。

根因:训练期 ε>0 探索在多数情况下帮助跳出局部循环,但部分地图起终点组合使 ε 探索也不足以在 200 步内到达终点——这些训练局贡献"循环 200 步的负奖励轨迹",网络学到"某些区域走出去成本极高"但不知道主动规避重复访问。visited_map 第 4 通道把"是否访问过"显式编码到状态中,使网络可直接学习"重访成本"——从症状侧抑制循环(不是消除机制)。

此问题是 R4 的第三个攻坚方向,见后续尝试记录(R4-A1 revisit_penalty 失败 + R4-A2 visited_map 成功)。


R4 完整尝试记录

R4 共进行四次独立尝试(对照组 R4-A3 已完成),每次对比 R3 数据。

注意:R3 使用 eval_every=50,R4 系列使用 eval_every=100,下方对比统一取 100 ep 间隔数据点。

R3 每 100 ep 的 EVAL 成功率概要(取相邻 50ep 点均值,ep=300 起):

阶段 ep 区间 成功率 备注
Q 值高估危机 400–700 8–29% 最低 8%(ep=400)
自修正完成 800–2000 41–72% 逐步爬升
高位平台 2000–3700 64–76% 振荡区间
历史峰值 3750 84% R3 全程最高点
末段 3800–5000 64–76% 缓慢回落

R4-A1 — revisit_penalty=-1.0(奖励层循环抑制,ep=1000 终止)

日期:2026-05-31
日志logs/r4_double.log
核心假设:在奖励层施加递进惩罚 reward -= visit_count[s] × 1.0,迫使 agent 主动规避重复路径。同步实施 EVAL-based checkpoint(P7 修复)。

EVAL 数据

ep EVAL SPL R3 同期 差距
300 32% 0.308 55% -23pp
400 52% 0.516 8% +44pp ← R3 也在危机期
500 40% 0.400 19% +21pp
600 6% 0.060 16% -10pp
700 14% 0.140 29% -15pp
800 26% 0.254 41% -15pp
900 28% 0.263 42% -14pp
1000 38% 0.354 53% -15pp

终止判据:ep=1000 时成功率 38%,持续低于 R3 同期 15pp 以上,无收敛趋势。

失败根因:马尔可夫性违反(P9)

Q-learning 的贝尔曼方程要求奖励函数 $r(s, a, s')$ 仅依赖当前转移:

Q(s,a)=E[r(s,a,s)+γmaxaQ(s,a)]Q(s,a) = \mathbb{E}\left[r(s,a,s') + \gamma \max_{a'} Q(s',a')\right]

revisit_penalty 使奖励依赖隐变量(本 episode 内的访问历史),即 $r(s,a,s') = r_{\mathrm{base}} + f(\mathrm{visit_count}[s'])$,其中 $f$ 在每个 episode 内单调递增。相同的 $(s,a)$ 在不同时刻返回不同奖励,Q 函数在数学上无法收敛到唯一固定点。

更严重的是训练/推理分布不一致:训练时 $r(s,a)$ 含访问历史惩罚,推理时 $r(s,a)$ = 基础奖励。网络拟合的是"含历史信息的"奖励函数,但推理时该信息不存在,Q 值系统性失准。这不是 Q 值高估问题(Double DQN 可修正),而是目标函数本身在测试分布下无意义。

与早期 Q 值高估 crisis 的本质区别:crisis 是暂时性估计偏差(奖励函数形式在训练/推理时一致,Double DQN 可自修正);P9 是奖励函数结构在训练/推理时不一致(训练时含访问历史惩罚,推理时无),不可修正。

结论结构性失败,不可修补。 奖励层的循环抑制方案在任何需要"有状态奖励"的场景下都会违反马尔可夫性。


R4-A2 — visited_map 第4通道(状态层循环抑制,ep=5000 完成)

日期:2026-05-31
日志logs/r4_double_v2.log
核心洞察:A1 的问题在于把历史信息放在奖励里(不可观测隐变量),正确做法是把历史信息放进状态(显式编码)。编码后 Q(s,a) 可以合法学习"当前格已访问过,再来价值低"的策略。

代码变更

文件 变更
maze_env/env.py 观测空间 (3,N,N)→(4,N,N);新增 _visited_map 字段,reset() 清零,step() 标记;_build_observation() 输出 ch3=visited
src/model.py input_channels 默认值 3→4
config.yaml revisit_penalty: 0.0(标注已弃用)
app.py 移除启发式循环检测,依赖 visited_map 通道

checkpoint 保存:此次仍为训练滚动奖励触发(EVAL 修复尚未合入)。

EVAL 数据概要(ep=300–5000,每 100 ep)

阶段 ep 区间 成功率 备注
Q 值高估危机 400–700 8–32% AvgQ 峰值 57+
自修正完成 800–1500 42–68% Double DQN 在 ~400 ep 内自修正
中期平台 1500–3000 60–78% 收敛稳定
末段振荡 3000–5000 66–80% 峰值 80%(ep=4600)

Holdout 结果

指标 R4-A2 R3 变化
Holdout 成功率 75% 74% +1pp
Holdout SPL 0.735 0.735 持平
EVAL 峰值 80%(ep=4600) 84%(ep=3750) -4pp

诚实评估:+1pp Holdout 提升在 n=100 的测试集下不具统计显著性(置信区间约 ±5pp),EVAL 峰值还倒退了 4pp。单看 Holdout 数字,R4-A2 相比 R3 实质上没有提升

Q 值高估危机(ep=400–700)复现

与 R3 早期 crisis 现象一致:新增第4通道改变了网络输入分布,早期 buffer 中 Q 目标值系统性偏高,AvgQ 飙升(峰值 57+)。Double DQN 在约 400 ep 内完成自修正:

Q^Double(s,a)=r+γQθ(s,argmaxaQθ(s,a))\hat{Q}_{\text{Double}}(s,a) = r + \gamma Q_{\theta^-}(s', \arg\max_{a'} Q_\theta(s',a'))

解耦动作选择($Q_\theta$)与价值估计($Q_{\theta^-}$),有效抑制高估偏差,ep=800 后 EVAL 成功率恢复。

分段均值对比(R4-A2 vs R3)

阶段 R3 均值 R4-A2 均值 差距
ep=300–700(危机期) 23% 28% +5pp(R3也在危机期)
ep=800–1500 54% 60% +6pp
ep=1600–2500 66% 70% +4pp
ep=2600–3500 74% 74% 持平
ep=3600–4600 73% 73% 持平
ep=4700–5000 66% 69% +3pp

ep=800 自修正后,R4-A2 在早中期(800–2500)持续领先 4–6pp,但后期(2600–4600)两者持平。早期收敛优势真实存在,但最终 Holdout 数字没有体现,根因是 checkpoint 策略问题(见 P7)。

关键发现:checkpoint 保存了训练滚动奖励峰值时期(ep≈4570, EVAL=70%)的权重,EVAL 峰值 80%(ep=4600)对应权重从未被保存,导致 Holdout 与 EVAL 峰值差 5pp(75% vs 80%)。


R4-A3 — R3 超参 + EVAL checkpoint + BFS 连通性验证 + visited_map(已完成)

日期:2026-05-31(训练完成日 2026-05-31,文档整理日 2026-06-01)
日志logs/r4_ctrl_eval_ckpt.log(ep=5000 训练已完成,Holdout 78% 已报告)
设计意图:在 R3 超参基础上,同步引入三项修复:P7(EVAL checkpoint)、P8(BFS 连通性)、以及 R4-A2 引入的 visited_map 第4通道。三项变量同时存在,无法单独分离各项贡献,本组的结论是"三项叠加的综合效果"。

与 R3 的精确差异

项目 R3 R4-A3
checkpoint 触发 训练滚动奖励最高 EVAL 成功率创新高
随机起终点连通性 无验证(~5-10% 无解) BFS 验证,保证可达
观测通道数 3通道(wall / agent / goal) 4通道(+visited_map,同 R4-A2)
超参 buffer=80k, target=1500, ep=5000 全部相同

checkpoint 保存逻辑(commit fbc2dc6

best_eval_success = float("-inf")

# 每次 EVAL 后:
if not in_warmup and test_success_rate > best_eval_success:
    best_eval_success = test_success_rate
    torch.save({"state_dict": policy_net.state_dict(), ...}, best_model_path)
    logger.info(f"  [EVAL SAVE] EVAL 新高 {best_eval_success:.1f}%")
# 训练奖励保存块保留 ✓ 标记,不再写入权重

BFS 连通性修复(commit 413b4eb

# 选完随机起终点后验证连通性,不通则重新采样
while not _bfs_reachable(wall_map, start_pos, goal_pos):
    idxs = rng.choice(len(inner), size=2, replace=False)
    start_pos, goal_pos = inner[idxs[0]], inner[idxs[1]]

训练循环和 EVAL 循环均同步修复。

EVAL 数据概要(每 100 ep)

阶段 ep 区间 成功率 备注
Q 值高估危机 400–800 10–34% EVAL SAVE 首次保存 ep=900(58%)
早中期爬升 900–2000 48–80% 5 次 EVAL SAVE 触发
末段高位 2000–5000 68–88% 峰值 88%(ep=3300/3700)

Holdout 结果

指标 R4-A3 R3 提升
成功率 78.0% 74.0% +4pp
SPL 0.773 0.735 +0.038
EVAL 峰值 88%(ep=3300) 84%(ep=3750) +4pp
EVAL→Holdout 差 10pp 10pp 持平

问题诊断

P7 — Checkpoint 时序偏差(已修复,commit fbc2dc6

量化:R3 全程 EVAL 数据(ep=800–6000,105 个数据点)显示:

均值 68.1%,峰值 84%(ep=3750),标准差约 7pp。训练奖励峰值与 EVAL 峰值的时序错位导致 10pp 损失。

理论依据(Evaluation-based Checkpoint)

Hausknecht & Stone (2015) 在 DQN 研究中指出"periodic evaluation and model selection based on evaluation performance"是标准做法。Schulman et al. (2017) PPO 论文的实验均以 eval 成功率选模型。本项目三集分离保证 EVAL 集用于 checkpoint 选择的偏差在 2–4pp 以内,远小于当前 10pp 损失。

P8 — 随机起终点无解任务污染(已修复,commit 413b4eb

量化

障碍密度 25% 的 10×10 迷宫,内圈约 48 个自由格。10×10 迷宫典型情况下有 1–3 个连通分量(主路径 + 孤立区域)。设两个随机格属于不同连通分量的概率为 $p_{\text{unreachable}}$,则:

无解任务率punreachable510%\text{无解任务率} \approx p_{\text{unreachable}} \approx 5\text{–}10\%

对训练 buffer 的影响:

  • 无解局平均 200 步(max_steps 截断),正常局平均约 80 步,步数比 2.5:1
  • buffer 中无解任务的步数权重约为 $\frac{0.075 \times 200}{0.925 \times 80 + 0.075 \times 200} = 16.9%$
  • 这些步对应的 Q 目标值系统性偏低(无法通过任何动作获得 +100 终点奖励),引入对所有状态的价值低估偏差

对 Holdout 的影响:Holdout 100 张地图若含约 7 张不连通,则真实可达任务仅 93 张,失败任务被强制计入分母,成功率被低估约 7% × 真实成功率 ≈ 5pp(若真实成功率约 75%)。


R4 横向对比

方案 核心改动 EVAL 峰值 Holdout 相比 R3
R3 基准 buffer+target 84%(ep=3750) 74% / SPL=0.735 基准
R4-A1 revisit_penalty=-1.0 52% killed ep=1000 结构性失败
R4-A2 visited_map 4通道 80%(ep=4600) 75% / SPL=0.735 +1pp,统计不显著
R4-A3 EVAL checkpoint + BFS + visited_map(三项叠加) **88%**(ep=3300) 78% / SPL=0.773 +4pp

关键认识:R4-A2 的 visited_map 在理论上是正确的(Markov-correct),但由于缺少 EVAL-based checkpoint 配合,无法将 EVAL 峰值优势转化为 Holdout 提升。R4-A3 同时叠加三项修复,若结果显著优于 R3,说明三项叠加有效,但无法归因到单一变量;若要严格量化 EVAL checkpoint 的独立贡献,需补做 3通道 + EVAL checkpoint + BFS 的消融组。


结论链

  1. P9(马尔可夫性违反)是奖励设计的硬约束:任何依赖"episode 内历史"的奖励项(revisit_penalty、访问计数惩罚等)均违反 $Q(s,a)$ 的确定性假设,导致训练/推理奖励分布不一致。解决循环问题必须在状态空间而非奖励空间操作(visited_map),或接受循环为罕见失败案例并用截断处理。

  2. P7(checkpoint 保存策略)是系统性问题,与网络架构无关:在随机起终点任务中,训练奖励信号受地图难度随机性影响,与 EVAL 成功率的相关性约 0.3–0.5(偏弱)。以训练奖励触发保存等价于用噪声信号挑选模型。改为 EVAL-based 保存是修复代价最低、收益最高的单项改动,预期提升 Holdout 4–10pp。

  3. P8(连通性验证)是数据质量问题:修复后训练信号更干净,Q 值对"有解迷宫"的估计更准确,同时 Holdout 测量偏差减小。属于工程规范问题,修复后所有后续实验的数字均更可信。

  4. R4-A3 最终结果:Holdout **78%**(+4pp vs R3),EVAL 峰值 88%,SPL=0.773。三项变量(EVAL checkpoint + BFS + visited_map)叠加有效,但无法归因到单项。EVAL→Holdout 差距仍为 10pp,说明 EVAL checkpoint 虽选出了更好的模型,但平台期末段的性能退化(88%→78%)限制了最终收益。


Round 4(续)— 算法横向消融:Vanilla / Double / Dueling / Double-Dueling

日期:2026-06-01
目的:在 R4-A3 超参基础上,以四种 DQN 算法变体为唯一自变量,定量评估 Dueling Network 架构与 Double DQN 目标的独立及联合贡献。
实验方式:串行训练(bash && 链),保证资源隔离、随机种子隔离(seed=42 固定),结果可直接对比。


实验设计:控制变量说明

本组实验严格遵循单变量消融原则(Henderson et al. 2018)。四个算法的所有训练条件完全一致,唯一变量为网络架构与 Q 目标计算方式

算法 网络结构 Q 目标计算 理论来源
vanilla DQNNetwork(3卷积+2FC) $\hat{Q} = r + \gamma \max_{a'} Q_{\theta^-}(s',a')$ Mnih et al. (2015)
double DQNNetwork(同上) $\hat{Q} = r + \gamma Q_{\theta^-}(s', \arg\max_{a'} Q_\theta(s',a'))$ van Hasselt et al. (2016)
dueling DuelingDQNNetwork(V+A双流) 同 vanilla 目标 Wang et al. (2016)
double_dueling DuelingDQNNetwork(同上) 同 double 目标 两项正交叠加

关键事实:所有四种算法均使用相同的 4 通道观测(ch0=wall, ch1=agent, ch2=goal, ch3=visited_map)。入口均为 input_channels=4DQNNetworkDuelingDQNNetwork 的卷积特征提取部分结构完全相同,差异仅在分支头(Dueling 额外拆分 V/A 流)。

固定超参(源自 R4-A3,来自 config.yaml):

超参
num_episodes 5000
epsilon_decay 0.9985
buffer_capacity 80000
target_update_freq 1500
warmup_episodes 200
eval_every 100
num_test_mazes 50
checkpoint 策略 EVAL 成功率创新高时保存(P7 修复)
连通性验证 BFS 保证起终点可达(P8 修复)

Q 值高估危机:共性现象与算法间差异

危机成因(共性)

四种算法在 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 算子的修正能力不同。

四算法危机程度对比

算法 危机底部 EVAL 危机时间窗口 危机程度
vanilla **6%**(ep=600) ep≈400–800
double(A3) **10%**(ep=500–600) ep≈400–800
dueling **4%**(ep=500); **6%**(ep=700) ep≈400–800 最深、最长
double_dueling **20%**(ep=400) ep≈300–600 最浅、最快恢复

注:ep=700 时,double_dueling 已恢复至 **54%**,而 dueling 仍仅 **6%**,差距 48pp,是 Double DQN 抗高估特性的最直接定量证据。

Double DQN 的抗危机机制

vanilla 与 dueling 用 vanilla 目标($\max$ 算子正偏差在 Q 含噪声时系统性选中噪声最大动作,造成持续高估);double 与 double_dueling 用 Double DQN 目标(van Hasselt et al. 2016):

Q^double=r+γQθ(s,argmaxaQθ(s,a))\hat{Q}_{\text{double}} = r + \gamma Q_{\theta^-}(s', \arg\max_{a'} Q_\theta(s',a'))

解耦动作选择($Q_\theta$)与价值估计($Q_{\theta^-}$),两者的估计误差相关性低、互相抵消,$\max$ 算子的系统性高估被有效抑制。这解释了为何 double_dueling(ep=700:54%)远快于 dueling(ep=700:6%)恢复。


EVAL 曲线关键节点对比

阶段 vanilla double(A3) dueling double_dueling
危机最低点 6%(ep=600) 10%(ep=500–600) 4%(ep=500)/ 6%(ep=700) 20%(ep=400)
危机期 ep=700 18% 6%(二次探底) **54%**(已恢复)
EVAL 峰值 94%(ep=4800) 88%(ep=3300) 90%(ep=4900) 90%(ep=4200)
峰值 ep 4800 3300 4900 4200(最早)

观察

  • 危机深度排序(底越深越严重):dueling 4% ≪ vanilla 6% < double 10% < double_dueling 20%。Double DQN 抗高估机制使 double_dueling 危机最浅
  • 恢复速度:ep=700 时 double_dueling(54%)领先 dueling(6%)48pp,是 Double DQN 解耦机制最直接定量证据
  • 峰值时机:double_dueling(ep=4200)比 vanilla(ep=4800)早 600 ep,体现双重改进加速收敛

double(A3) 完整曲线见 R4-A3 节


Holdout 最终结果

排名 算法 Holdout 成功率 Holdout SPL EVAL 峰值 EVAL→Holdout 权重路径
🥇 dueling 84.0% 0.817 90%(ep=4900) −6pp results/best_model_train_dueling_20260601_003409.pth
🥈 double_dueling 81.0% 0.793 90%(ep=4200) −9pp results/best_model_train_double_dueling_20260601_023134.pth
🥉 double(A3) 78.0% 0.773 88%(ep=3300) −10pp results/best_model_train_double_20260531_*.pth(R4-A3 运行)
4️⃣ vanilla 75.0% 0.726 94%(ep=4800) −19pp results/best_model_train_vanilla_20260531_232230.pth
(参考) R3 double 74.0% 0.735 84%(ep=3750) −10pp

R1–R4 纵向成功率:61%(R1)→ 64%(R2)→ 74%(R3)→ 84%(R4 dueling)

R4 四算法 EVAL 成功率曲线

R4 四算法 EVAL 成功率对比

R4 四算法 EVAL SPL 对比


理论分析

Dueling Network 机制与本任务的适配性

Wang et al. (2016) 指出,Dueling 架构将 Q 函数分解为状态价值函数 $V(s)$ 与优势函数 $A(s,a)$ 的和:

Q(s,a)=V(s)+A(s,a)1AaA(s,a)Q(s,a) = V(s) + A(s,a) - \frac{1}{|\mathcal{A}|}\sum_{a'} A(s',a')

其核心收益在于共享状态价值估计:V(s) 流被所有动作共享,每次梯度更新获得所有动作的梯度信号(更新频率是 A(s,a) 流的 $|\mathcal{A}|$ 倍,本任务 4 倍),估计更稳定。

随机起终点 10×10 迷宫中存在大量"多数动作等效"的状态(死胡同、走廊段、ch3 标记的已访问格),V(s) 携带的路径价值信息(曼哈顿距离+障碍分布+访问历史)比单动作的 A(s,a) 更稳定。

这一分析与实测结果一致:dueling 的 EVAL→Holdout gap 仅 6pp(最小),Dueling 架构泛化性能最稳定。

Double DQN 在危机期的修正机制

如前所述,Double DQN 解耦动作选择与价值估计,有效抑制 $\max$ 算子的系统性高估。在本实验中,该机制的量化收益体现在:

  • 危机期:ep=700 时 double_dueling(54%)领先 dueling(6%)达 48pp,Double DQN 将危机持续时间压缩约 200–300 ep
  • 峰值时机:double_dueling EVAL 峰值(ep=4200)比 dueling(ep=4900)早 700 ep,说明 Double DQN 加速了整体收敛,减少了 Q 高估导致的"无效探索周期"

然而,Double DQN 的修正作用在充分训练后逐渐饱和:两者最终 EVAL 峰值均为 90%,差距消失。这与 van Hasselt et al. (2016) 的分析一致——Double DQN 的收益主要在训练早中期(Q 值估计噪声大),随训练推进 Q 值收敛后两者趋同。

Dueling + Double 组合的实测效果分析

理论预期:两项改进正交(一改架构,一改目标计算),叠加应有协同收益。

实测结果:double_dueling Holdout=81%,低于纯 dueling(84%)3pp。

可能解释:double_dueling 在 ep=4200 已达 EVAL 峰值,dueling 在 ep=4900 仍在上升。Double DQN 加速收敛使 double_dueling 较早"过峰",而 dueling 因 vanilla 目标保留了轻微高估"缓冲",维持了更长的高性能区间。末段稳定性(EVAL→Holdout gap)方面,double_dueling(-9pp)略大于 dueling(-6pp)也佐证此点。

注:Holdout n=100,CI≈±5pp;3pp 差距在统计边界但方向一致。

结论:Dueling 单独带来的泛化增益(+6pp vs double)大于 Double DQN 单独带来的增益(+3pp vs vanilla);两者组合在终态 Holdout 上不优于纯 Dueling,原因是 Double DQN 的加速效应改变了训练动态,使峰值出现更早但稳定区间更短。


EVAL→Holdout Gap 分析(泛化能力诊断)

算法 EVAL 峰值 Holdout Gap Gap 成因
vanilla 94% 75% -19pp EVAL 峰值出现在训练末段(ep=4800),EVAL 集(50张)与 Holdout 集(100张)的地图分布差异,加上 ep=4800 后 EVAL 峰值区间狭窄,保存的权重在 Holdout 上泛化偏弱
double(A3) 88% 78% -10pp R4-A3 实验基准水平
double_dueling 90% 81% -9pp Double DQN 早峰效应,EVAL 峰值附近策略稳定区间较短
dueling 90% 84% -6pp(最小) Dueling 架构泛化稳定;V(s) 流学习的"状态价值地图"在未见过的 Holdout 地图上迁移能力最强

vanilla 的 19pp Gap 解读

vanilla 是本组唯一 EVAL 峰值(94%)远高于其他算法但 Holdout 最低(75%)的算法,Gap 高达 19pp,是其他算法的 2–3 倍。两个可能原因:

  1. EVAL 集结构性偏差:EVAL 集由 seed+100000 派生固定生成(50 张,全程恒定),94% 是 vanilla 在这批地图上的真实性能,但这批地图对 vanilla 的特定决策边界恰好较友好——属于固定 EVAL 集对特定算法的结构性偏差
  2. 训练晚期策略退化:vanilla 无 V/A 分解,Q(s,a) 需逐一精确估计,训练末段(ep=4500+)的 buffer 回放可能已不能支持持续更新,导致 Holdout 泛化大幅缩水

dueling 的 6pp Gap 解读

Dueling 的真正泛化优势在 V(s) 流的参数共享机制(上节已述),每次梯度更新 V(s) 获得所有动作的梯度信号(4 倍更新频率),学习更充分。V(s) 学习的"靠近目标的状态价值更高"这一规律不依赖特定障碍布局,在任意地图上均成立,泛化最稳定。


循环失败率 R3 / R4 对照(验证 4 通道的实际效果)

R3 节已记录"循环是 R3 失败主因"的数据(25/25 失败局为步数=200 截断且撞墙=0)。R4 训练完成后用相同方法(Holdout 100 局,ε=0 推理)回访测量:

分类 R3 (double, 3通道) R4 (double, 4通道)
快速成功(≤30 步) 75 78
失败·截断(步数=200) 25 22
其他(中间步数失败/慢成功) 0 0
成功率 75% 78%
失败局中截断占比 100% 100%
失败局平均撞墙数 0.0 0.0

结论

  • 截断数 25 → 22(−3pp,n=100 下 σ≈4.3pp,不具统计显著性
  • 但截断率 100% 这一失败模式结构未变——4 通道减少了陷入循环的地图数量,循环机制本身仍是 R4 失败主因
  • R3 → R4 成功率 +3pp 全部来自"减少了循环地图数",而非消除了循环机制
  • 因此 Web Demo 仍需 anti-loop 兜底——网络能避开大部分循环地图,但对剩余的循环地图仍无能为力

结论链(R1→R4 纵向总结)

以下为本项目全程的核心发现链,以 Holdout 成功率为主线:

轮次 核心突破 Holdout 关键问题诊断
R1 随机起终点基线 61% P1(训练量不足)、P2(探索过早终底)
R2 延长训练+调缓探索衰减 64% P3(buffer 过小导致振荡)、P4(target 同步过频)
R3 buffer×4 + target×3 74% P5(早期 Q 值高估 crisis,根因待定)、P7(checkpoint 时序偏差 10pp)
R4-A1 revisit_penalty(失败) P9(马尔可夫性违反) ← 结构性失败
R4-A2 visited_map 4通道 75% P7 未修复导致 EVAL 峰值无法转化为 Holdout 提升
R4-A3 (double) EVAL checkpoint + BFS + visited_map 78% EVAL→Holdout gap 10pp 持续(算法限制)
R4 dueling 同 A3 超参 + Dueling 架构 84% EVAL→Holdout gap 仅 6pp(最优泛化)
R4 double_dueling 同上 + Double DQN 81% 收敛快但末段稳定性略低
R4 vanilla 同上,无增强 75% 94% 仅在固定 50 张 EVAL 集上成立,真实泛化最弱

最终结论(五点)

  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 的独立贡献(控制其他变量不变)。

  2. Double DQN 主要收益在训练过程,非最终结果:危机期加速恢复(ep=700 领先 dueling 48pp)和早期收敛加速是真实收益;5000 ep 充分训练后,与纯 dueling 的 Holdout 差距(81% vs 84%)表明 Double DQN 抗高估机制在本任务规模下已不是瓶颈。

  3. EVAL→Holdout gap 是算法质量的独立指标:dueling 6pp、double_dueling 9pp、double 10pp、vanilla 19pp,与架构泛化能力排序一致,可作为独立于 Holdout 成功率的泛化质量指标。

  4. P7(EVAL-based checkpoint)是高性价比修复,但单项贡献未严格消融:R4-A2(仅 visited_map,无 P7)Holdout=75% 仅 +1pp(不显著),间接说明 P7 是三项中单项收益最大者;严格证明需补做 3通道+EVAL checkpoint+BFS 对照组。

  5. P9(马尔可夫性违反)是硬约束:任何将 episode 历史信息置于奖励函数中的循环抑制方案均导致 Q 函数目标无意义,正确解决方案唯有状态编码(visited_map)。


已知局限与后续优化项

实验设计层面

# 问题 标准做法 本项目取舍
A 超参消融阶段多次参考了 Holdout 数字,测试集不严格无偏 验证集专用于超参搜索,Holdout 只在最终报告用一次 时间限制;R4 引入 EVAL-based checkpoint 是向正确方向的修正,但 R1–R3 的超参决策已隐性参考了 Holdout
B R3 同时修改两个变量(buffer + target_freq),无法归因各自贡献 每次只改一个变量,或补做单因素对照组 时间限制;buffer×4 与 target×3 的独立贡献未被单独量化
C 所有结论基于单次训练,无重复实验 每配置 3–5 个随机种子,报告均值 ± std(Henderson et al. 2018) 算力限制;dueling vs double_dueling 3pp 差距(Holdout n=100,CI≈±5pp)统计不显著,需重复实验确认
D 评估时失败局步数未记录 run_evaluation() 记录逐局步数,区分循环失败与走入死路失败 现有 log 无此数据;需改代码重跑,当前仅有训练期数据(混合探索期与贪心期)

算法与工程层面

# 问题 解决方案 预期收益
E visited_map 二值编码无法区分访问次数,网络对两格死循环覆盖不足,需 app 推理时兜底 将 ch3 改为归一化计数图(min(count,3)/3.0,cap=3),重新训练 网络内化"高频重访格应规避"策略,推理时 Q 值修正可完全移除
F 振荡根治需 Prioritized Experience Replay 实现 PER(Schaul et al. 2016),赋予高 TD-error 样本更高采样概率 消除均匀采样导致的成功样本周期性被覆盖问题,振荡从根本上消除

指标层面

# 问题 解决方案
H Grid-SPL(排除撞墙步)不可与标准 HabitatAI SPL 直接比较,文档曾未充分说明 已在 technical_report.md 和 comparison.md 补充说明
I SPL 与成功率高度共线(比值 0.978±0.009),独立信息增量有限 已在 comparison.md 补充共线性数据;若需更强区分度,可考虑记录"失败局平均步数"作为失败模式诊断指标