[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator

总结

先为query筛选候选的data点,再得到data图的候选子图,再根据候选情况建立两图之间的关联,内部图外部图同时进行GNN,损失函数里除了常规目标再加个WD拉近匹配的距离。

问题定义

对于查询图 q q q和数据图 G G G V ( q ) , V ( G ) V(q), V(G) V(q),V(G)表示图里的点, E ( q ) , E ( G ) E(q), E(G) E(q),E(G)表示图里的边,还有一个共同的标签函数 f l f_l fl
定义查询图 q = ( V , E ) q=(V,E) q=(V,E),数据图 G = ( V ′ , E ′ ) G=(V', E') G=(V,E),子图同构可以定义成一个函数 f i s o f_{iso} fiso,能够使 ∀ u ∈ V , f l ( u ) = f l ( f i s o ( u ) ) , ∀ e ( u , u ′ ) ∈ E , e ( f i s o ( u ) , f i s o ( u ′ ) ) ∈ E ′ \forall u \in V, f_l(u)=f_l(f_{iso}(u)), \forall e(u,u')\in E, e(f_{iso}(u),f_{iso}(u^{'}))\in E' uV,fl(u)=fl(fiso(u)),e(u,u)E,e(fiso(u),fiso(u))E
而子图统计则是估计所有匹配的情况的数量。
一般这个问题的测试是利用 q − e r r o r = max ⁡ ( max ⁡ ( 1 , c ) max ⁡ ( 1 , c ′ ) , max ⁡ ( 1 , c ′ ) max ⁡ ( 1 , c ) ) q-error=\max(\frac{\max(1,c)}{\max(1,c')}, \frac{\max(1,c')}{\max(1,c)}) qerror=max(max(1,c)max(1,c),max(1,c)max(1,c))实现,其中 c ′ c' c是预测值, c c c是真实值。
符号表:
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第1张图片

比较之前的算法

非深度学习算法

基于统计的

这种算法会先把查询图分成更小的子图,然后小图去做subgraph counts再把结果合起来。
这种算法是基于小图间彼此独立的设想,但这在真实的大图上显然不成立。
直白点理解就是,假设查询图有好几个模块,然后把模块单独拆出来匹配,完成后再拿几根线把几个模块重新连起来就行了。但实际上真实的图错综复杂,根本就剪不出这些模块,就会出现同时属于多个模块的点错乱,自然就会漏掉很多匹配的情况。

基于采样的

这种算法会先从data图里采样出子图,然后拿这些图去匹配query图,再统计结果。
这种算法比基于统计的看起来更不行,性能直接会被采样算法打折扣,尤其是当图变得比较复杂,更难把适合的子图全挖出来。

深度学习算法

现有的一些算法:

  • 将一些motif作为queries去做匹配,应该就是先定义一些积木再去同时匹配query图和data图,得到结果。
  • NSIC:先encode所有图,可以是使用RNN或者GNN,然后利用IDAMNet(基于RNN)来进行预测,也就是合成特征向量之后比较。然而进行全图的encode,RNN也有大量参数,导致这个模型效率很低,伸缩性差。此外,因为算法本质是由data图确定结果,所以data图一旦变得很大,query图将无法被区分。这话的意思感觉应该是data图越大,合成的特征越笼统,越难做统计,不是很确定。
  • LSS:利用了active learning。把query图分解成更小的子结构,然后用GNN编码他们。再用self-attention来聚合这些子结构和data图的匹配结果,以预测出counts。这个算法是现在最好的算法。这个算法的弊端是只是重视了query图的子结构,但无法更好地提取data图信息,只是用data图里的信息给query图生成特征,比如标签频率或者直接使用标签的embedding,如deepwalk、node2vec、proNE这种,既不能获取更整体的query图信息,又很容易被个别点的噪声影响。此外,这算法用了k-hop 广度优先算法,但k固定为3,没考虑query图大小,一旦图够小,子结构就会完全是query图,然后模型就需要重复算相同的结构。

关于active learning:
类似于半监督学习,区别是会让模型自己判断哪些数据更重要(根据信息熵),以获取更重要的标签信息。在同样数量的标签下,这样做会比纯监督学习要好。
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第2张图片

模型

