Legacy GAT:从 $o_i$ 到 $\pi_i$ 的完整更新公式
符号约定:
- $B$:batch size;$N_a = 12$:agent 数;$M = 10$:任务数;$C = 4$:能力维度。
- 默认 GAT 超参:$\text{gat\_hidden\_dim}=256$,$\text{gat\_out\_dim}=128$。
- $o_i$ 表示 agent $i$ 的 Dict 观测;$\bar{o}_i$ 表示其 flatten 后的向量。
---
Step 1:从 Dict 观测到图节点特征
$$o_i = \{\,\text{ego}_i \in \mathbb{R}^{C+7},\; \text{tasks}_i \in \mathbb{R}^{M \times (C+4)},\; \text{others}_i \in \mathbb{R}^{N_a \times (C+7)}\,\}$$
对时间步 $t$ 的所有 agent 和任务构建节点:
$$\mathbf{x}_a^{(t)} = \text{BuildAgentNodes}(\{\text{ego}_i^{(t)}\}_{i=1}^{N_a}, \{\text{others}_i^{(t)}\}_{i=1}^{N_a}) \in \mathbb{R}^{N_a \times 9}$$
$$\mathbf{x}_\tau^{(t)} = \text{BuildTaskNodes}(\{\text{tasks}_i^{(t)}\}_{i=1}^{N_a}) \in \mathbb{R}^{M \times 9}$$
拼接得到全图节点特征:
$$\mathbf{x}^{(t)} = \begin{bmatrix} \mathbf{x}_a^{(t)} \\ \mathbf{x}_\tau^{(t)} \end{bmatrix} \in \mathbb{R}^{(N_a+M) \times 9}$$
对 batch 中所有时间步拼接:
$$\mathbf{x} = \begin{bmatrix} \mathbf{x}^{(1)} \\ \vdots \\ \mathbf{x}^{(B)} \end{bmatrix} \in \mathbb{R}^{B(N_a+M) \times 9}$$
---
Step 2:图构建(边与边特征)
边集合 $\mathcal{E} = \mathcal{E}_{a \to \tau} \cup \mathcal{E}_{\tau \to a} \cup \mathcal{E}_{a \to a}$,其中:
$$|\mathcal{E}_{a \to \tau}| = |\mathcal{E}_{\tau \to a}| = N_a M, \quad |\mathcal{E}_{a \to a}| = N_a(N_a-1)$$
总边数:
$$E = 2N_aM + N_a(N_a-1) = 2 \times 12 \times 10 + 12 \times 11 = 372$$
边特征:
$$
\mathbf{e}_{ij} =
\begin{cases}
\mathbf{x}_{\tau,j} - \mathbf{x}_{a,i}, & (i,j) \in \mathcal{E}_{a \to \tau} \\
\mathbf{x}_{a,i} - \mathbf{x}_{\tau,j}, & (i,j) \in \mathcal{E}_{\tau \to a} \\
-\text{similarity}(i,j) \cdot \mathbf{1}_9, & (i,j) \in \mathcal{E}_{a \to a}
\end{cases}
$$
其中:
$$\text{similarity}(i,j) = \frac{1}{1 + \frac{1}{9}\sum_{d=1}^{9} |\mathbf{x}_{a,j}^{(d)} - \mathbf{x}_{a,i}^{(d)}|}$$
---
Step 3:第一层 GATConv(1-hop 聚合)
对每个节点 $i$,计算其邻居 $j \in \mathcal{N}(i)$ 的注意力权重:
$$\alpha_{ij}^{(0)} = \frac{\exp\left( \text{LeakyReLU}\left( \mathbf{a}^{(0)\top} \left[ W^{(0)}\mathbf{x}_i \;\|\; W^{(0)}\mathbf{x}_j \;\|\; \mathbf{e}_{ij} \right] \right) \right)}{\sum_{k \in \mathcal{N}(i)} \exp\left( \text{LeakyReLU}\left( \mathbf{a}^{(0)\top} \left[ W^{(0)}\mathbf{x}_i \;\|\; W^{(0)}\mathbf{x}_k \;\|\; \mathbf{e}_{ik} \right] \right) \right)}$$
聚合得到第一层输出:
$$\mathbf{h}_i^{(1)} = \text{ReLU}\left( \sum_{j \in \mathcal{N}(i)} \alpha_{ij}^{(0)} W^{(0)} \mathbf{x}_j \right)$$
其中 $W^{(0)} \in \mathbb{R}^{256 \times 9}$,$\mathbf{h}_i^{(1)} \in \mathbb{R}^{256}$。
对 agent $i$ 而言,$\mathcal{N}(i) = \{\text{所有任务}\} \cup \{\text{所有其他 agent}\}$,因此第一层就聚合了全部任务和全部其他 agent。
---
Step 4:第二层 GATConv(2-hop 聚合)
基于第一层输出再次计算注意力:
$$\alpha_{ij}^{(1)} = \frac{\exp\left( \text{LeakyReLU}\left( \mathbf{a}^{(1)\top} \left[ W^{(1)}\mathbf{h}_i^{(1)} \;\|\; W^{(1)}\mathbf{h}_j^{(1)} \;\|\; \mathbf{e}_{ij} \right] \right) \right)}{\sum_{k \in \mathcal{N}(i)} \exp\left( \text{LeakyReLU}\left( \mathbf{a}^{(1)\top} \left[ W^{(1)}\mathbf{h}_i^{(1)} \;\|\; W^{(1)}\mathbf{h}_k^{(1)} \;\|\; \mathbf{e}_{ik} \right] \right) \right)}$$
聚合得到第二层输出:
$$\mathbf{h}_i^{(2)} = \sum_{j \in \mathcal{N}(i)} \alpha_{ij}^{(1)} W^{(1)} \mathbf{h}_j^{(1)}$$
其中 $W^{(1)} \in \mathbb{R}^{128 \times 256}$,$\mathbf{h}_i^{(2)} \in \mathbb{R}^{128}$。
由于图是全连接的,第二层感受野覆盖全图,$\mathbf{h}_i^{(2)}$ 混合了所有 agent 和 task 的信息。
---
Step 5:全局池化
对所有节点 embedding 做平均池化:
$$\mathbf{h}_{\text{pool}} = \frac{1}{N_a+M} \sum_{i=1}^{N_a+M} \mathbf{h}_i^{(2)} \in \mathbb{R}^{128}$$
提取 agent $i$ 对应的节点 embedding:
$$\mathbf{h}_i^{(2)} \in \mathbb{R}^{128}$$
将 flatten 后的局部观测与图特征拼接(
cat 模式):
$$\mathbf{z}_i = \begin{bmatrix} \bar{o}_i \\ \mathbf{h}_i^{(2)} \\ \mathbf{h}_{\text{pool}} \end{bmatrix} \in \mathbb{R}^{223 + 128 + 128} = \mathbb{R}^{479}$$
代码实现中通常只用 agent_emb 和 global_pool,但这里把三种信息都列出。具体维度取决于 gat_mode。
---
Step 6:Actor MLP 输出 logits
根据三种
gat_mode:
6.1 gat 模式
$$\mathbf{z}_i = \mathbf{h}_i^{(2)} \in \mathbb{R}^{128}$$
$$\text{logits}_i = \text{MLP}_{\text{actor}}(\mathbf{z}_i) \in \mathbb{R}^{M}$$
6.2 cat 模式
$$\mathbf{z}_i = \begin{bmatrix} \bar{o}_i \\ \mathbf{h}_i^{(2)} \end{bmatrix} \in \mathbb{R}^{223 + 128} = \mathbb{R}^{351}$$
$$\text{logits}_i = \text{MLP}_{\text{actor}}(\mathbf{z}_i) \in \mathbb{R}^{M}$$
6.3 gated 模式
$$\mathbf{z}_i = \begin{bmatrix} \bar{o}_i \\ \tanh(\alpha) \cdot \mathbf{h}_i^{(2)} \end{bmatrix} \in \mathbb{R}^{351}$$
$$\text{logits}_i = \text{MLP}_{\text{actor}}(\mathbf{z}_i) \in \mathbb{R}^{M}$$
其中 $\alpha \in \mathbb{R}$ 是可学习门控参数。
---
Step 7:动作分布
$$\pi_i = \text{softmax}(\text{logits}_i) = \frac{\exp(\text{logits}_i)}{\sum_{m=1}^{M} \exp(\text{logits}_i[m])} \in \mathbb{R}^{M}$$
其中 $\pi_i[m]$ 表示 agent $i$ 选择任务 $m$ 的概率。
---
完整链路总结
$$
o_i \xrightarrow{\text{flatten}} \bar{o}_i \xrightarrow{\text{build nodes}} \mathbf{x} \xrightarrow{\text{GATConv}_1} \mathbf{h}^{(1)} \xrightarrow{\text{GATConv}_2} \mathbf{h}^{(2)} \xrightarrow{\text{pool}} [\mathbf{h}_i^{(2)}, \mathbf{h}_{\text{pool}}] \xrightarrow{\text{MLP}} \text{logits}_i \xrightarrow{\text{softmax}} \pi_i
$$
核心问题:$\text{logits}_i[m]$ 不是 $f(o_i, \text{Task}_m)$ 的显式函数,而是 $f(o_i, \mathbf{h}_i^{(2)}, \mathbf{h}_{\text{pool}})$ 的任意 MLP 输出。由于 $\mathbf{h}_{\text{pool}}$ 对任务排列 invariant,且 MLP 没有结构约束,Legacy GAT 不满足任务索引等变性。
---
Appendix:单个智能体更新公式(渲染版)
输入节点特征:
$$x_i \in \mathbb{R}^9$$
若 $i$ 是 agent:$x_i = [\text{position}_2, \text{capabilities}_4, \text{load\_ratio}_1, \text{type}_1, \text{active}_1]$;
若 $i$ 是 task:$x_i = [\text{position}_2, \text{requirements}_4, \text{demand}_1, \text{type}_1, \text{active}_1]$。
邻居集合(全连接):
$$\mathcal{N}(i) = \{\text{Task}_1, \dots, \text{Task}_M\} \cup \{\text{Agent}_1, \dots, \text{Agent}_{i-1}, \text{Agent}_{i+1}, \dots, \text{Agent}_{N_a}\}$$
边特征:
$$
\mathbf{e}_{ij} =
\begin{cases}
\mathbf{x}_{\tau,j} - \mathbf{x}_{a,i}, & j \in \text{Task} \quad (A \to T) \\
\mathbf{x}_{a,i} - \mathbf{x}_{\tau,j}, & j \in \text{Task} \quad (T \to A) \\
-\text{similarity}(i,j) \cdot \mathbf{1}_9, & j \in \text{Agent} \quad (A \to A)
\end{cases}
$$
$$\text{similarity}(i,j) = \frac{1}{1 + \frac{1}{9}\sum_{d=1}^{9} |\mathbf{x}_{a,j}^{(d)} - \mathbf{x}_{a,i}^{(d)}|}$$
第一层注意力:
$$\alpha_{ij}^{(0)} = \text{softmax}_j \left( \text{LeakyReLU}\left( \mathbf{a}^{(0)\top} \left[ W^{(0)}\mathbf{x}_i \;\|\; W^{(0)}\mathbf{x}_j \;\|\; \mathbf{e}_{ij} \right] \right) \right)$$
第一层输出:
$$\mathbf{h}_i^{(1)} = \text{ReLU}\left( \sum_{j \in \mathcal{N}(i)} \alpha_{ij}^{(0)} W^{(0)} \mathbf{x}_j \right), \quad W^{(0)} \in \mathbb{R}^{256 \times 9}, \; \mathbf{h}_i^{(1)} \in \mathbb{R}^{256}$$
第二层注意力:
$$\alpha_{ij}^{(1)} = \text{softmax}_j \left( \text{LeakyReLU}\left( \mathbf{a}^{(1)\top} \left[ W^{(1)}\mathbf{h}_i^{(1)} \;\|\; W^{(1)}\mathbf{h}_j^{(1)} \;\|\; \mathbf{e}_{ij} \right] \right) \right)$$
第二层输出:
$$\mathbf{h}_i^{(2)} = \sum_{j \in \mathcal{N}(i)} \alpha_{ij}^{(1)} W^{(1)} \mathbf{h}_j^{(1)}, \quad W^{(1)} \in \mathbb{R}^{128 \times 256}, \; \mathbf{h}_i^{(2)} \in \mathbb{R}^{128}$$
全局池化:
$$\mathbf{h}_{\text{pool}} = \frac{1}{N_a + M} \sum_{k=1}^{N_a+M} \mathbf{h}_k^{(2)}$$
Actor 输入(cat 模式):
$$\mathbf{z}_i = \begin{bmatrix} \bar{o}_i \\ \mathbf{h}_i^{(2)} \end{bmatrix} \in \mathbb{R}^{351}$$
logits:
$$\text{logits}_i = \text{MLP}_{\text{actor}}(\mathbf{z}_i) \in \mathbb{R}^{M}$$
动作分布:
$$\pi_i = \text{softmax}(\text{logits}_i) \in \mathbb{R}^{M}$$