PenGym 单智能体 izumi 当日进展报告:D3QN-v2 训练评估链路已打通,但当前策略仍陷入局部失败循环

一、这篇文章要说明什么

这份记录只描述今天真实完成的事情,不描述理想路线。

今天的结果可以概括为四点:

  1. 已新建 prototype/drl_izumi/ 单智能体 DRL 实验线,并采用 D3QN 作为当前学习型 izumi 的核心决策模型。
  2. 已完成 D3QN-v2 训练链与评估链的工程打通,训练不再停留在“规则 agent”或“脚本报错”阶段。
  3. 已定位并修复一批关键接口级 bug,使训练能够真正进入参数更新阶段。
  4. 当前模型虽然已经具备深度强化学习训练能力,但评估结果显示策略质量仍然较差,主要表现为重复执行局部失败动作循环。

因此,今天最准确的阶段判断是:

  • D3QN-v2 单智能体 DRL 工程链:已打通
  • 当前策略效果:仍不理想,尚不能替代规则版 izumi
  • 下一步重点:不再是修接口,而是抑制循环行为、加强动作约束与奖励设计

二、今天的工作目标

今天的目标,不是继续扩展规则路径,也不是继续尝试 PPO,而是做一件更基础但必须先完成的事:

izumi 的学习型分支真正跑起来

也就是说,今天聚焦的是:

  1. 建立独立的 drl_izumi 目录;
  2. 以 D3QN 为核心实现单智能体学习型 izumi
  3. 跑通训练;
  4. 跑通评估;
  5. 判断当前策略到底是“不能训练”,还是“能训练但学歪了”。

三、今天实际新建和修改的内容

今天在仓库中实际建立了新的 DRL 目录:

1
prototype/drl_izumi/

其中至少包括:

  • state_encoder.py
  • valid_actions.py
  • q_network.py
  • replay_buffer.py
  • train_ddqn.py
  • eval_ddqn.py

这些文件构成了当前单智能体 DRL 版 izumi 的独立实验线。

1. 状态编码层

当前版本先采用较保守方式:

  • 将环境 observation 直接转为 float32
  • 再拉平成固定维向量

这意味着当前单智能体 D3QN 直接使用的是 PenGym/NASim 输出的向量化观测,而不是额外构造图状态或高级语义表示。

2. 合法动作约束层

今天的 valid_actions.py 已经不再是“全动作开放”,而是加入了第一版启发式动作过滤逻辑。
此前实验中已经确认:

  • PenGym 当前原生 get_action_mask() 在初始状态会返回全 0 mask,不能直接用;
  • 因此今天采用了启发式合法动作过滤作为第一版替代。

该版本的动作过滤已经能挡掉一部分明显无意义动作,例如此前导致策略死循环的:

  • SubnetScan: target=(5,0)

在新版本里已经不再是默认可选动作。

3. Q 网络结构

今天已经将原本普通 DDQN 骨架升级为:

Dueling Double DQN(D3QN)

也就是说,当前学习型 izumi 的核心网络不是简单 Q Network,而是:

  • Double DQN 的 target 估计方式
  • Dueling Network 的状态价值 / 动作优势分离结构

因此,当前实验线的准确说法应为:

D3QN-v2 单智能体 izumi

四、今天修复了什么问题

今天最大的进展之一,不是“效果变好了”,而是:

把一整条原本会在 episode 7 中途崩掉的训练链修通了

1. 首个关键问题:ReplayBuffer 接口不一致

在给 replay_buffer.py 加入 Prioritized Replay 之后,sample() 返回值发生了变化。
原先 optimize() 仍按旧接口解包,因此导致训练在第一次进入学习阶段时报错:

1
ValueError: too many values to unpack (expected 7)

这一问题在今天已被定位并修复。

2. 第二个问题:optimize() 调用参数未补全

在把 optimize() 改成接收 beta 参数后,训练循环中的调用仍保留旧写法,导致后续又出现:

  • optimize() 参数不匹配问题

这个问题本质上仍然属于:

PER 集成链没有一次性改全

今天这部分也已继续修复。

3. 第三个问题:beta_schedule() 及其依赖未补全

在继续向前推进时,又出现:

  • beta_schedule 未定义
  • BETA_START / BETA_END 未定义

日志已经明确指出,训练在首次尝试进入 PER 学习分支时,会在:

1
beta_schedule(global_step)

这里崩掉。

今天后续已经把:

  • PRIO_ALPHA
  • BETA_START
  • BETA_END
  • PRIORITY_EPS

补回到 train_ddqn.py 中,使训练链继续向前推进。

4. 当前判断

因此,今天修的不是“随机小问题”,而是一整条D3QN + PER 工程集成链上的连续接口问题。
这说明:

  • 环境并不是主要矛盾;
  • 当前 bug 的主要来源,是 DRL 分支在从 v1 向 v2 演化时,多个模块接口没一次性对齐。

五、今天最重要的工程结果

今天最关键的结果,不是某个 exploit 成功,而是:

D3QN-v2 训练链已经真正跑通,并且训练已经进入参数更新阶段。

此前很多轮训练都停留在:

  • global_step < LEARN_START
  • mean_loss = 0

这意味着它们实际上只是经验收集,还没有真正开始学习。

但在今天后续的训练结果里,已经出现了:

  • global_step 持续推进直到 20000
  • mean_loss 不再是 0.000000
  • 训练日志能连续输出到后期 episode
  • 程序不再在 episode 7 中途因为 PER 接口 bug 崩溃

这说明:

学习型 izumi 已经真正具备深度强化学习训练能力。

