GCN 问题与解答

前言

最近尝试理解 GCN 的数学原理, 阅读了许多优秀的资料, 可以参阅 “参考资料” 这一节. 这些资料详细介绍了 GCN 的来龙去脉, 我尤其推荐 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导 以及 Graph Convolutional Networks 这两篇博客. 将它们细细看完受益良多, 然而信息输入后还需提炼加工才能转化为自身的养料, 因此本博客以问答的形式将我关心的内容总结出来, 以巩固学习的效果.

广而告之

可以在微信中搜索 “珍妮的算法之路” 或者 “world4458” 关注我的微信公众号;另外可以看看知乎专栏 PoorMemory-机器学习, 以后文章也会发在知乎专栏中;

为什么传统的卷积方式无法用在 Graph 结构上?

因为传统卷积主要处理的是 Euclidean Structure 的数据, 这类数据排列整齐 (如图像和文本), 能够保持卷积的平移不变性; 而 Graph 结构数据 Non-Euclidean Structure, 每个节点的邻居节点数量可能各不相同, 无法用同一尺寸的卷积核进行处理.

GCN 为什么要采用拉普拉斯矩阵 (Laplacian Matrix)?

参考资料:

http://xtf615.com/2019/02/24/gcn/

图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导

如何理解 Graph Convolutional Network(GCN)? 中的

  • 如何理解 Graph Convolutional Network(GCN)? - Johnny Richards的回答 - 知乎 https://www.zhihu.com/question/54504471/answer/630639025
  • 如何理解 Graph Convolutional Network(GCN)? - superbrother的回答 - 知乎 https://www.zhihu.com/question/54504471/answer/332657604

拉普拉斯矩阵与拉普拉斯算子的关系

看了很多资料, 我个人总结如下:

传统 Fourier 变换的基为 e − j ω x e^{-j\omega x} ejωx, 正好是拉普拉斯算子 Δ \Delta Δ 的特征函数, 因为:
Δ e − j ω x = ω 2 e − j ω x \Delta e^{-j\omega x} = \omega^2 e^{-j\omega x} Δejωx=ω2ejωx 那么对于图 Fourier 卷积, 由此联想, 由于拉普拉斯矩阵 L L L 与拉普拉斯算子 Δ \Delta Δ 之间存在密切联系 ( L L L 矩阵作用相当于 Δ \Delta Δ 算子), 那么 L L L 矩阵的特征向量是不是就可以作为图 Fourier 变换的基呢? 答案是可以的, 因为 L L L 是半正定的实对称矩阵(无向图), 故存在 n 个相互正交的特征向量, 这 n 个特征向量可以张成整个线性空间.

图卷积公式 ?

来自 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导

  • f f f 为 Graph 上的 N N N 维向量, 可以表示某个节点的特征, 其中 f ( i ) f(i) f(i) 表示第 i i i 维特征;
  • λ l \lambda_l λl u l u_l ul 分别为拉普拉斯矩阵 L L L 的第 l l l 个特征值和特征向量;
  • f ^ \hat{f} f^ 表示 f f f 的傅里叶变换;

