--- ## 该部分主要内容概述 在这部分(论文 2.1 节 “Graph Attentional Layer”)中,作者提出了图注意力网络(GAT)中最核心的运算:**图注意力层**。它的基本思想是: 1. **线性变换**:先对每个节点的特征 $\mathbf{h}_i$ 乘上一个可学习的权重矩阵 $W$,得到变换后的特征 $W \mathbf{h}_i$。 2. **自注意力机制**:通过一个可学习的函数 $a$,对节点 $i$ 和其邻居节点 $j$ 的特征进行计算,得到注意力系数 $e_{ij}$。这里会对邻居进行遮蔽(masked attention),即只计算图中有边连接的节点对。 3. **归一化**:将注意力系数 $e_{ij}$ 通过 softmax 进行归一化,得到 $\alpha_{ij}$,表示节点 $j$ 对节点 $i$ 的重要性权重。 4. **聚合**:最后利用注意力系数加权邻居节点的特征向量,并经过激活函数得到新的节点表示 $\mathbf{h}_i'$。 5. **多头注意力**:为增强表示能力,可并行地执行多个独立的注意力头(multi-head attention),再将它们的结果进行拼接(或在最后一层进行平均),从而得到最终的节点表示。 该部分给出的公式主要包括注意力系数的计算、softmax 归一化、多头注意力的聚合方式等,下面逐一用 Markdown 数学公式的形式列出。 --- ## 公式列表(Markdown 格式) > **注意**:以下公式与论文中编号对应(如 (1)、(2)、(3)、(4)、(5)、(6) 等)。 1. **注意力系数(未归一化)** $$ e_{ij} = a\bigl(W\mathbf{h}_i,\; W\mathbf{h}_j\bigr) $$ 2. **注意力系数的 softmax 归一化** $$ \alpha_{ij} = \text{softmax}_j\bigl(e_{ij}\bigr) = \frac{\exp\bigl(e_{ij}\bigr)}{\sum_{k \in \mathcal{N}_i} \exp\bigl(e_{ik}\bigr)} $$ ​ $\alpha_{ij}$表示节点 $i$ 对节点 $j$ 的注意力权重 3. **具体的注意力计算形式(以单层前馈网络 + LeakyReLU 为例)** $$ \alpha_{ij} = \frac{\exp\Bigl(\text{LeakyReLU}\bigl(\mathbf{a}^\top \bigl[\;W\mathbf{h}_i \,\|\, W\mathbf{h}_j\bigr]\bigr)\Bigr)} {\sum_{k\in \mathcal{N}_i} \exp\Bigl(\text{LeakyReLU}\bigl(\mathbf{a}^\top \bigl[\;W\mathbf{h}_i \,\|\, W\mathbf{h}_k\bigr]\bigr)\Bigr)} $$ 其中,$\mathbf{a}$ 为可学习的参数向量,$\|$ 表示向量拼接(concatenation)。 4. **单头注意力聚合(得到新的节点特征)** $$ \mathbf{h}_i' = \sigma\Bigl(\sum_{j \in \mathcal{N}_i} \alpha_{ij} \,W \mathbf{h}_j\Bigr) $$ 其中,$\sigma$ 表示非线性激活函数(如 ELU、ReLU 等),$\mathcal{N}_i$ 表示节点 $i$ 的邻居节点集合(可包含 $i$ 自身)。 5. **多头注意力(隐藏层时拼接)** 如果有 $K$ 个独立的注意力头,每个头输出 $\mathbf{h}_i'^{(k)}$,则拼接后的输出为: $$ \mathbf{h}_i' = \big\Vert_{k=1}^K \sigma\Bigl(\sum_{j \in \mathcal{N}_i} \alpha_{ij}^{(k)} \, W^{(k)} \mathbf{h}_j\Bigr) $$ 其中,$\big\Vert$ 表示向量拼接操作,$\alpha_{ij}^{(k)}$、$W^{(k)}$ 分别为第 $k$ 个注意力头对应的注意力系数和线性变换。 6. **多头注意力(输出层时平均)** 在最终的输出层(例如分类层)通常会将多个头的结果做平均,而不是拼接: $$ \mathbf{h}_i' = \sigma\Bigl( \frac{1}{K} \sum_{k=1}^K \sum_{j \in \mathcal{N}_i} \alpha_{ij}^{(k)} \, W^{(k)} \mathbf{h}_j \Bigr) $$ --- 以上即是论文中 2.1 节(Graph Attentional Layer)出现的主要公式及其简要说明。 ### 2. **GAT 的聚合方式** - **GAT** 使用了一种**自适应的、可学习的注意力机制**来聚合节点及其邻居的信息。 - 具体来说,GAT 的聚合公式为: $$ h_i^{(l+1)} = \sigma\left(\sum_{j \in \mathcal{N}(i) \cup \{i\}} \alpha_{ij} W h_j^{(l)}\right) $$ 其中: - $\alpha_{ij}$ 是节点 $i$ 和节点 $j$ 之间的**注意力系数**,通过以下方式计算: $$ \alpha_{ij} = \frac{\exp(\text{LeakyReLU}(a^T [W h_i \| W h_j]))}{\sum_{k \in \mathcal{N}(i) \cup \{i\}} \exp(\text{LeakyReLU}(a^T [W h_i \| W h_k]))} $$ - $a$ 是一个可学习的注意力向量。 - $\|$ 表示特征拼接操作。 - $W$ 是可学习的权重矩阵。 - $\sigma$ 是非线性激活函数。 - **特点**: - GAT 的聚合权重是**动态的**,通过注意力机制学习得到。 - 权重是非对称的,且可以捕捉节点之间的复杂关系。 - 相当于对节点及其邻居进行了一种**加权信息传递**,权重由数据驱动。 --- ### 3. **GCN 和 GAT 的对比** | 特性 | GCN | GAT | | ------------------ | ------------------------ | -------------------------- | | **聚合方式** | 固定的加权平均 | 自适应的注意力加权 | | **权重是否可学习** | 否(权重由节点度数决定) | 是(通过注意力机制学习) | | **权重是否对称** | 是 | 否 | | **表达能力** | 较弱(固定的聚合方式) | 较强(动态的聚合方式) | | **计算复杂度** | 较低 | 较高(需要计算注意力系数) | | **适用场景** | 简单的图结构任务 | 复杂的图结构任务 | --- ### 4. **直观理解** - **GCN**: - 类似于对邻居节点进行“民主投票”,每个邻居的权重是固定的(由度数决定)。 - 适合处理节点度数分布均匀、关系相对简单的图。 - **GAT**: - 类似于对邻居节点进行“加权投票”,每个邻居的权重是动态学习的。 - 适合处理节点度数分布不均匀、关系复杂的图。 --- ### 5. **总结** - **GCN** 使用的是**固定的、归一化的加权平均**,权重由节点度数决定。 - **GAT** 使用的是**自适应的、可学习的注意力权重**,权重通过数据驱动的方式学习得到。 - GAT 的表达能力更强,但计算复杂度也更高;GCN 更简单高效,但表达能力相对较弱。 希望这个解释能帮助你更好地理解 GCN 和 GAT 的区别!如果还有疑问,欢迎继续讨论! 3blue1brown 的讲解试图让我们从几何和线性映射的角度来理解点乘,而不仅仅是将它看作一系列数的乘加运算。下面详细说明这一点。 假设有两个向量 $$ \mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} w_1 \\ w_2 \end{bmatrix}. $$ 传统上,点乘定义为 $$ \mathbf{v} \cdot \mathbf{w} = v_1w_1 + v_2w_2. $$ 3blue1brown 的观点是: - **将一个向量视为线性变换** 我们可以把 $\mathbf{v}$ 当作一个线性映射,它把任何向量 $\mathbf{w}$ 映射为一个实数,即 $$ T_{\mathbf{v}}(\mathbf{w}) = \mathbf{v}\cdot \mathbf{w}. $$ 这个映射 $T_{\mathbf{v}}$ 是一个**线性泛函**,它具有线性性: $$ T_{\mathbf{v}}(a\mathbf{w}_1 + b\mathbf{w}_2) = aT_{\mathbf{v}}(\mathbf{w}_1) + bT_{\mathbf{v}}(\mathbf{w}_2). $$ 换句话说,$\mathbf{v}$ 变成了一个“工具”,通过这个工具我们可以“测量”任一向量在 $\mathbf{v}$ 方向上的分量大小。 - **几何直观** 如果我们记 $\theta$ 为 $\mathbf{v}$ 和 $\mathbf{w}$ 之间的夹角,则点乘也可以写作 $$ \mathbf{v} \cdot \mathbf{w} = \|\mathbf{v}\|\|\mathbf{w}\|\cos\theta. $$ 这里,$\|\mathbf{w}\|\cos\theta$ 就是 $\mathbf{w}$ 在 $\mathbf{v}$ 方向上的投影长度。当我们用 $\|\mathbf{v}\|$ 乘上这个投影长度时,就得到了一个度量,这个度量告诉我们 $\mathbf{w}$ 在 $\mathbf{v}$ 方向上“有多大”的贡献。 - **矩阵乘法的视角** 我们也可以把点乘看作行向量和列向量的矩阵乘法: $$ \mathbf{v}\cdot \mathbf{w} = \begin{bmatrix} v_1 & v_2 \end{bmatrix}\begin{bmatrix} w_1 \\ w_2 \end{bmatrix}. $$ 在这个表达式中,$\begin{bmatrix} v_1 & v_2 \end{bmatrix}$ 就相当于一个将二维向量映射到实数的线性变换,也正是我们上面定义的 $T_{\mathbf{v}}(\cdot)$。 总结来说,3blue1brown 强调的点乘本质是: - 把固定的向量 $\mathbf{v}$ 转换成一个线性映射(或线性泛函),这个映射作用在任意向量 $\mathbf{w}$ 上,返回一个标量; - 这个标量不仅包含了 $\mathbf{w}$ 在 $\mathbf{v}$ 方向上的“投影”信息,而且反映了两者之间的对齐程度(通过余弦函数体现); - 因此,点乘不仅仅是数值运算,而是一个把向量转换成测量工具,从而揭示向量间角度和方向关系的过程。