这一步非常关键,因为它和之前“只有规则 izumi 可运行、学习版一直停在接口报错”已经是两个阶段。

六、今天的评估结果说明了什么

虽然训练链已经打通,但当前策略质量仍然较差。

从评估日志可以看到,当前模型并没有形成有效渗透路径,而是陷入了明显的局部循环,重复执行以下几类动作:

  • ServiceScan: target=(2,1)
  • Exploit e_ftp: target=(2,1)
  • PrivilegeEscalation pe_daclsvc: target=(6,1)

而且这些动作往往会反复产生:

  • permission_error=TRUE
  • FAILURE
  • reward = -1.0

例如,在评估后期,动作 190、41、36 会以明显循环方式重复出现,分别对应:

  • PrivilegeEscalation: target=(6,1)
  • Exploit: target=(2,1), service=ftp
  • ServiceScan: target=(2,1)

当前评估的准确结论

当前 D3QN-v2 的行为并不是“完全无动作”,也不是“无法执行环境交互”,而是:

已经能动作、能训练、能评估,但学到的是一个低质量局部循环策略。

换句话说:

  • 工程问题:今天已经基本打通
  • 策略问题:今天首次被清晰暴露出来

七、今天到底完成到了哪一步

如果只用一句话准确描述今天阶段,最合适的表述是:

已完成 prototype/drl_izumi/ 单智能体 D3QN-v2 分支搭建,修复了 Prioritized Replay 集成过程中的多处接口级 bug,使学习型 izumi 能够真正完成训练与评估。但当前训练后的策略仍未收敛为有效渗透策略,评估中主要表现为重复执行低价值失败动作循环。

这句话比“已经做成了 DRL izumi”更准确,也比“完全没做成”更符合事实。

八、今天的阶段性成果总结

今天已经真实完成的内容包括:

1. 工程层

  • 新建 prototype/drl_izumi/ 目录;
  • 建立 D3QN-v2 单智能体训练脚本与评估脚本;
  • 补齐状态编码、动作过滤、Q 网络、ReplayBuffer 等基础模块;
  • 修复 PER 集成链上的关键接口 bug。

2. 训练层

  • 学习型 izumi 已能在 medium-multi-site 场景下执行完整 D3QN 训练;
  • 训练不再停留在纯经验积累阶段;
  • mean_loss 已经不再长期保持 0;
  • 说明参数更新过程已经真实发生。

3. 评估层

  • 可加载训练后模型进行评估;
  • 评估说明当前策略不是“不会动”,而是“会动但学歪了”;
  • 策略表现为局部重复失败动作循环。

九、当前还没有完成的部分

今天虽然把 DRL 训练和评估打通了,但以下内容仍未完成:

1. 当前学习型策略还不能替代规则 izumi

规则版 izumi 仍然是目前可复现、可演示、可完成有效攻击路径的稳定基线。

而当前 D3QN-v2 只能说明:

  • 已具备训练能力
  • 尚不具备稳定策略能力

2. 当前动作约束仍不够强

目前的 valid_actions.py 只能挡掉部分明显坏动作,但仍无法阻止:

  • 已知目标重复扫描
  • 已失败 exploit 反复尝试
  • 已失败提权反复尝试

3. 当前奖励设计不够区分“推进”和“空转”

从评估行为看,模型还没有被足够强地惩罚:

  • 重复无效扫描
  • 重复失败 exploit
  • 重复失败 privesc

同时也没有被足够清晰地鼓励:

  • 新信息发现
  • 首次成功扫描
  • 首次成功 exploit
  • 首次成功提权
  • 子网发现

十、下一步最合理的推进方向

今天之后,下一步不应该再把主要精力放在“修接口”上,而应该转到:

抑制策略循环与提升收敛质量

当前最合理的顺序是:

1. 先加强动作约束

优先在 valid_actions.py 中加入反循环机制,例如:

  • 同一目标已扫描过后,本 episode 不允许重复 service_scan
  • exploit 连续失败后,临时屏蔽相同 exploit 重试
  • privesc 连续失败后,临时屏蔽相同提权动作重试

2. 再做 reward shaping

明确区分:

  • 新信息探索
  • 首次成功 exploit / privesc
  • 子网发现
  • 重复失败动作
  • 重复扫描已知目标

3. 之后再继续比较 v1 / v2 / v3

这样后面每一轮实验才能回答清楚:

  • 到底是哪一刀起作用
  • 是动作约束改善了循环
  • 还是奖励设计改善了收敛

十一、这一阶段最准确的结论

今天最重要的意义,不是“已经得到最终智能体”,而是:

第一次把学习型 izumi 从“不断接口报错”推进到了“能够真实训练和评估”的阶段。

这意味着当前项目已经不再只是:

  • 规则基线 + 独立 PPO 脚本

而是已经拥有:

  • 一条独立的 D3QN 单智能体实验线
  • 可训练
  • 可评估
  • 可继续优化

这一步非常关键,因为没有这一步,后面所有关于:

  • 收敛
  • reward
  • action masking
  • 多智能体扩展
  • LLM 上层编排

都没有工程落点。

十二、总结

当前最准确的当日总结是:

今天已完成 prototype/drl_izumi/ 单智能体 D3QN-v2 深度强化学习实验线的工程打通,修复了 Prioritized Replay 集成过程中的关键接口问题,使学习型 izumi 首次具备了真实训练与评估能力。但当前训练结果显示,策略尚未收敛为有效渗透行为,而是主要陷入局部失败动作循环。下一步工作重点应从“修接口”转向“加强动作约束与奖励设计”,以提高策略质量并逐步接近可替代规则基线的学习型 izumi