那么 f f f 的 Graph 傅里叶变换为:
F ( λ l ) = f ^ ( λ l ) = ∑ i = 1 N f ( i ) u l ( i ) F(\lambda_l) = \hat{f}(\lambda_l) = \sum_{i = 1}^{N}f(i)u_l(i) F(λl)=f^(λl)=i=1Nf(i)ul(i) 推广到矩阵形式:
( f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ N ) ) = ( u 1 ( 1 ) u 1 ( 2 ) … u 1 ( N ) u 2 ( 1 ) u 2 ( 2 ) ⋯ u 2 ( N ) ⋮ ⋮ ⋱ ⋮ u N ( 1 ) u N ( 2 ) ⋯ u N ( N ) ) ( f ( 1 ) f ( 2 ) ⋮ f ( N ) ) \left(\begin{array}{c}{\hat{f}\left(\lambda_{1}\right)} \\ {\hat{f}\left(\lambda_{2}\right)} \\ {\vdots} \\ {\hat{f}\left(\lambda_{N}\right)}\end{array}\right)=\left(\begin{array}{cccc}{u_{1}(1)} & {u_{1}(2)} & {\ldots} & {u_{1}(N)} \\ {u_{2}(1)} & {u_{2}(2)} & {\cdots} & {u_{2}(N)} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {u_{N}(1)} & {u_{N}(2)} & {\cdots} & {u_{N}(N)}\end{array}\right)\left(\begin{array}{c}{f(1)} \\ {f(2)} \\ {\vdots} \\ {f(N)}\end{array}\right) f^(λ1)f^(λ2)f^(λN)=u1(1)u2(1)uN(1)u1(2)u2(2)uN(2)u1(N)u2(N)uN(N)f(1)f(2)f(N)
f f f 在 Graph 上的傅里叶变换的矩阵形式为:
f ^ = U T f \hat{f} = U^T f f^=UTf 另外可以得到傅里叶逆变换:
f ( i ) = ∑ l = 1 N f ^ ( λ l ) u l ( i ) f(i) = \sum_{l = 1}^{N}\hat{f}(\lambda_l)u_l(i) f(i)=l=1Nf^(λl)ul(i) 将其推广为矩阵形式如下:
( f ( 1 ) f ( 2 ) ⋮ f ( N ) ) = ( u 1 ( 1 ) u 2 ( 1 ) … u N ( 1 ) u 1 ( 2 ) u 1 ( 2 ) … u N ( 2 ) ⋮ ⋮ ⋱ ⋮ u 1 ( N ) u 2 ( N ) … u N ( N ) ) ( f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ N ) ) \left(\begin{array}{c}{f(1)} \\ {f(2)} \\ {\vdots} \\ {f(N)}\end{array}\right)=\left(\begin{array}{cccc}{u_{1}(1)} & {u_{2}(1)} & {\ldots} & {u_{N}(1)} \\ {u_{1}(2)} & {u_{1}(2)} & {\ldots} & {u_{N}(2)} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {u_{1}(N)} & {u_{2}(N)} & {\ldots} & {u_{N}(N)}\end{array}\right)\left(\begin{array}{c}{\hat{f}\left(\lambda_{1}\right)} \\ {\hat{f}\left(\lambda_{2}\right)} \\ {\vdots} \\ {\hat{f}\left(\lambda_{N}\right)}\end{array}\right) f(1)f(2)f(N)=u1(1)u1(2)u1(N)u2(1)u1(2)u2(N)uN(1)uN(2)uN(N)f^(λ1)f^(λ2)f^(λN) f f f 在 Graph 上的傅里叶逆变换的矩阵形式为:
f = U f ^ f = U\hat{f} f=Uf^ Graph 上的傅里叶变换推广到图卷积

g g g 为卷积核, 根据卷积定理, 有:
f ⊗ g = F − 1 { F ( f ) ⋅ F ( g ) } = F − 1 { f ^ ⋅ g ^ } f \otimes g = \mathcal{F}^{-1}\{\mathcal{F}(f)\cdot\mathcal{F}(g)\} = \mathcal{F}^{-1}\{\hat{f}\cdot\hat{g}\} fg=F1{F(f)F(g)}=F1{f^g^} 因此对 Graph 上的特征 f f f 和卷积核 g g g 的卷积可以表示为:
( f ⊗ g ) G = U ( ( U T g ) ⋅ ( U T f ) ) = U ( ( U T g ) ⊙ ( U T f ) ) (f \otimes g)_G = U\left(\left(U^T g\right)\cdot\left(U^T f\right)\right) = U\left(\left(U^T g\right)\odot\left(U^T f\right)\right) (fg)G=U((UTg)(UTf))=U((UTg)(UTf)) ⊙ \odot 表示hadamard product (哈达马积). 对于两个向量, 就是进行内积运算; 对于维度相同的两个矩阵, 就是对应元素的乘积运算. 如果把 U T g U^Tg UTg 整体看作可学习的卷积核,这里我们把它写作 g θ g_\theta gθ, 最终图上的卷积公式即是:
( f ⊗ g ) G = U g θ U T f (f\otimes g)_G = Ug_\theta U^Tf (fg)G=UgθUTf 有的地方, 还把 g θ = U T g g_\theta = U^T g gθ=UTg 写成对角矩阵的形式, 即定义 g θ = d i a g ( U T g ) g_\theta = diag(U^Tg) gθ=diag(UTg), 则:
f ∗ g θ = U g θ U T f = U ( g ^ ( λ 1 ) ⋱ g ^ ( λ n ) ) U T f f * g_{\theta}=U g_{\theta} U^{T} f=U\left(\begin{array}{ccc}{\hat{g}\left(\lambda_{1}\right)} & {} & {} \\ {} & {\ddots} & {} \\ {} & {} & {\hat{g}\left(\lambda_{n}\right)}\end{array}\right) U^{T} f fgθ=UgθUTf=Ug^(λ1)g^(λn)UTf 很多算法都是在 g θ g_\theta gθ 的基础上做文章.

