问题1:GAT 结构错误

核心论点:Legacy GAT 做了节点级 pair-wise 聚合,但没有做agent-task 候选边级解码,导致 logits 与任务没有显式对应关系,且不满足任务索引等变性。

---
Slide 1:Actor 的输入与输出

Actor_1 的输入

$$o_1 = \{\,\underbrace{\text{ego}_1}_{\text{自身状态}},\; \underbrace{\text{tasks}_{1:M}}_{\text{所有任务}},\; \underbrace{\text{others}_{2:N}}_{\text{其他智能体}}\,\}$$

Actor_1 的输出

$$\pi_1 = \text{softmax}(\text{logits}_1), \quad \text{logits}_1 \in \mathbb{R}^{M}$$

输出维度 $M$ 正好等于任务数。一个自然的期望是:第 $m$ 维 logits 应该显式表示 "Actor_1 选择 Task_m 的得分"。

---
Slide 2:Legacy GAT 实际做了什么

Legacy GAT 的端到端流程:

输入 obs → [Build Graph] → [GATConv × 2] → [Global Pool] → [MLP] → logits ↑ ↑ ↑ ↑ Agent/Task Nodes Node Embeddings Graph Vector 任意映射 + 全连接边 h_i^(2) ∈ ℝ³² ∈ ℝ³² 到 ℝᴹ

关键中间量

GATConv 更新公式

$$h_i^{(l+1)} = \sigma\left( \sum_{j \in \mathcal{N}(i)} \alpha_{ij}^{(l)}\, W^{(l)} h_j^{(l)} \right)$$

其中 $\alpha_{ij}$ 是节点 $i$ 对邻居 $j$ 的注意力权重。注意:这是节点级聚合,不是边级打分。

---
Slide 3:缺陷1 —— logits 与任务没有显式对应

Legacy GAT 输出 logits 的方式:

$$\text{logits}_1 = \text{MLP}\big(\, [\,\text{obs}_1 \;\|\; \underbrace{h_1^{(2)}}_{\text{Actor_1 节点嵌入}} \;\|\; \underbrace{\text{GlobalPool}}_{\text{全图平均}} \,] \big)$$

问题在哪里?

换句话说:

$$ \begin{aligned} \text{理想的}: \quad \text{logits}_1[m] &= f(\text{Actor}_1, \text{Task}_m, \text{Context}) \\ \text{实际的}: \quad \text{logits}_1 &= \text{MLP}(\text{Actor}_1\text{的混合特征} + \text{全图平均}) \end{aligned} $$

MLP 可以学到任意映射,但这种映射没有被问题的结构所引导。

---
Slide 4:缺陷2 —— 不满足任务索引等变性

任务索引等变性(Task-index Equivariance):如果输入中 Task_i 和 Task_j 交换位置,那么输出 logits 的第 $i$ 维和第 $j$ 维也应该交换。

$$\text{swap}(\text{Task}_i, \text{Task}_j) \;\Rightarrow\; \text{swap}(\text{logits}[i], \text{logits}[j])$$

Legacy GAT 为什么不满足?

  1. 节点顺序变化:交换 Task_i 和 Task_j 后,图中 task 节点的排列顺序变了,对应的节点 embedding 会交换。
  2. 但 GlobalPool 是 mean:mean pooling 对节点排列是 invariant 的,不会因为任务交换而改变。
  3. MLP 没有等变结构:最终 MLP 的权重是固定的,不会因为输入任务顺序交换而自动交换输出维度。

具体表现:

$$ \begin{aligned} \text{输入}: \quad &\text{tasks} = [T_1, T_2, T_3, T_4] \\ \text{输出}: \quad &\text{logits} = [\ell_1, \ell_2, \ell_3, \ell_4] \\ \text{交换后输入}: \quad &\text{tasks} = [T_1, T_4, T_3, T_2] \\ \text{期望输出}: \quad &\text{logits} = [\ell_1, \ell_4, \ell_3, \ell_2] \\ \text{实际输出}: \quad &\text{logits} \approx [\ell_1', \ell_2', \ell_3', \ell_4'] \neq [\ell_1, \ell_4, \ell_3, \ell_2] \end{aligned} $$

MLP 可能通过数据拟合部分学到这种对应关系,但没有结构保证,训练困难且泛化差。

---
Slide 5:为什么这是崩溃的主因

Legacy GAT 的失败不是因为没有 attention,而是因为 attention 的结构与动作空间不匹配

组件 Legacy GAT 做了什么 问题
Attention 节点级 pair-wise 注意力 $\alpha_{ij}$ 聚合后丢失了与具体任务的对应
Pooling Global Mean Pooling 对任务排列 invariant,破坏等变性
Decoder 无结构约束的 MLP logits[m] 与 Task_m 没有显式关系

结果:网络需要同时学习两件事——

  1. 如何从图中提取有效特征;
  2. 如何把提取到的特征任意映射到正确的任务维度上。

第二件事没有结构引导,导致训练不稳定、泛化差。这也是为什么 Legacy GAT 成功率只有 25–72%,且不同 seed 波动很大。

---
Slide 6:HATT 的解决思路 —— 边级解码

HATT 不输出节点 embedding 再经过 MLP,而是显式地对每条 agent-task 候选边打分

Legacy GAT: HATT v1.0/v2.0: h_i^(2) ──→ MLP ──→ logits (Actor_1, Task_m, edge_1m) ──→ score_m ↑ ↑ 节点级聚合 边级解码 全局池化 每个任务一个显式得分

HATT 的解码器输入:

$$\text{score}_{1,m} = \text{Decoder}(\underbrace{\text{Actor}_1}_{\text{agent context}}, \underbrace{\text{Task}_m}_{\text{task context}}, \underbrace{E_{1m}}_{\text{edge feature}})$$

好处

这正是从 GAT 转向 HATT 的核心原因:不是不要 attention,而是要把 attention 从节点聚合变成边级决策

---
Slide 7:总结
  1. GATConv 做了节点级 pair-wise 聚合,但 Legacy GAT 把它用错了地方。
  2. Legacy GAT 输出的是节点 embedding + 全局池化,再经过无约束 MLP 得到 logits。
  3. 这导致 logits 的每一维与具体任务没有显式对应关系。
  4. Global Mean Pooling 对任务排列 invariant,破坏了任务索引等变性。
  5. HATT 的改进是引入显式的 agent-task 候选边解码器,直接输出 per-task 得分。

下一页:HATT v1.0 基础框架 —— 如何用 Dict 观测和三个 encoder 实现边级解码。