GCN的前世今生

GCN的前世今生

Abstract

自从CNN以来, 深度学习算法对欧氏空间上的各类张量的处理都已经有了很高的性能. (比较经典的应用就比如说人脸识别算法, 精度已经能够达到99%以上接近100%了), 但是除了欧氏空间之上的规则数据之外, 还有着大量的数据以非欧空间之上的拓扑图的结构存在着. 就比如说社交网络之上的数据之类的. 这些都是传统的卷积网络无法处理的. 基于处理这种拓扑结构的需求, 新的图卷积算法就应运而生了.

图卷积分为两类 : 分别是谱域图卷积和空域图卷积. 虽然近期空域卷积有着更好的发展趋势, 但是我们还是要从图卷积发端的地方, 也就是谱域图卷积开始.

关于谱域图卷积

谱域卷积主要的理论依据是卷积定理 : 时域中的卷积同构与谱域中的乘法. 谱域卷积通过离散傅里叶变换把拓扑图映射到谱域来进行卷积操作.

主要的模型有SCNN、ChebNet和GCN(按发表时间升序排列). 这三个模型都是基于同一种算法, 可以说是一脉相承的了.

GCN的前世今生_第1张图片

图二:图离散卷积算法

SCNN – 谱图卷积理论的直接应用

离散卷积算法

  1. 图结构的刻画 : L = D − A L = D - A L=DA (拉普拉斯矩阵)与特征矩阵

拉普拉斯矩阵用于刻画图的结构信息.

易知L是一个非负定矩阵, 对其进行相似对角化处理可得
L = U Λ U T L = U\Lambda U^T L=UΛUT
其中的 U T U^T UT对应了图中的离散傅里叶变换(具体推导可以参考傅里叶变换和拉普拉斯算子之间的关系).

图中除了用拉普拉斯矩阵刻画的结构信息之外, 还有每个节点上的信息. 这种节点信息我们一般会用特征向量来对人工选择的特征进行量化. 每个节点的特征组合起来就得到了我们的特征矩阵 H ( 0 ) H^{(0)} H(0), 也就是最底层的语义. 特征矩阵和拉普拉斯矩阵一起完成了对图中信息的量化.

  1. 卷积定理: 时域中的卷积同构于频域中的乘法

由此我们可以定义 f f f g g g两个函数之间的卷积.
F ( f ∗ g ) = F ( g ) ⋅ F ( f ) = > f ∗ g = F − 1 { F ( g ) ⋅ F ( f ) } \mathcal{F}(f*g) = \mathcal{F}(g)·\mathcal{F}(f) => f*g = \mathcal{F}^{-1}\lbrace\mathcal{F}(g)·\mathcal{F}(f)\rbrace F(fg)=F(g)F(f)=>fg=F1{F(g)F(f)}

  • 离散形式:

f ∗ g = U { ( U T g ) ( U T f ) } f*g = U\lbrace(U^Tg)(U^Tf)\rbrace fg=U{(UTg)(UTf)}

papar作者取了 g θ = d i a g ( U T g ) g_{\theta} = diag(U^Tg) gθ=diag(UTg)作为卷积核, 主要是为了便于参数的设置和反向传播.

这样就给出了文中的卷积公式

( x ∗ g θ ) G = U g θ U T x = U ( θ 1 ⋱ θ n ) ( x ^ ( λ 1 ) x ^ ( λ 2 ) ⋯ x ^ ( λ n ) ) (x*g_\theta)_G = Ug_\theta U^{T}x = U \left( \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 \theta _1 & & \\ %第一行元素 & \ddots & \\ %第二行元素 & & \theta_n\\ \end{array} \right) %右括号 \left( %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 \hat{x}(\lambda _1)\\ %第一行元素 \hat{x}(\lambda _2)\\ %第二行元素 \cdots\\ \hat{x}(\lambda _n)\\ \end{array} \right) %右括号 (xgθ)G=UgθUTx=Uθ1θnx^(λ1)x^(λ2)x^(λn)

  1. 前向传播的公式

H ( l + 1 ) = h ( U F k U T H ( l ) ) H^{(l+1)} = h(UF_kU^TH^{(l)}) H(l+1)=h(UFkUTH(l))