离散傅里叶变换 (Discrete Fourier transform, DFT) 公式 ?

信号 x n x_n xn 的 DFT 为:
X k = ∑ n = 0 n = N − 1 x n e − j 2 π N k n X_k = \sum_{n = 0}^{n = N - 1}x_ne^{-j\frac{2\pi}{N}kn} Xk=n=0n=N1xnejN2πkn 其逆变换 IDFT 为:
x n = ∑ k = 0 k = N − 1 X k e j 2 π N k n x_n = \sum_{k = 0}^{k = N - 1}X_ke^{j\frac{2\pi}{N}kn} xn=k=0k=N1XkejN2πkn

什么是离散卷积? CNN 中的离散卷积有什么作用?

离散卷积本质上是一种加权求和. CNN 中的卷积本质上是利用共享参数的滤波器/卷积核 (kernel), 通过计算中心像素点和相邻像素点的加权和来构成 feature map 实现空间特征提取. 需要注意的是, 卷积核的参数需要优化才能实现特征提取的作用, GCN 理论很大一部分工作就是为了引入可以优化的卷积参数

矩阵的 k k k 次方有什么特点?

来自 http://xtf615.com/2019/02/24/gcn/

矩阵的 k k k 次方可以用于求连通性,即1个节点经过 k k k 步能否到达另一个顶点,矩阵 k k k 次方结果中对应元素非 0 的话可达,为 0 则不可达。因此 L L L 矩阵的 k k k 次方的含义就是代表 k k k-hop 之内的节点

无向图拉普拉斯矩阵 L L L 有什么特点?

来自 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导

  1. 拉普拉斯矩阵 L L L 是半正定矩阵, 实对称矩阵以及含有 n 个互不相关的特征向量. (半正定矩阵最小的特征值 ≥ 0 \geq 0 0)

  2. 特征值中0出现的次数就是图连通区域的个数

  3. 最小特征值是0,因为拉普拉斯矩阵(普通形式: L = D − A L=D−A L=DA)每一行的和均为0,并且最小特征值对应的特征向量是每个值全为 1 的向量, 因为:
    L [ 1 1 ⋮ 1 ] = 0 L \left[\begin{matrix}1 \\ 1 \\\vdots \\ 1\end{matrix}\right] = \mathbf{0} L111=0

  4. 最小非零特征值是图的代数连通度

矩阵相乘时间复杂度 ?

(这里我没有完全想清楚, 不要相信下面的 bu****it)

设矩阵 A ∈ R m × k , B ∈ R k × n A\in\mathbb{R}^{m\times k}, B\in\mathbb{R}^{k\times n} ARm×k,BRk×n, 矩阵乘法 A ∗ B A*B AB 的时间复杂度是多少? 答案是 O ( m ⋅ k ⋅ n ) \mathcal{O}(m\cdot k\cdot n) O(mkn).

因为 A ∗ B ∈ R m × n A*B\in\mathbb{R}^{m\times n} ABRm×n, 总共有 m × n m\times n m×n 个元素, 而每个元素是由 A A A 中的每一行与 B B B 中每一列的乘积, 需要进行 k k k 次乘法和 k − 1 k - 1 k1 次加法, 这个过程需要执行 m × n m\times n m×n 次, 因此时间复杂度为 O ( m ⋅ k ⋅ n ) \mathcal{O}(m\cdot k\cdot n) O(mkn).

GCN 的论文 中, 作者谈到公式:
Z = D ~ − 1 2 A ~ D ~ − 1 2 X Θ Z = \tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}X\Theta Z=D~21A~D~21XΘ 的时间复杂度为 O ( ∣ E ∣ C F ) \mathcal{O}(|\mathcal{E}|CF) O(ECF), 其中 D ~ − 1 2 A ~ D ~ − 1 2 ∈ R N × N , X ∈ R N × C , Θ ∈ R C × F \tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}\in\mathbb{R}^{N\times N}, X\in\mathbb{R}^{N\times C},\Theta\in\mathbb{R}^{C\times F} D~21A~D~21RN×N,XRN×C,ΘRC×F.

