Heterophilous Distribution Propagation for Graph Neural Networks

推荐指数:2颗星
HDP不是聚集所有邻居信息,而是根据训练期间的伪标签自适应的将邻居分为同配和异配.并通过原型对比,垂直约束异配邻居分布

前人的问题

请添加图片描述

1.邻居划分的不足.已存在的方法要不不能区分同配和异配,要不简单的采用阈值去划分同配异配
2.以往的异配GNN仅仅是简单的邻居聚合
作者的贡献:
现有的异配gnn存在如上两个问题
我们提出了一种新的gnn来解决如上的问题

模型

必要的定义:

Y是nodelabel, S t r a , S t a r , S s t r u c t S^{tra},S^{tar},S^{struct} Stra,Star,Sstruct分别代表训练集(train),结构编码的目标集合(target),和trust set对于可信对比原型向量损失

模型图:

请添加图片描述

疑问:

  • S t a r g e t S^{target} Starget如何构建的
  • α l \alpha^l αl为啥是 R N × 1 \mathbb{R}^{N\times1} RN×1

方法

语义邻居划分

异配性评估

h ′ = ∣ { ( u , v ) ∣ ( u , v ) ∈ E ′ ∧ y u = y v ∧ u , v ∈ S t r a } ∣ ∣ { ( u , v ) ∣ ( u , v ) ∈ E ′ ∧ u , v ∈ S t r a } ∣ , h'=\frac{|\{(u,v)|(u,v)\in\mathcal{E}' \wedge y_u=y_v \wedge u,v\in\mathbf{S}^{tra}\}|}{|\{(u,v)|(u,v)\in\mathcal{E}' \wedge u,v\in\mathbf{S}^{tra}\}|}, h={(u,v)(u,v)Eu,vStra}{(u,v)(u,v)Eyu=yvu,vStra},
S t r a S^{tra} Stra表示训练集, E ′ ∈ { E , E 2 } \mathcal{E}^{\prime}\in\{\mathcal{E},\mathcal{E}^2\} E{E,E2}表示一阶和二阶邻居.
由于同配比 h ′ h' h不太准确,我们用超参去平衡他: λ ∈ [ 0.8 , 1.2 ] \lambda\in[0.8,1.2] λ[0.8,1.2]
h ^ = λ h ′ \widehat{h}=\lambda h' h =λh

邻居划分:

软分配 Z ∈ R N × K \mathbf{Z}\in\mathbb{R}^{N\times K} ZRN×K表示HDP预测的结果.
P u v = { z u z v T , ( u , v ) ∈ E ′ , 0 , otherwise. \mathbf{P}_{uv}=\begin{cases}\mathbf{z}_u\mathbf{z}_v^T,&(u,v)\in\mathcal{E'},\\0,&\text{otherwise.}\end{cases} Puv={zuzvT,0,(u,v)E,otherwise.

ϵ = T o p K ( P , h ^ ∣ E ′ ∣ ) \epsilon=\mathrm{TopK}(\mathbf{P},\widehat{h}|\mathcal{E'}|) ϵ=TopK(P,h E)
T o p K ( x , y ) \mathbf{TopK(x,y)} TopK(x,y)意味着x的第y大个元素.然后,我们可以得到同配邻接矩阵和异配邻接矩阵:
A u v h m = { 1 , P u v ≥ ϵ ∧ ( u , v ) ∈ E ′ , 0 , otherwise. A u v h t = { 1 , P u v < ϵ ∧ ( u , v ) ∈ E ′ , 0 , otherwise. \begin{aligned}\mathbf{A}_{uv}^{hm}&=\begin{cases}1,&\mathbf{P}_{uv}\geq\epsilon \wedge (u,v)\in\mathcal{E'},\\0,&\text{otherwise.}\end{cases}\\\mathbf{A}_{uv}^{ht}&=\begin{cases}1,&\mathbf{P}_{uv}<\epsilon \wedge (u,v)\in\mathcal{E'},\\0,&\text{otherwise.}\end{cases}\end{aligned} AuvhmAuvht={1,0,Puvϵ(u,v)E,otherwise.={1,0,Puv<ϵ(u,v)E,otherwise.

异配邻居模型

我们分三步对异配模型
1.构建节点的自我表征
2.建模每个节点的异配邻居分布
3.通过语义认知消息传播机制传播

自我表征的构建

我们语义结构编码作为属性节点的补充
1.构建结构嵌入
X ^ s t r = { [ 0 , 0 , . . . , 1 , . . . , 0 ] , i ∈ S ∗ [ 0 , 0 , . . . , 0 , . . . , 0 ] , i ∉ S ∗ \hat{\mathbf{X}}^{str} = \left\{ \begin{array}{l} [0, 0, ..., 1, ..., 0], \quad i \in S^* \\ [0, 0, ..., 0, ..., 0], \quad i \notin S^* \end{array} \right. X^str={[0,0,...,1,...,0],iS[0,0,...,0,...,0],i/S
其中, S t a r ⊂ S t r a \mathbf{S}^{tar}\subset\mathbf{S}^{tra} StarStra
最终的嵌入通过随机游走计算而得到
X s t r = ( D − 1 A ) κ X ^ s t r , \mathbf{X}^{str}=(\mathbf{D}^{-1}\mathbf{A})^\kappa\hat{\mathbf{X}}^{str}, Xstr=(D1A)κX^str,
节点的自我表征可以通过简单的MLP,建模节点特征和结构特征得到:
H e g o = M L P ( [ X ∥ X s t r ] ) \mathbf{H}^{ego}=\mathrm{MLP}([\mathbf{X}\|\mathbf{X}^{str}]) Hego=MLP([XXstr])
其中, [ ⋅ ∣ ∣ ⋅ ] [\cdot||\cdot] [∣∣]表示拼接操作

异配邻居分布

H n b = D h t − 1 A h t H e g o . \mathbf{H}^{nb}=\mathbf{D}^{ht}{}^{-1}\mathbf{A}^{ht}\mathbf{H}^{ego}. Hnb=Dht1AhtHego.
其中, D h t D^{ht} Dht: D i i h t = ∑ j A i j h t \mathbf{D}_{ii}^{ht}=\sum_j\mathbf{A}_{ij}^{ht} Diiht=jAijht

语义消息传播机制:

我们引入了语义消息传播:SMP(Semantic-aware Message Passing)
H ~ l = D h m − 1 A h m H ( l − 1 ) , α l = f φ l ( [ H 0 ∥ H ~ l ] ) , H l = α l H 0 + ( 1 − α l ) ) H ~ l \begin{aligned} &\widetilde{\mathbf{H}}^{l} =\mathbf{D}^{hm^{-1}}\mathbf{A}^{hm}\mathbf{H}^{(l-1)}, \\ &\alpha^{l} =f_{\varphi^l}([\mathbf{H}^0\|\widetilde{\mathbf{H}}^l]), \\ &\mathbf{H}^l =\alpha^l\mathbf{H}^0+(1-\alpha^l))\widetilde{\mathbf{H}}^l \end{aligned} H l=Dhm1AhmH(l1),αl=fφl([H0H l]),Hl=αlH0+(1αl))H l
其中, α l ∈ R N × 1 \alpha^l\in\mathbb{R}^{N\times1} αlRN×1被权重学习器学习得到. #question 为啥是N*1维度?
H h t = S M P ( H n b , l h t ) \mathbf{H}^{ht}=\mathrm{SMP}(\mathbf{H}^{nb},l^{ht}) Hht=SMP(Hnb,lht) H h m = S M P ( H e g o , l h m ) \mathbf{H}^{hm}=\mathrm{SMP}(\mathbf{H}^{ego},l^{hm}) Hhm=SMP(Hego,lhm)

我们可以得到最终特征:
H = [ H h m ∥ H h t ] . \mathbf{H}=[\mathbf{H}^{hm}\|\mathbf{H}^{ht}]. H=[HhmHht]. Z = f ψ ( H ) , Y ^ = arg ⁡ max ⁡ ( Z ) . \mathbf{Z}=f_\psi(\mathbf{H}), \widehat{\mathbf{Y}}=\arg\max(\mathbf{Z}). Z=fψ(H),Y =argmax(Z).

模型训练

模型初始化:

X n b = A ^ X \mathbf{X}^{nb}=\widehat{\mathbf{A}}\mathbf{X} Xnb=A X X a l l = [ X ∥ X n b ∥ X s t r ] \mathbf{X}^{all}=[\mathbf{X}\|\mathbf{X}^{nb}\|\mathbf{X}^{str}] Xall=[XXnbXstr]
Z = M L P i n i t ( X a l l ) \mathbf{Z}=\mathrm{MLP}^{init}(\mathbf{X}^{all}) Z=MLPinit(Xall)

模型优化

L c e = C E ( Z , Y ) , \mathcal{L}^{ce}=\mathrm{CE}(\mathbf{Z},\mathbf{Y}), Lce=CE(Z,Y), S t r u = { v i ∣ Z i m a x ≥ δ } \mathbf{S}^{tru}=\{v_i|\mathbf{Z}_i^{max}\geq\delta\} Stru={viZimaxδ} δ = T o p K ( Z m a x , ρ ∣ V ∣ ) \delta=\mathrm{TopK}(\mathbf{Z}^{max},\rho|\mathcal{V}|) δ=TopK(Zmax,ρV)
其中, δ = T o p K ( Z m a x , ρ ∣ V ∣ ) \delta=\mathrm{TopK}(\mathbf{Z}^{max},\rho|\mathcal{V}|) δ=TopK(Zmax,ρV)
我们可以得到原型向量:
c j = 1 ∣ S j t r u ∣ ∑ v i ∈ S j t r u h i e g o , S i t r u = { v i ∣ v i ∈ S t r u ∧ Y ^ i = j } . \begin{gathered} \mathbf{c}_{j} =\frac1{|\mathbf{S}_j^{tru}|}\sum_{v_i\in\mathbf{S}_j^{tru}}\mathbf{h}_i^{ego}, \\ \mathbf{S}_{i}^{tru} =\{v_i|v_i\in\mathbf{S}^{tru}\wedge\widehat{\mathbf{Y}}_i=j\}. \end{gathered} cj=Sjtru1viSjtruhiego,Sitru={viviStruY i=j}.
最终得到原型向量损失:
L t p c = − ∑ v i ∈ S t r u log ⁡ exp ⁡ ( s ( h i e g o , c j ) / τ ) ∑ k = 1 K exp ⁡ ( [ s ( h i e g o , c k ) ] + / τ ) ) , \mathcal{L}^{tpc}=-\sum_{v_i\in\mathbf{S}^{tru}}\log\frac{\exp(s(\mathbf{h}_i^{ego},\mathbf{c}_j)/\tau)}{\sum_{k=1}^K\exp([s(\mathbf{h}_i^{ego},\mathbf{c}_k)]_+/\tau))}, Ltpc=viStrulogk=1Kexp([s(hiego,ck)]+/τ))exp(s(hiego,cj)/τ),
其中, s ( h i e g o , c j ) = h i e g o ⋅ c j ∣ h i e g o ∣ ∣ c j ∣ . s(\mathbf{h}_i^{ego},\mathbf{c}_j)=\frac{\mathbf{h}_i^{ego}\cdot\mathbf{c}_j}{|\mathbf{h}_i^{ego}||\mathbf{c}_j|}. s(hiego,cj)=hiego∣∣cjhiegocj.

整体损失函数:
L = L c e + β L t p c \mathcal{L}=\mathcal{L}^{ce}+\beta\mathcal{L}^{tpc} L=Lce+βLtpc
请添加图片描述

结果还阔以

总结:

貌似提供了一种自适应阈值的方式,但是我仍然有如下的问题:
1.引入了超参 λ \lambda λ去放大缩小阈值.其实仍没有解决阈值问题
2.有点没读懂target是如何划分的
请添加图片描述

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 07:00:02       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 07:00:02       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 07:00:02       62 阅读
  4. Python语言-面向对象

    2024-07-18 07:00:02       72 阅读

热门阅读

  1. VSCODE 驯服日记(二)对MPE的格式进行调整

    2024-07-18 07:00:02       22 阅读
  2. 建造者模式例题

    2024-07-18 07:00:02       22 阅读
  3. Electron 配置macOS平台的安装图标

    2024-07-18 07:00:02       24 阅读
  4. jQuery 语法

    2024-07-18 07:00:02       21 阅读
  5. 71、Flink 的 Hybrid Source 详解

    2024-07-18 07:00:02       21 阅读
  6. DLMS协议中的高级安全(HLS)身份验证

    2024-07-18 07:00:02       21 阅读
  7. C++ 士兵队列训练

    2024-07-18 07:00:02       26 阅读
  8. ffmpeg中的超时控制

    2024-07-18 07:00:02       21 阅读
  9. 令牌桶|Web服务中的令牌桶设计和实现

    2024-07-18 07:00:02       24 阅读
  10. 关于Flume和Flink

    2024-07-18 07:00:02       21 阅读
  11. k8s一些名词解释

    2024-07-18 07:00:02       21 阅读