[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第3张图片
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第4张图片
CS: candidate set

  1. 生成query图所有点的候选点集,合出全图的候选匹配点集。
  2. 根据候选点集选出data图中的候选子结构
  3. 初始化query图中的点特征
  4. 对于每一个候选子结构,初始化他们的点特征,再用WEst获得预测的counts
  5. 求和每个子结构的结果,得到最终结果。

其中需要展开细节的部分:点候选和子集候选怎么选,以及Wasserstein Estimator(WEst)的实现

候选过滤

首先要对data图进行完全候选过滤。
完全候选集的意思就是找出data图中所有能和query图中的点构成映射关系的点的集合。
这里用的是GraphQL算法,这算法能选出最小的完全候选集合。
过程分为两块,局部和全局。

  • 局部:比较query图中某点和他几跳邻居的标签是否一一匹配,匹配的话把data图的那个点加入CS中。
  • 全局:从 C S ( u ) CS(u) CS(u)中抽一个点 v v v出来,用他们俩的邻居顶点建立二部图 B u v B^v_u Buv。当 v v v的邻居 v ′ v' v正好也是 u u u的邻居 u ′ u' u的CS里的一员,就加边 e ( u ′ , v ′ ) e(u',v') e(u,v)。如果 u u u的所有邻居在这个二部图里全都至少有一条边,那么v就会留在 C S ( u ) CS(u) CS(u)中,否则就删掉。

最后得到的就是点候选了。

子结构提取

假设已经得到了整张query图的候选点集 C S ( q ) = ∪ u ∈ V ( q ) C S ( u ) CS(q) = \cup_{u\in V(q)}CS(u) CS(q)=uV(q)CS(u),那要提取的子结构就是两端都是这些点的所有边,和这些点合成的data子图。

WEst

顶点的标签和度能够作为初始特征。因为度和标签都比较小,所以会把他们同构multi-hot转成二进制的向量。此外,多跳邻居的标签和度也会被mean之后放进来。
x v = f b ( d e g v ) ∣ ∣ f b ( f l ( v ) ) ∣ ∣ i = 1 k M P ∀ v ′ ∈ N ( i ) ( v ) ( f b ( d e g v ′ ) ∣ ∣ f b ( f l ( v ′ ) ) ) x_v = f_b(deg_v)||f_b(f_l(v))||^k_{i=1}MP_{\forall v' \in N^{(i)}(v)}(f_b(deg_{v'})||f_b(f_l(v'))) xv=fb(degv)∣∣fb(fl(v))i=1kMPvN(i)(v)(fb(degv)∣∣fb(fl(v)))
X q = { x u ∈ { 0 , 1 } d i m 0 ; u ∈ V ( q ) } X_q=\{x_u\in\{0, 1\}^{dim_0};u \in V(q)\} Xq={xu{0,1}dim0;uV(q)}
X s u b = { x v ∈ { 0 , 1 } d i m 0 ; v ∈ V ( G s u b ) } X_{sub}=\{x_v \in \{0,1\}^{dim_0};v \in V(G_{sub})\} Xsub={xv{0,1}dim0;vV(Gsub)}
这里有个疑问,mean的结果为什么还是二进制的?
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第5张图片
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第6张图片

内部图聚合

文章里的GNN选择了GIN,过了网络后套个MLP出下一层特征,做K层后得到query图和sub图的特征矩阵。

外部图聚合

生成query图和sub图的二部图作为外部图,点就是两边的所有点,边还是如果 v v v C S ( u ) CS(u) CS(u)中就加。聚合方式选attention,根据两点的相似度先得到一个权重,再聚合加上原本点的特征得到下一层特征。这里的 α u u \alpha_{uu} αuu也可以按原本的公式算出来,但不是很清楚为什么要这么算,而不单独设置一个固定的值。此外,为了保证能够取到特征,肯定要保证 K ′ < = K K'<=K K<=K

Readout和预测结果

最后需要把图的特征矩阵转为图特征才能进行预测。Readout是排列不变的单射函数,选择max pooling。
最后的预测结果就是两特征拼接之后过MLP。

损失函数

这里用到了 Wasserstein Discriminator(WD)。这个东西实际上就是去求两个概率分布的距离,也就是从一个概率分布转为另一个的最低成本。
给两个随机变量 μ , ν \mu, \nu μ,ν和他们遵循的随机分布 P q , P g \mathbb{P}_q, \mathbb{P}_g Pq,Pg,那么W-1距离就是:
W 1 ( P q , P g ) = inf ⁡ γ ∈ Π ( P q , P g ) E ( μ , ν ) ∼ γ [ ∣ ∣ μ − ν ∣ ∣ ] W_1(\mathbb{P}_q, \mathbb{P}_g)=\inf_{\gamma \in \Pi(\mathbb{P}_q, \mathbb{P}_g)}\mathbb{E}_{(\mu,\nu)\sim\gamma}[||\mu-\nu||] W1(Pq,Pg)=infγΠ(Pq,Pg)E(μ,ν)γ[∣∣μν∣∣]
其中 Π ( P q , P g ) \Pi(\mathbb{P}_q, \mathbb{P}_g) Π(Pq,Pg)是所有联合概率分布 γ ( μ , ν ) \gamma(\mu,\nu) γ(μ,ν)的集合。
换句话说,把所有可能的联合概率取出,然后采样,比较样本间的距离。在这些距离里取到的下届确(这个值是小于所有距离的最大值)就可以认为是两个概率间的距离。
这个式子要找下界确,这是对于连续的概率分布来说非常难算。好在式子可以转为对偶问题:
W 1 ( P q , P g ) = sup ⁡ ∣ ∣ f ω ∣ ∣ L ≤ 1 E μ ∼ P q [ f ω ( μ ) ] − E v ∼ P g [ f ω ( v ) ] W_1(\mathbb{P}_q, \mathbb{P}_g)=\sup_{||f_{\omega}||_{L}\le1}\mathbb{E}_{\mu\sim \mathbb{P}_q}[f_{\omega}(\mu)]-\mathbb{E}_{v\sim\mathbb{P}_g}[f_{\omega}(v)] W1(Pq,Pg)=sup∣∣fωL1EμPq[fω(μ)]EvPg[fω(v)]
这里涉及到一个概念,Lipschitz连续,就是在连续函数 f f f上限制了一个要求,存在一个常数 K ≥ 0 K \ge 0 K0,使得定义域内任意两个元素都能满足: ∣ f ( x 1 ) − f ( x 2 ) ∣ ≤ K ∣ x 1 − x 2 ∣ |f(x_1)-f(x_2)| \le K|x_1-x_2| f(x1)f(x2)Kx1x2。换句话说,这个东西限制了一个连续函数最大的局部变动幅度(导函数绝对值),而文中这个 K = 1 K=1 K=1。实际上这个数多大无所谓,只要不是无穷大,就只是放大梯度几倍的问题。
上面这个式子的含义就是在限制了变化幅度的两个采样元素中找出上界确。
这里的 ω \omega ω是可以学的一个参数,也就是说这个 f ω f_{\omega} fω是模型的一部分,靠模型去找出合适的映射函数。至于K的限制,只需要掀桌子模型内的参数范围就可以。文中跟WGAN,设置 ω ∈ [ − 0.01 , 0.01 ] d ω \omega \in [-0.01,0.01]^{d_{\omega}} ω[0.01,0.01]dω
最后的wd损失函数(根据后面的算法,我没理解错的话应该是相减再累加):
L w ( q , G s u b ) = ∑ u ∈ V ′ ( q ) f ω ( h u ) − ∑ v ∈ V ′ ( G s u b ) f ω ( h v ) \mathcal{L}_w(q,G_{sub})=\sum_{u \in V'(q)}f_{\omega}(h_u)-\sum_{v\in V'(G_{sub})}f_{\omega}(h_v) Lw(q,Gsub)=uV(q)fω(hu)vV(Gsub)fω(hv)
其中两个 V ′ V' V得到的互相对应的点。这里的一个麻烦的地方就在于所有点都匹配一次,时间复杂度是平方。文中的方法是找最大的 f ω ( h u ) f_{\omega}(h_u) fω(hu)和最小的 f ω ( h v ) f_{\omega}(h_v) fω(hv)做配对,然后第二大第二小、、、直到query图里所有点都匹配过了,再重新从匹配过的query点再来一遍,把时间复杂度转成一次方。
另一个loss就是一开始提到的主体评价方式:
L c ( q ) = max ⁡ ( c ( q ) c ^ ( q ) + ϵ , c ^ ( q ) c ( q ) ) \mathcal{L}_c(q)=\max(\frac{c(q)}{\hat{c}(q)+\epsilon},\frac{\hat{c}(q)}{c(q)}) Lc(q)=max(c^(q)+ϵc(q),c(q)c^(q))
其中 ϵ \epsilon ϵ是个非常小的数,保证分母不为0。
整体loss:
L ( q ) = ( 1 − β ) L c ( q ) − β ∣ G s u b ∣ ∑ G s u b ( i ) ∈ G s u b L w ( q , G s u b ( i ) ) \mathcal{L}(q)=(1-\beta)\mathcal{L}_c(q)-\frac{\beta}{|\mathcal{G}_{sub}|}\sum_{G^{(i)}_{sub}\in \mathcal{G}_{sub}}\mathcal{L}_w(q,G^{(i)}_{sub}) L(q)=(1β)Lc(q)GsubβGsub(i)GsubLw(q,Gsub(i))
其中 β ∈ ( 0 , 1 ) \beta \in (0,1) β(0,1)
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第7张图片
这里 f θ f_{\theta} fθ应该就是上面的算法2。

实验

数据集

[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第8张图片

实验结果

从上面的相关算法的介绍其实就可以看出,即使是非深度学习的算法,其实也不是精确结果的。
这实验量看得我头皮发麻。。。
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第9张图片
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第10张图片
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第11张图片
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第12张图片
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第13张图片
[SIGMOD 2022]Neural Subgraph Counting with Wasserstein Estimator_第14张图片
图11里,w\ PS是给了完美子结构了,效果会比直接算法要再好点,其他基本都是文章的算法优。

你可能感兴趣的:(GNN子图匹配,深度学习,人工智能)