实际上, 在具体代码实现中, D ~ − 1 2 A ~ D ~ − 1 2 \tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}} D~21A~D~21 使用稀疏矩阵的形式来表示, 在整个矩阵中存在数值的位置只有 ∣ E ∣ |\mathcal{E}| E 个.

那么稀疏矩阵 D ~ − 1 2 A ~ D ~ − 1 2 \tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}} D~21A~D~21 X X X 的乘积可以高效实现. 上式的时间复杂度为 O ( ∣ E ∣ C F ) \mathcal{O}(|\mathcal{E}|CF) O(ECF).

在第二代 GCN 中, 卷积核如何体现 spatial localization ?

前面说过, 对于 Graph 上的特征 f f f 和卷积核 g g g 的卷积可以写成:
( f ⊗ g ) G = U g ( Λ ) U T f (f \otimes g)_G = Ug(\Lambda)U^T f (fg)G=Ug(Λ)UTf 其中 g ( Λ ) = d i a g [ g ^ ( λ 1 ) , g ^ ( λ 2 ) , … , g ^ ( λ n ) ] g(\Lambda) = diag[\hat{g}(\lambda_1), \hat{g}(\lambda_2), \ldots, \hat{g}(\lambda_n)] g(Λ)=diag[g^(λ1),g^(λ2),,g^(λn)], 其中 Λ \Lambda Λ 为对角阵, 对角线上的元素 λ 1 , … , λ n \lambda_1, \ldots, \lambda_n λ1,,λn 为拉普拉斯矩阵 L L L 的特征值.

首先看看第一代 GCN 的设计, 其将 g ^ \hat{g} g^ 直接作为参数进行学习, 即令 g ^ → θ \hat{g}\rightarrow\theta g^θ, 此时令 g θ = d i a g [ θ 1 , θ 2 , … , θ n ] g_\theta = diag[\theta_1, \theta_2, \ldots, \theta_n] gθ=diag[θ1,θ2,,θn], 那么卷积的结果为:
( f ⊗ g ) G = U g θ U T f (f \otimes g)_G = Ug_\theta U^T f (fg)G=UgθUTf 这就有以下的问题:

  1. 参数数量多, 总共有 n n n 个参数, 和图中的节点数量一致; 当图很大的时候, 参数也非常多.
  2. 计算复杂度高: 首先要得到 U U U, 就需要对拉普拉斯矩阵 L L L 进行特征分解(Eigen Decomposition, 又称谱分解, Spectral Decomposition); 其次还要做 U g θ U T Ug_\theta U^T UgθUT 矩阵乘法, 而且是在每次前向传播时都要进行.
  3. 不能体现 Spatial Localization: 因为每个节点在更新特征的时候, 需要用上其他所有节点的特征, 而不单单是邻居节点的特征 (这一点在后面介绍邻接矩阵和输入特征相乘时更能体会)