其中 F k F_k Fk是我们的第k层的卷积层. 他的行数是输入的通道数, 列数为输出的通道数.

  1. 取损失函数和优化器, 进行全局寻优

这一部分大家可以自由选择优化策略

弊端

需要对拉普拉斯矩阵进行特征分解. 这是一个复杂度为 O ( n 3 ) O(n^3) O(n3)的操作. 网络规模的扩大所带来的计算开销是难以接受的.

ChebNet – 利用切比雪夫多项式对谱图卷积理论的近似

既然前文中提到的SCNN中特征分解的开销难以接受, 我们可以对其进行近似处理从而简化运算.

ChebNet就是这样一个在SCNN的基础上做了近似处理的网络.

  1. 采用Chebyshev多项式对谱域卷积的卷积核进行插值.

    这边是Chebyshev多项式:
    T n + 1 ( x ) = 2 x T n ( x ) − T n − 1 ( x ) T_{n+1}(x) = 2xT_n(x) - T_{n-1}(x) Tn+1(x)=2xTn(x)Tn1(x)
    这里用于多项式插值.
    g θ = d i a g ( U T g ) ⟶ Λ ^ = 2 λ m a x − I n g θ ( Λ ) = ∑ k = 0 K β k T k ( Λ ^ ) g_\theta = diag(U^Tg) \stackrel{\hat{\Lambda} = \frac{2}{\lambda_{max}} - I_n}{\longrightarrow}g_\theta(\Lambda) = \displaystyle\sum_{k=0}^{K}\beta_kT_k(\hat{\Lambda}) gθ=diag(UTg)Λ^=λmax2Ingθ(Λ)=k=0KβkTk(Λ^)
    这是利用Chebyshev多项式近似后的卷积核.

  2. 上述插值过程中还有一个小小的trick(你有没有注意到呢?)
    Λ ^ = 2 λ m a x − I n \hat{\Lambda} = \frac{2}{\lambda_{max}} - I_n Λ^=λmax2In
    这是一个标准化处理, 将 Λ \Lambda Λ中的特征值全部化到[-1, 1]这个区间内, 旨在避免网络迭代层数过深带来的梯度爆炸问题.

GCN – 在ChebNet基础上更进一步的简化

GCN在前面ChebNet的基础上再一次进行了简化. 他只取了卷积核Chebyshev插值多项式的前两项, 而且预设了这两项前面的参数相等. 将每个卷积核可学习的参数量降低到了1.
( x ∗ g θ ) G = θ ( D ~ − 1 / 2 W ~ D ~ − 1 / 2 ) x (x*g_\theta)_G = \theta(\tilde{D}^{-1/2}\tilde{W}\tilde{D}^{-1/2})x (xgθ)G=θ(D~1/2W~D~1/2)x
这就是GCN的卷积核. 其中 θ \theta θ就是它可学习的参数.

除了更精简的近似之外, GCN中还有两点trick:

  1. W ~ \tilde{W} W~是在邻接矩阵 A A A的基础上加上了自环, 将节点自身的特征也添加到了网络之中.

  2. 对拉普拉斯矩阵 L L L的标准化和对称化.
    L ~ = D ~ − 1 / 2 L D ~ − 1 / 2 \tilde{L} = \tilde{D}^{-1/2}L\tilde{D}^{-1/2} L~=D~1/2LD~1/2

弊端

  1. 参数过少会导致欠拟合的问题.
  2. 网络无法迭代的很深.

关于空域卷积

谱域卷积只是图卷积算法的一种形式, 他很多固有的弊端在很大程度上限制了他自身的发展. 就比如说在谱域卷积的过程中网络结构是固定的, 这就给高层语义的提取带来了很大的限制.

现在的图卷积算法更主要的是空域卷积, 也就是下面介绍的这一部分.

卷积的本质是什么呢?

对这个问题以下的四个空域卷积网络都分别给出了自己的答案.

GNN

欧式空间上的卷积可以理解为先对固定数量的邻域进行排序, 然后使用卷积核进行内积.

非欧空间之上图结构的卷积也可以参考这种模式.

在这里插入图片描述

