【阅读笔记】图对比学习 GNN+CL

🎯来源:  https://mp.weixin.qq.com/s/X7gxlcY-PaQ97MiEJmKfbg

对给定的大量无标注图数据,图对比学习算法旨在训练出一个图编码器,目前一般指图神经网络(Graph Neural Network, GNN)。由这个 GNN 编码得到的图表示向量,可以很好地保留图数据的特性

Graph Contrastive Learning with Augmentations. NeurIPS 2020.

算法步骤:

1. 随机采样一批(batch)图

2. 对每一个图进行两次随机的数据增强(增删边/舍弃节点)得到新图(view)

3. 使用待训练的 GNN 对 View 进行编码,得到节点表示向量(node representation)和图表示向量(graph representations) 

4. 根据上述表示向量计算 InfoNCE 损失,其中由同一个 graph 增强出来的 view 的表示相互靠近,由不同的 graph 增强得到的 view 的表示相互远离;【特征被加强】


【启发式图数据增强】由于图数据经过GNN 后会产生 节点表示图表示 两个层次的表示向量Contrastive Multi-View Representation Learning on Graphs. ICML 2020. 设计实验对不同层次的对比进行分析,发现将节点表示与图表示进行对比会取得更好的效果。芜湖~

【Learning方法图数据增强】JOAO:通过对抗训练(adversarial training)的方式,迭代训练选择每种数据增强方式【半自动】的概率矩阵,并对应更换 GraphCL 中的映射头(projection head)。实验结果表明,对抗训练学习得到的概率矩阵和此前 GraphCL 关于数据增强选择的实验结果趋势相近,并在不需要过多人工干预的情况下达到了有竞争力的结果。

【全自动】自动学习数据增强时对图做扰动的分布。Adversarial Graph Augmentation to Improve Graph Contrastive Learning 作者从数据增强如何保留图的信息出发,假设增强出的两个 View 之间并不是互信息越大越好,因为这些互信息中可能包含大量噪音。作者引入信息瓶颈 (Information Bottleneck)原则,认为更好的 View 应该是在共同保留图本身的特性这一前提下,彼此之间的互信息最小。即在训练中,学习如何通过增强保留 graph 中的必要信息,并同时减少噪音。基于这一原则,作者设计了 min-max game 的训练模式,并训练神经网络以决定是否在数据增强中删除某条边。【剪枝策略?】


【训练中负例的选择】方法在训练过程中同时进行聚类;为负样本设计了打分函数,将负样本从易到难地排序,并依次学习【候选】        CuCo: Graph Representation with Curriculum Contrastive Learning

### 图神经网络与迁移学习的应用场景 图神经网络(GNNs)通过聚合邻域节点的信息来学习节点嵌入,从而有效地处理图结构数据[^1]。当涉及到迁移学习时,这种特性使得GNN能够在不同领域之间传递知识。 #### 应用场景 1. **跨领域推荐系统** 推荐系统的成功依赖于捕捉用户行为模式的能力。利用GNN可以建模用户-物品交互形成的复杂网络结构。而迁移学习则允许模型将在一个领域的学到的知识迁移到另一个相似但不同的领域中去。例如,在电影评分预测上训练好的GNN可以直接应用于音乐偏好预测任务中,只需微调部分参数即可适应新环境下的分布差异。 2. **生物医学研究** 生物分子之间的相互作用构成了复杂的网络形式,如蛋白质-蛋白质互作网(PPI)或者药物靶点关联图谱。借助迁移学习框架下预训练过的大型PPI数据库上的GNN模型,研究人员可以在较小规模的数据集上更快地获得高质量的结果,加速新型疾病机制探索过程或是发现潜在治疗方案。 3. **社交网络分析** 社交媒体平台上存在着大量的人际关系链路构成的巨大社会图景。对于那些希望理解社区动态变化趋势的企业而言,他们往往面临着缺乏标注样本的问题。此时如果能先在一个拥有充足标签信息的其他社交平台之上预先训练好相应的GNN架构,则可以通过简单的调整迅速部署至目标环境中开展深入洞察工作。 ### 实现方式 一种常见的做法是在源域(即有较多可用标记实例的地方)上充分训练基础版GNN作为初始化权重;接着针对特定目标任务选取合适的损失函数指导下游finetune阶段的学习进程。具体来说: ```python import torch.nn as nn from dgl import DGLGraph from dgl.nn.pytorch.conv import GraphConv class GCN(nn.Module): def __init__(self, in_feats, h_feats, num_classes): super(GCN, self).__init__() self.conv1 = GraphConv(in_feats, h_feats) self.conv2 = GraphConv(h_feats, num_classes) def forward(self, g: DGLGraph, features): h = self.conv1(g, features) h = F.relu(h) h = self.conv2(g, h) return h # 假定已经加载好了两个图g_source 和 g_target 及其对应的feature矩阵features_source/features_target model = GCN(features_source.shape[1], hidden_size=16, num_classes=num_class).to(device) optimizer = optim.Adam(model.parameters(), lr=learning_rate) for epoch in range(num_epochs): model.train() logits = model(g_source, features_source) loss = criterion(logits[train_mask], labels[train_mask]) optimizer.zero_grad() loss.backward() optimizer.step() # Fine-tuning on target domain with frozen layers or lower learning rate. for param in model.named_parameters(): if 'conv' not in param[0]: param[1].requires_grad_(False) fine_tuner_optimizer = optim.SGD(filter(lambda p:p.requires_grad,model.parameters()),lr=fine_tune_lr,momentum=momentum) for fine_epoch in range(fine_tune_epochs): ... ``` 上述代码片段展示了一个简单版本的两层GCNs如何被用来做迁移学习的例子。这里假设有一个源域`source_domain_data=(g_source,features_source)`和一个目标域`target_domain_data=(g_target,features_target)`。首先在整个源域数据集中进行完整的训练周期以获取较好的泛化性能;然后再切换到只更新某些选定层的方式继续优化直至收敛为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值