8.4 KiB
在这部分(论文 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 数学公式的形式列出。
\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) 等)。
- 注意力系数(未归一化)
e_{ij} = a\bigl(W\mathbf{h}_i,\; W\mathbf{h}_j\bigr)
- 注意力系数的 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
的注意力权重
- 具体的注意力计算形式(以单层前馈网络 + 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)。
- 单头注意力聚合(得到新的节点特征)
\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
自身)。
- 多头注意力(隐藏层时拼接)
如果有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
个注意力头对应的注意力系数和线性变换。
- 多头注意力(输出层时平均)
在最终的输出层(例如分类层)通常会将多个头的结果做平均,而不是拼接:
\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}
方向上的“投影”信息,而且反映了两者之间的对齐程度(通过余弦函数体现); - 因此,点乘不仅仅是数值运算,而是一个把向量转换成测量工具,从而揭示向量间角度和方向关系的过程。