基于以上问题, 第二代 GCN 给出的解决办法是, 将卷积核 g ( Λ ) g(\Lambda) g(Λ) 设计成如下 k k k 阶多项式的形式:
g ( Λ ) = g θ ( Λ ) ≈ ∑ k = 1 K θ k Λ k g(\Lambda) = g_\theta(\Lambda) \approx\sum_{k = 1}^{K}\theta_k\Lambda^k g(Λ)=gθ(Λ)k=1KθkΛk 注意 Λ \Lambda Λ 为拉普拉斯矩阵特征值组成的对角阵, 另外参数 θ \theta θ 的个数只有 K K K 个. 将这个卷积核代入到卷积公式中, 可以得到:
( f ⊗ g ) G = U g θ U T f = U ∑ k = 1 K θ k Λ k U T f = ∑ k = 1 K θ k U Λ k U T f = ∑ k = 1 K θ k ( U Λ U T ) k f = ∑ k = 1 K θ k L k f \begin{aligned} (f \otimes g)_G &= Ug_\theta U^T f \\ &= U\sum_{k = 1}^{K}\theta_k\Lambda^k U^T f \\ &= \sum_{k = 1}^{K}\theta_kU\Lambda^k U^T f \\ &= \sum_{k = 1}^{K}\theta_k\left(U\Lambda U^T\right)^k f \\ &= \sum_{k = 1}^{K}\theta_kL^k f \\ \end{aligned} (fg)G=UgθUTf=Uk=1KθkΛkUTf=k=1KθkUΛkUTf=k=1Kθk(UΛUT)kf=k=1KθkLkf 可以看到, 结果中出现 L k L^k Lk, 即拉普拉斯矩阵的 k k k 次方. 这就是说, 第二代 GCN 无需像第一代 GCN 那样需要先进行特征分解了. 那么这个结果如何体现 Spatial Localization 呢? 第一点需要明确的是, L ⋅ f L\cdot f Lf 的每一行输出结果中, 节点特征中只包含 1-hop 邻居节点的特征, 比如假设 L L L 第一行为 [ 2 , 0 , 1 , 0 , 1 ] [2, 0, 1, 0, 1] [2,0,1,0,1], 即总共有 5 个节点, 那么 f f f 可能为:
f = [ a b c d e f g h i j k l m n o ] f = \left[ \begin{matrix} a & b & c \\ d & e & f \\ g & h & i \\ j & k & l \\ m & n & o \end{matrix} \right] f=adgjmbehkncfilo L ⋅ f L\cdot f Lf 的结果为:
[ 2 ∗ a + 1 ∗ g + 1 ∗ m , 2 ∗ b + 1 ∗ h + 1 ∗ n , 2 ∗ c + 1 ∗ i + 1 ∗ o ] [2*a + 1*g + 1*m, 2*b + 1*h + 1*n, 2*c + 1*i + 1*o] [2a+1g+1m,2b+1h+1n,2c+1i+1o] 设 5 个节点分别为 n i , i = 1 , … , 5 n_i, i = 1, \ldots, 5 ni,i=1,,5, 另外设 n i ( j ) n_i(j) ni(j) 表示第 i i i 个节点的第 j j j 个特征. 可以看到:
n 1 ′ ( 1 ) = 2 ∗ n 1 ( 1 ) + 1 ∗ n 3 ( 1 ) + 1 ∗ n 5 ( 1 ) n 1 ′ ( 2 ) = 2 ∗ n 1 ( 2 ) + 1 ∗ n 3 ( 2 ) + 1 ∗ n 5 ( 2 ) n 1 ′ ( 3 ) = 2 ∗ n 1 ( 3 ) + 1 ∗ n 3 ( 3 ) + 1 ∗ n 5 ( 3 ) n^\prime_1(1) = 2*n_1(1) + 1 * n_3(1) + 1 * n_5(1) \\ n^\prime_1(2) = 2*n_1(2) + 1 * n_3(2) + 1 * n_5(2) \\ n^\prime_1(3) = 2*n_1(3) + 1 * n_3(3) + 1 * n_5(3) \\ n1(1)=2n1(1)+1n3(1)+1n5(1)n1(2)=2n1(2)+1n3(2)+1n5(2)n1(3)=2n1(3)+1n3(3)+1n5(3) L L L 上可以看出结果不为 0 的位置说明两个节点是有边相连的, 即互为邻居. 上面的公式表明, L ⋅ f L\cdot f Lf 中每个节点特征的更新会用到 1-hop 邻居的特征. 那么同理, L 2 ⋅ f L^2\cdot f L2f 的结果中, 每个节点特征的更新, 不止会用到 1-hop 邻居的特征, 还会用到邻居节点的邻居节点的特征, 即 2-hop 的特征, 因为:

# 假设一张包含三个节点的简单图
node1 <- node2 <- node3

对于 node2 来说, L ⋅ f L\cdot f Lf 已经让它获取了 node3 的信息, 那么再进行 L ⋅ ( L ⋅ f ) L\cdot(L\cdot f) L(Lf), 就能让 node1 获取更新后的 node2 的信息, 而此时 node2 中的信息包含了 node3 中的信息, 最终的效果就是 node1 也包含了 node3 的信息. 哈哈哈…呵~

那么 L k ⋅ f L^k\cdot f Lkf 相当于只会利用到 k k k-hop 邻居的信息, 不需要用到全部节点的信息, 这体现了 Spatial Localization. 另一方面, 注意到 θ k \theta_k θk 这个参数是随着 k k k 变化的, 也就是说, 同阶的邻居同享同一个参数, 而不同阶的邻居参数不共享.