具体实现

  1. 利用随机游走这一马尔科夫过程, 以 k k k步之内节点被访问次数的期望进行排序.
    • 以标准化之后的图相似度矩阵 P = D − 1 S P = D^{-1}S P=D1S来作为状态转移矩阵.
  2. 取期望最大的 p p p个节点作为 i i i的邻域, 按期望由大到小排序.
  3. 使用参数数量为 p p p的一维卷积和对邻域进行卷积操作.

本质

通过随机游走算法对图结构进行排序, 强制将非欧空间之上的图结构转化成了一维欧氏空间之上的规则数据, 然后使用一维卷积对其进行处理.

GraphSAGE

*SAGE(Sample and AggreGatE)*不同于前面的GNN, GraphSAGE认为卷积是采样加上的信息的聚合.

Sample

均匀采样法: 在节点一阶相连的节点上均匀采样, 构建固定大小的邻域.

AggreGatE

GraphSAGE认为节点的邻域中没有顺序可言, 所以要求聚合函数不依赖于邻域节点的输入顺序.

  1. 均值聚合 : 取邻域内节点的均值.
  2. LSTM聚合 : – 这个真的是顺序无关的吗???
  3. Pooling聚合 : 采用Max Pooling.

h N ( v ) k ← A G G R E G A T E k ( { h u k − 1 , ∀ u ∈ N ( v ) } ) h^k_{\mathcal{N}(v)}\leftarrow AGGREGATE_k(\{h^{k-1}_u, \forall_u\in\mathcal{N}(v)\}) hN(v)kAGGREGATEk({huk1,uN(v)})

聚合函数

聚合之后还需要结合自身信息然后进行卷积和激活.
h v k ← σ ( W k ⋅ C O N C A T ( h v k − 1 , h N ( v ) k ) ) h^k_v \leftarrow \sigma(W^k·CONCAT(h^{k-1}_v, h^k _{\mathcal{N(v)}})) hvkσ(WkCONCAT(hvk1,hN(v)k))
最后进行标准化以防止梯度爆炸和梯度消失.

预测

使用节点的embedding来预测label.

GAT – Attention is all you need.

GAT(Graph Attention Network) – 图注意力网络

将attention机制引入图卷积模型.

正常的图卷积神经网络卷积核的参数都是共享的, 这种就是所谓的分心模型. 他预设了输入节点对不同的输出节点的影响是相同的.

但是从我们人的认知模型出发, 输入节点对不同的输出节点影响肯定是不同的. 所以就提出了所谓的Attention机制. 通过每个输出节点上挂载的权值数组来衡量各个输入节点对该输出的重要程度.

本质

利用Attention机制来建模邻域节点与中心节点不同的关联度.

实现

  1. 计算节点之间的关联度
    e i j = α ( W h i ⃗ , W h j ⃗ ) e_{ij} = \alpha(W\vec{h_i}, W\vec{h_j}) eij=α(Whi ,Whj )
    ​ 其中 e i j e_{ij} eij为注意力系数, 可以认为它正比于 i , j i, j i,j两节点的关联度.

  2. 利用softmax归一化, 求得类似概率分布的’‘影响因子’'.
    α i j = s o f t m a x j ( e i j ) = e x p ( e i j ) ∑ k ∈ N i e x p ( e i k ) \alpha_{ij} = softmax_j(e_{ij}) = \frac{exp(e_{ij})}{\sum\limits_{k\in\mathcal{N_i}}exp(e_{ik})} αij=softmaxj(eij)=kNiexp(eik)exp(eij)

  3. 利用上文求得的不同的"影响因子"来对邻域节点的信息进行有区别的聚合, 完成图卷积操作.

h i ′ ⃗ = f ( ∑ j ∈ N i α i j W h j ⃗ ) \vec{h_{i}^{'}} = f(\sum\limits_{j\in\mathcal{N_i}}\alpha_{ij}W\vec{h_j}) hi =f(jNiαijWhj )

其中的 W W W是共享的权值, 而真正的差异化的卷积核为 α i j W \alpha_{ij}W αijW.

思考

  • Attention机制考虑了节点之间的关联程度.
  • Attention机制中可学习的关联度可以体现网络逐渐聚焦到重点之上的过程.

你可能感兴趣的:(深度学习,深度学习,卷积,gcn)