图表示学习的主要目标正是将图数据转化成低维稠密的向量化表示,同时确保图数据的某些性质在向量空间中也能够得到对应。这里图数据的表示可以是节点层面的,也可以是全图层面的,但是作为图数据的基本构成元素,节点表示一直是图表示学习的主要对象。
图表示学习的研究对象是图数据,结构信息会给数据的学习带来极大的挑战。有两个作用:
图表示学习方法有两种:基于分解的方法、基于随机游走的方法,基于深度学习的方法。
基于分解的方法对表述图数据结构信息的矩阵进行分解,将节点转化到低维向量空间中去,同时保留结构相似性。一般有邻接矩阵、拉普拉斯矩阵、节点相似度矩阵,这类方法都有解析解,但依赖于相关矩阵的分解计算,这类方法具有很高的时间和空间复杂度。
基于随机游走的方法有DeepWalk、Node2Vec等,DeepWalk通过随机游走将图转化为节点序列,设置中心节点左右距离为w的节点为上下文,同词向量一样,DeepWalk本质上建模了中心节点与上下文节点之间的共现关系。这种方法也会采用负采样的优化手段。
基于随机游走的方法能够用来解决大规模图的表示学习,但是,此方法无法充分利用图里的结构信息,而且很难自然融合图中的属性信息。
GNN方法优势:
GNN这类模型可以非常友好地支持有监督的学习方式,但是GNN本身作为一种重要的对图数据进行表示学习的框架,只要与相应的无监督损失函数结合起来就能实现无监督图表示学习。根据损失函数不同可以分为以下两类无监督学习:
类比自编码器的思路,可以将节点之间的邻接关系进行重构学习,为此定义如下图自编码器:
Z = G N N ( X , A ) A ~ = σ ( Z T Z ) Z=GNN(X,A) \\ \tilde A=\sigma(Z^TZ) Z=GNN(X,A)A~=σ(ZTZ)
Z是所有节点的表示,这里借助GNN模型同时对图的属性信息与结构信息进行编码学习。 A ~ \tilde A A~是重构之后的邻接矩阵,这里使用向量的内积来表示节点之间的邻接关系。
重构损失为
L recon = ∣ ∣ A ~ − A ∣ ∣ 2 L_{\text{recon}}=||\tilde A-A||^2 Lrecon=∣∣A~−A∣∣2
由于过平滑的问题,GNN可以轻易地将相邻节点学习出相似的表达,这就导致解码出来的邻接矩阵 A ~ \tilde A A~能够很快趋近于原始矩阵A。因此我们需要给损失函数加上一些约束目标。比如,降噪自编码器的做法(对输入数据进行一定的扰动,迫使模型从加噪的数据中提取有用的信息恢复数据),有两种方案:
也可以使用变分自编码器的思路,以下是变分图自编码器的思路:
变分自编码器的思路可以见:
https://blog.csdn.net/QIzikk/article/details/123082391
先用x估计 q ( z ∣ x ) 的 分 布 μ ′ ( x ) 和 σ ′ ( x ) q(z|x)的分布\mu^{'}(x)和\sigma^{'}(x) q(z∣x)的分布μ′(x)和σ′(x),方法是最小化 q ( z ∣ x ) 和 P ( z ) q(z|x)和P(z) q(z∣x)和P(z)的散度,使用 q ( z ∣ x ) q(z|x) q(z∣x)来计算z的分布;再通过z估计 P ( x ∣ z ) P(x|z) P(x∣z), q ( z ∣ x ) q(z|x) q(z∣x)是用来近似 p ( z ∣ x ) p(z|x) p(z∣x)的,在前一部分已经算出,因此通过最大化 E q ( z ∣ x ) ( log P ( x ∣ z ) ) E_{q(z|x)}(\log P(x|z)) Eq(z∣x)(logP(x∣z))的方法来重构x的分布。
图变分自编码器的各个组成如下:
推断模型:
q ( Z ∣ X , A ) = ∏ i = 1 N q ( z i ∣ X , A ) q ( z i ∣ X , A ) = N ( z i ∣ μ i , d i a g ( σ i 2 ) ) 使 用 两 个 G N N 对 μ 和 σ 进 行 拟 合 μ = G N N μ ( X , A ) , log σ = G N N σ ( X , A ) q(Z|X,A)=\prod_{i=1}^Nq(\pmb z_i|X,A)\\ q(\pmb z_i|X,A)=N(\pmb z_i|\pmb \mu_i,diag(\pmb \sigma_i^2))\\ 使用两个GNN对\pmb\mu和\pmb \sigma进行拟合\\ \pmb \mu =GNN_\mu(X,A),\log \pmb\sigma =GNN_\sigma(X,A) q(Z∣X,A)=i=1∏Nq(zzzi∣X,A)q(zzzi∣X,A)=N(zzzi∣μμμi,diag(σσσi2))使用两个GNN对μμμ和σσσ进行拟合μμμ=GNNμ(X,A),logσσσ=GNNσ(X,A)
生成模型:
p ( A ∣ Z ) = ∏ i = 1 N ∏ j = 1 N p ( A i j ∣ z i , z j ) p ( A i j = 1 ∣ z i , z j ) = σ ( z i T z j ) p(A|Z)=\prod_{i=1}^N\prod_{j=1}^N p(A_{ij}|z_i,z_j)\\ p(A_{ij}=1|\pmb z_i,\pmb z_j)=\pmb \sigma(\pmb z_i^T\pmb z_j) p(A∣Z)=i=1∏Nj=1∏Np(Aij∣zi,zj)p(Aij=1∣zzzi,zzzj)=σσσ(zzziTzzzj)
这里也是使用两个节点表示向量的内积来拟合邻接关系。
损失函数:
L = L recon + L k l = − E q ( Z ∣ X , A ) [ log p ( A ∣ Z ) ] + K L [ q ( Z ∣ X , A ) ∣ ∣ p ( Z ) ] L=L_\text{recon}+L_{kl}=-E_{q(Z|X,A)}[\log p(A|Z)]+KL[q(Z|X,A)||p(Z)] L=Lrecon+Lkl=−Eq(Z∣X,A)[logp(A∣Z)]+KL[q(Z∣X,A)∣∣p(Z)]
同样,隐变量 z z z的先验分布选用标准正态分布:
p ( Z ) = ∏ i p ( z i ) = ∏ i N ( z i , 0 , I ) p(Z)=\prod_ip(\pmb z_i)=\prod_iN(\pmb z_i,\pmb 0,\pmb I) p(Z)=i∏p(zzzi)=i∏N(zzzi,000,III)
这提供了一个图生成模型的框架。
设置评分函数D,提高“真实”(正)样本的得分,降低假(或负)样本的得分。
词与上下文是一个很好的例子,词是研究主体,代表图数据里的节点,上下文代表节点的邻居、子图、全图等。按上述两个方面的思想,可以建立损失函数:
L v i = − log ( D ( z i , c ) ) + log ( D ( z i , c ˉ ) ) L_{v_i}=-\log(D(\pmb z_i,\pmb c))+\log(D(\pmb z_i,\bar {\pmb c})) Lvi=−log(D(zzzi,ccc))+log(D(zzzi,cccˉ))
c \pmb c ccc表示上下文的表示向量, c ˉ \bar {\pmb c} cccˉ表示非上下文的表示向量,最小化上述损失函数就是最大化评分函数D。下面是不同上下文的几种形式:
——建模节点与邻居节点的共现关系
与中心节点 v i v_i vi一起出现在固定长度窗口内的节点 v j v_j vj视为邻居,同时通过负采样的手段,将不符合该关系的节点作为负样本。节点的表示学习模型使用GNN:
Z = G N N ( X , A ) L v i = log ( 1 − σ ( z i T z j ) ) + E v n ∼ p n ( v i ) log ( σ ( z i T z v n ) ) Z=GNN(X,A)\\ L_{v_i}=\log (1-\sigma(\pmb z_i^T\pmb z_j))+E_{v_n\sim p_n(v_i)}\log(\sigma(\pmb z_i^T\pmb z_{v_n})) Z=GNN(X,A)Lvi=log(1−σ(zzziTzzzj))+Evn∼pn(vi)log(σ(zzziTzzzvn))
p n p_n pn是一个关于节点出现概率的负采样分布,得分函数使用向量内积加上sigmoid函数,限制在[0,1]。该方法在优化目标上与图自编码器基本等同,但是这种负采样形式的对比优化并不需要与图自编码器一样地显式解码出邻接矩阵 A ~ \tilde A A~,由于 A ~ \tilde A A~破坏了原始邻接矩阵的稀疏性,因此该方法无需 O ( N 2 ) O(N^2) O(N2)的空间复杂度。
——将子图作为上下文进行对比学习,可以避免邻居作为上下文中缺乏对结构相似性的捕捉
中心节点如红色节点所示,用一个GNN在其K阶子图上提取其表示向量,同时将处于中心节点 r 1 和 r 2 跳 r_1和r_2 跳 r1和r2跳之间的节点定义为该中心节点的上下文锚点。上图, K = 2 , r 1 = 1 , r 2 = 4 K=2,r_1=1,r_2=4 K=2,r1=1,r2=4,使用另一个GNN来提取每个节点作为上下文锚点时的表示向量,同时为了得到一个总的、固定长度的上下文表示向量,使用读出机制来聚合上下文锚点的表示向量。
Z = G N N ( X , A ) , Z context_anchor = G N N ( X , A ) c i = R ( { Z context_anchor [ j ] , ∀ v j 是 v i 的 上 下 文 锚 点 } ) L v i = log ( 1 − σ ( z i T c i ) ) + log ( σ ( z i T c j ∣ j ≠ i ) ) Z=GNN(X,A),\quad Z_{\text{context\_anchor}}=GNN(X,A) \\ \pmb c_i=R(\{ Z_{\text{context\_anchor}}[j],\forall v_j是v_i的上下文锚点 \})\\ L_{v_i}=\log (1-\sigma(\pmb z_i^T\pmb c_i))+\log (\sigma(\pmb z_i^T\pmb c_{j|j\ne i})) Z=GNN(X,A),Zcontext_anchor=GNN(X,A)ccci=R({Zcontext_anchor[j],∀vj是vi的上下文锚点})Lvi=log(1−σ(zzziTccci))+log(σ(zzziTcccj∣j=i))
提出了Deep Graph Informax(DGI)的方法对图数据进行无监督表示学习。该方法实现了一种节点与全图之间的对比损失的学习机制:
Z = G N N ( X , A ) , Z ˉ = G N N ( X currupt , A currupt ) s = R ( z i , ∀ v i ∈ V ) L v i = log ( 1 − D ( z i , s ) ) + log ( D ( z i ˉ ) , s ) Z=GNN(X,A),\quad \bar Z=GNN(X_{\text{currupt}} ,A_{\text{currupt}})\\ \pmb s=R(\pmb z_i,\forall v_i\in V)\\ L_{v_i}=\log (1-D(\pmb z_i,\pmb s))+\log (D(\bar {\pmb z_i}),\pmb s) Z=GNN(X,A),Zˉ=GNN(Xcurrupt,Acurrupt)sss=R(zzzi,∀vi∈V)Lvi=log(1−D(zzzi,sss))+log(D(zzziˉ),sss)
为了得到负采样样本,需要对图数据进行相关扰动,得到 ( X currupt , A currupt ) (X_{\text{currupt}} ,A_{\text{currupt}}) (Xcurrupt,Acurrupt).具体的加噪方法上文中已有概括,然后将这两组图数据送到同一个GNN模型中进行学习。为了得到图的全局表示,使用读出机制对局部节点信息进行聚合。损失函数中,作者固定全图表示,对节点进行负采样对比学习。
这样可以方便后续的节点分类任务,同时通过一个统一的全局表示来最大化全图与节点的互信息,在所有节点的表示之间建立起一层更直接的联系,例如相距较远的节点之间结构相似性的学习。上述过程示意图如下:
同时在全图层面的无监督学习上,上述损失函数的负样本刚好相反,需要抽取其它图的表示 s ˉ \bar {\pmb s} sssˉ来代替,即:
L s = E v i ∈ G s log ( 1 − D ( z i , s ) ) + E v i ∈ G s log ( D ( z i , s ˉ ) ) L_s=E_{v_i\in G_s}\log(1-D(\pmb z_i,\pmb s))+E_{v_i\in G_s}\log(D(\pmb z_i,\bar{\pmb s})) Ls=Evi∈Gslog(1−D(zzzi,sss))+Evi∈Gslog(D(zzzi,sssˉ))
样本刚好相反,需要抽取其它图的表示 s ˉ \bar {\pmb s} sssˉ来代替,即:
L s = E v i ∈ G s log ( 1 − D ( z i , s ) ) + E v i ∈ G s log ( D ( z i , s ˉ ) ) L_s=E_{v_i\in G_s}\log(1-D(\pmb z_i,\pmb s))+E_{v_i\in G_s}\log(D(\pmb z_i,\bar{\pmb s})) Ls=Evi∈Gslog(1−D(zzzi,sss))+Evi∈Gslog(D(zzzi,sssˉ))
此时由于是全图层面的任务,所以我们希望通过上式让全图与其所有局部节点之间实现互信息最大化,也即获得全图最有效、最具代表性的特征,这对图分类任务十分有益。