继续介绍一个新的问题: 由于 L k L^k Lk 的时间复杂度依旧很高, 作者引入了利用 Chebyshev 多项式来拟合卷积核的方法. 可以用切比雪夫多项式来近似 L k L^k Lk, 因为任何 k k k 阶多项式都可以用切比雪夫多项式来近似.

引入 k k k 阶截断的(truncated) Chebyshev 多项式 T k ( x ) T_k(x) Tk(x) 来近似 L k L^k Lk, 此时卷积核 g θ ( Λ ) g_\theta(\Lambda) gθ(Λ) 可以近似为:
g θ ( Λ ) ≈ ∑ k = 0 K θ k T k ( Λ ~ ) g_\theta(\Lambda) \approx \sum_{k = 0}^{K}\theta_kT_k(\widetilde{\Lambda}) gθ(Λ)k=0KθkTk(Λ ) 其中 θ k \theta_k θk 为切比雪夫多项式的系数, T k ( Λ ~ ) T_k(\widetilde{\Lambda}) Tk(Λ ) 是取 Λ ~ = 2 λ m a x Λ − I \widetilde{\Lambda} = \frac{2}{\lambda_{max}}\Lambda - I Λ =λmax2ΛI 的切比雪夫多项式, 进行这个变换的原因是切比雪夫多项式的输入要在 [ − 1 , 1 ] [-1, 1] [1,1] 之间.

切比雪夫多项式(Chebyshev Polynomial)使用递归的方式定义:
T k ( x ) = 2 x T k − 1 ( x ) − T k − 2 ( x ) T 0 ( x ) = 1 , T 1 ( x ) = x T_k(x) = 2xT_{k - 1}(x) - T_{k - 2}(x) \\ T_0(x) = 1, \quad T_1(x) = x Tk(x)=2xTk1(x)Tk2(x)T0(x)=1,T1(x)=x 卷积结果可以近似为:
( f ⊗ g ) G = U g θ U T f = ∑ k = 0 K θ k U T k ( Λ ~ ) U T f = ∑ k = 0 K θ k T k ( L ~ ) f \begin{aligned} (f \otimes g)_G &= Ug_\theta U^T f \\ &= \sum_{k = 0}^{K}\theta_kUT_k(\widetilde{\Lambda})U^Tf \\ &= \sum_{k = 0}^{K}\theta_kT_k(\widetilde{L})f \end{aligned} (fg)G=UgθUTf=k=0KθkUTk(Λ )UTf=k=0KθkTk(L )f 其中 T k ( L ~ ) = 2 L ~ T k − 1 ( L ~ ) − T k − 2 ( L ~ ) T_k(\widetilde{L}) = 2\widetilde{L}T_{k - 1}(\widetilde{L}) - T_{k - 2}(\widetilde{L}) Tk(L )=2L Tk1(L )Tk2(L ), 并且满足 T 0 ( L ~ ) = I , T 1 ( L ~ ) = L ~ T_0(\widetilde{L}) = I, T_1(\widetilde{L}) = \widetilde{L} T0(L )=I,T1(L )=L .

此时计算一次 T k ( L ~ ) f T_k(\widetilde{L})f Tk(L )f 的时间复杂度只需要 O ( ∣ E ∣ ) \mathcal{O}(|\mathcal{E}|) O(E), 计算整个卷积的时间复杂度为 O ( K ∣ E ∣ ) \mathcal{O}(K|\mathcal{E}|) O(KE), 相比于前面直接计算 L k L^k Lk 所需的时间复杂度 O ( N 2 ) \mathcal{O}(N^2) O(N2), 有了显著的提升.

总结第二代 GCN 可以发现优势如下:

  1. 参数数量大大减少: 卷积核 g θ ( Λ ) g_\theta(\Lambda) gθ(Λ) 只有参数 θ ∈ R K \theta\in\mathbb{R}^K θRK, 即 K K K 个参数
  2. 具有 Spatial Localization: 每个节点特征的更新只与 K K K-hop 范围内的邻居有关
  3. 如果用 L k L^k Lk 的方式去计算卷积核, 那么无需再做特征分解了, 可以直接利用拉普拉斯矩阵, 缺点是时间复杂度高; 而如果用切比雪夫多项式去逼近 L k L^k Lk, 则可以进一步减小时间复杂度.

缺点在 解读三种经典GCN中的Parameter Sharing 一文中有介绍, 即:

参数太少, 在每一阶(每一个 hop) 中的所有邻居都共用同一个参数 θ k \theta_k θk, 使得模型无法很好地实现在同阶的邻域上分配不同的权重给不同的邻居(也就是GAT论文里说的 enable specifying different weights to different nodes in a neighborhood)

在第三代 GCN 中, 为何设置 λ m a x = 2 \lambda_{max} = 2 λmax=2 ?

参考自: http://xtf615.com/2019/02/24/gcn/

在推导第三代 GCN时, 作者主要是对第二代 GCN 中的卷积公式进行简化, 在这个过程中用到了很多技巧.

  1. K = 1 K = 1 K=1, 此时切比雪夫多项式是 1 阶的, 即每层卷积层只需要考虑 1-hop 的邻居;
  2. 通过堆叠多层卷积层来获取 multi-hop 邻居的信息;
  3. 加入一些参数的约束, 比如 λ m a x ≈ 2 \lambda_{max}\approx 2 λmax2, 引入 renormalization trick, 以便简化模型;

具体推导如下, 令 K = 1 , λ m a x ≈ 2 K = 1, \lambda_{max}\approx 2 K=1,λmax2:
( f ⊗ g ) G = ∑ k = 0 K θ k T k ( L ~ ) f = θ 0 T 0 ( L ~ ) f + θ 1 T 1 ( L ~ ) f ( note:  T 0 ( L ~ ) = I , T 1 ( L ~ ) = L ~ = 2 λ m a x L − I ) = θ 0 f + θ 1 ( L − I ) f \begin{aligned} (f\otimes g)_G &= \sum_{k = 0}^{K}\theta_kT_k(\widetilde{L})f \\ &= \theta_0T_0(\widetilde{L})f + \theta_1T_1(\widetilde{L})f \qquad \left(\text{note: } T_0(\widetilde{L})=I, T_1(\widetilde{L})=\widetilde{L}=\frac{2}{\lambda_{max}}L - I\right) \\ &= \theta_0f + \theta_1(L - I)f \end{aligned} (fg)G=k=0KθkTk(L )f=θ0T0(L )f+θ1T1(L )f(note: T0(L )=I,T1(L )=L =λmax2LI)=θ0f+θ1(LI)f 取归一化的拉普拉斯矩阵 L = D − 1 2 ( D − A ) D − 1 2 L = D^{-\frac{1}{2}}(D - A)D^{-\frac{1}{2}} L=D21(DA)D21, 其中 D D D 为 Graph 的度矩阵, 其为对角阵, 满足 d i i = ∑ j A i j d_{ii} = \sum_{j}A_{ij} dii=jAij, A A A 为 Graph 的邻接矩阵. 将 L L L 代入到上式中, 并做进一步的简化, 令 θ 0 = − θ 1 \theta_0 = -\theta_1 θ0=θ1, 此时模型中参数简化为 1 个 θ \theta θ:
( f ⊗ g ) G = θ 0 f + θ 1 ( D − 1 2 ( D − A ) D − 1 2 − I ) f = θ 0 f − θ 1 D − 1 2 A D − 1 2 f = θ f + θ D − 1 2 A D − 1 2 f = θ ( I + D − 1 2 A D − 1 2 ) f \begin{aligned} (f\otimes g)_G &= \theta_0 f + \theta_1\left(D^{-\frac{1}{2}}(D - A)D^{-\frac{1}{2}} - I\right) f \\ &= \theta_0 f - \theta_1D^{-\frac{1}{2}}AD^{-\frac{1}{2}}f \\ &= \theta f + \theta D^{-\frac{1}{2}}AD^{-\frac{1}{2}}f \\ &= \theta \left(I + D^{-\frac{1}{2}}AD^{-\frac{1}{2}}\right) f \end{aligned} (fg)G=θ0f+θ1(D21(DA)D21I)f=θ0fθ1D21AD21f=θf+θD21AD21f=θ(I+D21AD21)f 由于 I + D − 1 2 A D − 1 2 I + D^{-\frac{1}{2}}AD^{-\frac{1}{2}} I+D21AD21 的范围为 [ 0 , 2 ] [0, 2] [0,2] 比较大, 可能在模型训练的时候导致梯度爆炸/消失, 因此使用 renormalization trick, 令:
I + D − 1 2 A D − 1 2 → D ~ − 1 2 A ~ D ~ − 1 2 I + D^{-\frac{1}{2}}AD^{-\frac{1}{2}}\rightarrow \tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}} I+D21AD21D~21A~D~21 其中 A ~ = A + I \tilde{A} = A + I A~=A+I (相当于增加了 self-connection), D ~ i i = ∑ j A ~ i j \tilde{D}_{ii} = \sum_{j}\tilde{A}_{ij} D~ii=jA~ij, 此时:
( f ⊗ g ) G = θ ( D ~ − 1 2 A ~ D ~ − 1 2 ⏟ R N × N ) f ⏟ R N × 1 (f\otimes g)_G = \theta\left(\underbrace{\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}}_{\mathbb{R}^{N\times N}}\right)\underbrace{f}_{\mathbb{R}^{N\times 1}} (fg)G=θ(RN×N D~21A~D~21)RN×1 f 其中 N N N 为节点的个数,

