HATT 设计讨论摘要
当前对话最后三轮:架构判断、规模与资源估算、HATT 到 Actor 的信息流,以及实施更新大纲。
1. 架构判断
两份建议的核心结论一致:当前网络把所有 Task 信息压缩到一个 Agent 向量后,再用固定线性层输出任务编号,导致图表示与具体 Task 动作之间缺少可追踪对应关系。
| 现有结构 | 建议结构 |
|---|---|
| A/T 共用节点变换 | AgentEncoder 与 TaskEncoder |
| A-A、A-T 共用注意力 | 关系独立的 Attention |
| 只输出 Agent embedding | 保留 Agent 与 Task 表示 |
| 固定动作编号线性层 | 逐 Task 的关系级动作解码 |
可以继续复用 nn.Linear、LayerNorm、softmax 和 einsum。需要自行定义的是类型编码、关系聚合、融合方式和任务级动作解码。
AgentEncoder TaskEncoder AA Relation Attention TA Relation Attention Relation Fusion Task Action Decoder
现有 PyG GATConv 建议保留,作为论文中的同质 GAT 消融基线。
2. 稠密张量能否扩展
第一版 HATT 主要计算 A-A 与 A-T 关系,其关系数量为:
| 规模 | A-A | A-T | 总关系数 |
|---|---|---|---|
| A=12, T=13 | 144 | 156 | 300 |
| A=30, T=100 | 900 | 3000 | 3900 |
每个状态 3900 个关系仍适合稠密计算。只有当 T 达到数百到上千,或每个 Agent 只感知极少任务时,稀疏图才明显更合适。
[B,A,T,H]。在 B=750、A=30、T=100、H=128、FP32 时,仅一个此类张量就约占 1.15 GB。应直接计算低维分数矩阵:
3. 显存与训练时间估算
假设 H=128、4 个 head、FP32、PPO 状态批次 B≈750、一层 AA+TA Attention。
| 项目 | 当前 12/13 规模预估 |
|---|---|
| Attention map | 约 3.6 MB |
| 新增 Actor 激活显存 | 约 100–400 MB |
| 整体显存变化 | 通常增加约 0.1–0.5 GB |
| 相对当前 PyG GAT 耗时 | 约 0.8–1.3 倍 |
| 相对 NoGAT 耗时 | 约 1.5–2 倍 |
扩展到 30/100 时,关系计算约为当前的 13 倍。建议把 num_mini_batch 从 1 调到 4 或 8,使显存随 minibatch 大小线性下降。
4. HATT 的输入与输出
输入
X_A: [B,A,F_A] Agent 特征 X_T: [B,T,F_T] Task 特征 M_AA: [B,A,A] A-A mask M_AT: [B,A,T] A-T / available mask E_AA: A-A 关系特征 E_AT: A-T 关系特征
类型编码
A-A 关系聚合
Task→Agent 关系聚合
Agent 更新
第一版可以暂不更新 Task,令 HT = HT0。
5. 如何送入 Actor
任务级动作解码:
动作 mask 与策略:
直观上,HATT 负责让 Agent 理解团队和任务上下文;TaskActionDecoder 负责让 Agent 逐个比较 Task。Categorical、PPO log-prob、entropy、Buffer 与 Critic 的主体不需要改变。
6. 第一版更新边界
第一版只实现必要结构:
Agent / Task 类型编码 A-A 关系注意力 Task→Agent 关系注意力 Agent 上下文融合 Task-specific Action Decoder available_actions mask
暂不加入 Agent→Task 联盟聚合、显式排斥通道、多层传播和 Graph Critic。Critic 继续使用当前 centralized state MLP,避免 Actor 与 Critic 同时变化。
7. 观测与关系契约
Agent 公共基础状态
position(2) capabilities(4) load(1) battery(1) coalition_id(1) agent_type(1) living(1)
共 11 维。Ego 可以附加当前任务类型和发现比例等 focal 决策上下文,但公共 Agent 字段应与 Others 对齐。
Task 状态
position(2) requirements(4) demand(1) task_type(1)
关系特征
| 关系 | 第一版特征 | Mask |
|---|---|---|
| A-A | relative_xy、same_coalition | 可见、存活、排除 self row |
| A-T | relative_xy、currently_assigned | available_actions |
能力和需求已经存在于节点特征中,第一版不额外提供能力差、需求差或距离标量。
8. 去中心化批量数据流
Runner 可以批量计算全部 Agent,但每个 focal Agent 只能使用自己的局部观测:
ego: [B,A,F_ego] others: [B,A,A,F_agent] tasks: [B,A,T,F_task] available_actions: [B,A,T]
9. 模块职责
| 模块 | 输入 | 输出与职责 |
|---|---|---|
| SelfAgentEncoder | Ego | focal Agent 表示 [B,A,H] |
| OtherAgentEncoder | Others | 其他 Agent 表示 [B,A,A,H] |
| TaskEncoder | Tasks | 逐观察者 Task 表示 [B,A,T,H] |
| AAAttention | Self、Others、AA mask | 团队上下文 [B,A,H] |
| TAAttention | Self、Tasks、AT mask | 总体任务上下文 [B,A,H] |
| RelationFusion | Self、AA、TA context | Agent 决策上下文 [B,A,H] |
| TaskActionDecoder | Agent context、Task、AT relation | 逐任务 logits [B,A,T] |
10. Policy、PPO 与模型管理
- 新增 HATT Actor,但保持
get_actions、evaluate_actions和act的公共接口。 - Rollout 与训练必须使用同一套 logits 生成逻辑,历史动作 log-prob 可被准确复算。
- Buffer 继续保存 Dict obs 和
available_actions;Critic 继续读取 centralized state。 - Optimizer、梯度裁剪和 grad norm 必须覆盖 Encoder、Attention、Fusion 和 Decoder 的全部参数。
- 保存和恢复整个 HATT Actor,不能只保存旧的 R_Actor。
- 旧 PyG GAT 保留为 Homogeneous GAT 消融基线。
11. 实施顺序与验收
- 固定 NoGAT 与旧 GAT 基线结果。
- 统一 Ego/Others 的 Agent 字段契约。
- 完成类型编码器、AA/TA Attention 和关系融合。
- 完成 Task-specific Decoder 与动作 mask。
- 接入 Policy、优化器、保存与日志。
- 验证 Task 置换后 logits 同步置换。
- 验证不可用任务概率为零、各分支梯度非零。
- 验证 rollout 与训练阶段的 action log-prob 一致。
- 分别运行 NoGAT、旧 GAT、HATT 冒烟训练。
- 最后测试 A=30、T=100 的显存和更新时间。
第一版稳定后,再通过消融决定是否加入 Agent→Task 联盟聚合、显式竞争通道和多层关系传播。