先为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' ∀u∈V,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)}) q−error=max(max(1,c′)max(1,c),max(1,c)max(1,c′))实现,其中 c ′ c' c′是预测值, c c c是真实值。
符号表:
这种算法会先把查询图分成更小的子图,然后小图去做subgraph counts再把结果合起来。
这种算法是基于小图间彼此独立的设想,但这在真实的大图上显然不成立。
直白点理解就是,假设查询图有好几个模块,然后把模块单独拆出来匹配,完成后再拿几根线把几个模块重新连起来就行了。但实际上真实的图错综复杂,根本就剪不出这些模块,就会出现同时属于多个模块的点错乱,自然就会漏掉很多匹配的情况。
这种算法会先从data图里采样出子图,然后拿这些图去匹配query图,再统计结果。
这种算法比基于统计的看起来更不行,性能直接会被采样算法打折扣,尤其是当图变得比较复杂,更难把适合的子图全挖出来。
现有的一些算法:
关于active learning:
类似于半监督学习,区别是会让模型自己判断哪些数据更重要(根据信息熵),以获取更重要的标签信息。在同样数量的标签下,这样做会比纯监督学习要好。
其中需要展开细节的部分:点候选和子集候选怎么选,以及Wasserstein Estimator(WEst)的实现
首先要对data图进行完全候选过滤。
完全候选集的意思就是找出data图中所有能和query图中的点构成映射关系的点的集合。
这里用的是GraphQL算法,这算法能选出最小的完全候选集合。
过程分为两块,局部和全局。
最后得到的就是点候选了。
假设已经得到了整张query图的候选点集 C S ( q ) = ∪ u ∈ V ( q ) C S ( u ) CS(q) = \cup_{u\in V(q)}CS(u) CS(q)=∪u∈V(q)CS(u),那要提取的子结构就是两端都是这些点的所有边,和这些点合成的data子图。
顶点的标签和度能够作为初始特征。因为度和标签都比较小,所以会把他们同构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=1kMP∀v′∈N(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;u∈V(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;v∈V(Gsub)}
这里有个疑问,mean的结果为什么还是二进制的?
文章里的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是排列不变的单射函数,选择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ω∣∣L≤1Eμ∼Pq[fω(μ)]−Ev∼Pg[fω(v)]
这里涉及到一个概念,Lipschitz连续,就是在连续函数 f f f上限制了一个要求,存在一个常数 K ≥ 0 K \ge 0 K≥0,使得定义域内任意两个元素都能满足: ∣ 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)∣≤K∣x1−x2∣。换句话说,这个东西限制了一个连续函数最大的局部变动幅度(导函数绝对值),而文中这个 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)=∑u∈V′(q)fω(hu)−∑v∈V′(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)
这里 f θ f_{\theta} fθ应该就是上面的算法2。
从上面的相关算法的介绍其实就可以看出,即使是非深度学习的算法,其实也不是精确结果的。
这实验量看得我头皮发麻。。。
图11里,w\ PS是给了完美子结构了,效果会比直接算法要再好点,其他基本都是文章的算法优。