GCN隐藏状态的更新公式
H t + 1 = σ ( D ^ − 1 2 A ˜ D ^ − 1 2 H t W t ) H^{t+1}=\sigma(\hat{D}^{-\frac{1}{2}}\~{A}\hat{D}^{-\frac{1}{2}}H^tW^t) Ht+1=σ(D^−21A˜D^−21HtWt)
- H t H^t Ht 表示第 t t t 个隐藏状态,其实也就是第 t t t 步得到的节点特征, H t ∈ R N × D H^t \in R^{N \times D} Ht∈RN×D, N N N 为顶点个数, D D D 为节点的特征维度
- D ^ \hat{D} D^ 表示顶点的度矩阵, D ^ ∈ R N × N \hat{D} \in R^{N \times N} D^∈RN×N,是一个对角矩阵
- A ˜ \~{A} A˜ 表示添加自环后的邻接矩阵, A ˜ = A + I \~{A}=A+I A˜=A+I
- W W W 表示第 t t t 步时的权重矩阵,相当于一个线性层
- σ \sigma σ 表示激活函数
理解
- GCN更新隐藏状态的公式本质上是一个归一化后的加权聚合过程
- 假如将图中顶点一视同仁,也就是认为它们重要性相同,那么我们便可以将隐藏状态的更新公式简化为 H t + 1 = σ ( A ˜ H t W t ) H^{t+1}=\sigma(\~{A}H^tW^t) Ht+1=σ(A˜HtWt)
- 更进一步来说,假如我们只考虑邻居节点之间的聚合,那么公式还可以简化为
H
t
+
1
=
A
˜
H
t
H^{t+1}=\~{A}H^t
Ht+1=A˜Ht
- 我们可以举一个例子看看,假设现在有一个包含了三个顶点,两条边的有向无环图,它的邻接矩阵
A
A
A为
[
0
1
0
0
0
1
0
0
0
]
\begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \\ \end{bmatrix}
000100010
其实这个拓扑图可视化出来就是
- 假设我们要对2号顶点做邻域聚合,那么就应当聚合2号顶点本身和3号顶点的特征,我们套入公式 H i t + 1 = ∑ j A i H j t H^{t+1}_i=\sum_j{A_iH^t_j} Hit+1=∑jAiHjt,此时会发现,假如说我们不对邻接矩阵添加自环,那么做邻域聚合时便不会包含自身那个顶点的特征,例如在本例中,2号顶点的特征会被排除在外。因此,对节点添加自环是必要的。
- 上一步只考虑了2号顶点的聚合,如果考虑全部顶点,那么直接使用 H t + 1 = A ˜ H t H^{t+1}=\~{A}H^t Ht+1=A˜Ht即可,没想清楚的话可以自行举一个例子进行计算。
- 我们可以举一个例子看看,假设现在有一个包含了三个顶点,两条边的有向无环图,它的邻接矩阵
A
A
A为
[
0
1
0
0
0
1
0
0
0
]
\begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \\ \end{bmatrix}
000100010
- 接着回来考虑公式 H t + 1 = σ ( A ˜ H t W t ) H^{t+1}=\sigma(\~{A}H^tW^t) Ht+1=σ(A˜HtWt),前文提到,这是不考虑节点重要性时的隐藏状态更新公式,这个公式在上一个聚合公式 H t + 1 = A ˜ H t H^{t+1}=\~{A}H^t Ht+1=A˜Ht 的基础上添加了一个权重矩阵 W t W^t Wt 和一个激活函数 σ \sigma σ,实际上与感知器中的公式没有什么差异,假如说我们令 X t = A ˜ H t X^t=\~{A}H^t Xt=A˜Ht,那么就有 y t = H t + 1 = σ ( X t W t ) y^t=H^{t+1}=\sigma(X^tW^t) yt=Ht+1=σ(XtWt),这与添加了激活函数的线性回归公式的形式基本一致。
- 至此,我们已经清楚了不考虑节点之间的差异性时,GCN公式是怎么运作的,但是一个拓扑图中的各个节点重要性当然是不相同的。按照GCN的做法来说,它是认为一个节点的重要性与它的邻居数量成正比的,因此,GCN最终的公式是对添加自环的邻接矩阵
A
˜
\~A
A˜ 使用
D
^
−
1
2
A
˜
D
^
−
1
2
\hat{D}^{-\frac{1}{2}}\~{A}\hat{D}^{-\frac{1}{2}}
D^−21A˜D^−21进行了处理。
- 至于为什么对 A ˜ \~{A} A˜ 左右分别乘上度矩阵即可体现节点重要性,其实明白了一个道理即可,当对一个方阵左乘上一个对角阵时,就相当于对方阵的每一行都进行了扩大,而右乘一个对角阵时,则相当于对方阵的每一列进行了扩大,具体什么意思可以看下面的计算实例。
- 经过度矩阵加权后的邻接矩阵,它的每个节点对应的每条边都会有一个权值,此时使用这个矩阵替代原来的邻接矩阵进行邻域聚合即可。