推广到多通道(单个节点的信息是向量,对比图像上 3 个通道 RGB 的值构成 3 维向量)和多卷积核(每个卷积核只有1个参数), 即:
f ∈ R N × 1 → X ∈ R N × C f \in \mathbb{R}^{N \times 1} \rightarrow X \in \mathbb{R}^{N \times C} fRN×1XRN×C X X X 为节点的特征矩阵, C C C 为通道数. 相应的卷积核变化为:
θ ∈ R → W ∈ R C × F \theta\in\mathbb{R} \rightarrow W\in\mathbb{R}^{C\times F} θRWRC×F 其中 F F F 为卷积核的数目. 此时卷积结果可以写成:
Z ⏟ R N × F = ( D ~ − 1 2 A ~ D ~ − 1 2 ⏟ R N × N ) X ⏟ R N × C ⋅ W ⏟ R C × F \underbrace{Z}_{\mathbb{R}^{N\times F}} = \left(\underbrace{\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}}_{\mathbb{R}^{N\times N}}\right)\underbrace{X}_{\mathbb{R}^{N \times C}}\cdot\underbrace{W}_{\mathbb{R}^{C\times F}} RN×F Z=(RN×N D~21A~D~21)RN×C XRC×F W 最终得到的卷积结果 Z ∈ R N × F Z\in\mathbb{R}^{N\times F} ZRN×F . 如果堆叠多层的话, 可以将激活后的 Z Z Z 输入到下一层作为输入.

如何使用 GCN 进行无监督训练 ?

最近打算用 GCN 在无监督任务中做一些工作, 正好也有网友提到了这个问题, 这里写下自己的一些想法, 不一定正确.

先说一下一种常见的实现无监督训练的模式: 设置 source_encodertarget_encoder, (可以把它们理解为两个 Embedding Layer), 其中 source_encoder 用于对源节点进行编码, 而 target_encoder 用于对目标节点(包括正样本/负样本)进行编码, 这样可以分别得到源节点, 正样本, 负样本的 embedding, 假设分别为 emb_s, emb_p, emb_n. 之后在设计 loss 的时候, 首先要分别计算源节点和正负样本的内积, 比如 dot_p = emb_s * emb_p, dot_n = emb_s * emb_n, 然后设置 dot_p 的 label 为 1 (因为它是源节点和正样本的内积), 设置 dot_n 对应的 label 为 0, 最后使用 softmax cross entropy loss 进行训练.

这套流程常见于 node2vec / DeepWalk 中. 那么将 GCN 的思想迁移过来的话, 我觉得只需要将 source_encoder / target_encoder 中产生 embedding 的方法进行修改即可, 将简单的 Embedding Layer 替换为 GCN Layer, 其他部分可以保持不变. 通过这种方式, 应该也能进行无监督训练.

参考资料

图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导

如何理解 Graph Convolutional Network(GCN)?

Graph Convolutional Networks

Graph Signal Processing - Basics on Fourier Analysis

Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering (ChebNet)

GRAPH CONVOLUTIONAL NETWORKS tkipf 作者的主页

图卷积神经网络(GCN)详解:包括了数学基础(傅里叶,拉普拉斯)

【Graph Neural Network】GCN: 算法原理,实现和应用

图卷积网络到底怎么做,这是一份极简的Numpy实现

从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)

如何理解傅立叶级数公式?

从傅立叶级数到傅立叶变换

向往的GAT(图注意力模型)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值