博主以往已经整理过图神经网络用于推荐系统,整理过对比学习用于推荐系统。
而图+对比学习结合的趋势也算较为明显。本期先整理几篇WWW22的文章,SIGIR22的文章预计等文章陆续放出后补。
Improving Graph Collaborative Filtering with Neighborhood-enriched Contrastive Learning
对比学习可以缓解推荐系统中数据稀疏问题,图方法可以考虑邻域节点之间的关系,两者都对协同过滤有提升效果。因此,图+对比学习是很合适的建模思路。这篇文章提出NCL(Neighborhood-enriched Contrastive Learning)方法,主要从两方面考虑对比关系,
模型图如上图所示,即同时考虑Structural Neighbors和Semantic Neighbors。
def ProtoNCE_loss(self, node_embedding, user, item): #原型NCE loss的计算
user_embeddings_all, item_embeddings_all = torch.split(node_embedding, [self.n_users, self.n_items]) #user和item的embedding
user_embeddings = user_embeddings_all[user] # [B, e]
norm_user_embeddings = F.normalize(user_embeddings)
user2cluster = self.user_2cluster[user] # [B,],user聚类,如kmeans
user2centroids = self.user_centroids[user2cluster] # [B, e],聚类中心
pos_score_user = torch.mul(norm_user_embeddings, user2centroids).sum(dim=1) #正例分数,和聚类中心的相似度
pos_score_user = torch.exp(pos_score_user / self.ssl_temp)
ttl_score_user = torch.matmul(norm_user_embeddings, self.user_centroids.transpose(0, 1)) #所有的分数
ttl_score_user = torch.exp(ttl_score_user / self.ssl_temp).sum(dim=1)
proto_nce_loss_user = -torch.log(pos_score_user / ttl_score_user).sum()
item_embeddings = item_embeddings_all[item]
norm_item_embeddings = F.normalize(item_embeddings)
item2cluster = self.item_2cluster[item] # [B, ],item聚类,如kmeans
item2centroids = self.item_centroids[item2cluster] # [B, e],聚类中心
pos_score_item = torch.mul(norm_item_embeddings, item2centroids).sum(dim=1) #和user的操作类似
pos_score_item = torch.exp(pos_score_item / self.ssl_temp)
ttl_score_item = torch.matmul(norm_item_embeddings, self.item_centroids.transpose(0, 1))
ttl_score_item = torch.exp(ttl_score_item / self.ssl_temp).sum(dim=1)
proto_nce_loss_item = -torch.log(pos_score_item / ttl_score_item).sum()
proto_nce_loss = self.proto_reg * (proto_nce_loss_user + proto_nce_loss_item)
return proto_nce_loss
paper:https://arxiv.53yu.com/pdf/2202.06200.pdf
code:https://github.com/RUCAIBox/NCL
SimGRACE: A Simple Framework for Graph Contrastive Learning without Data Augmentation
无需数据增强的图对比学习的框架。文章的motivation源于现有的对比学习方法都在数据增强上下各种功夫,但这些数据增强方法主要存在以下问题:
因此作者提出不如直接将原始图作为输入,再加上带有扰动版本的 GNN 模型作为两个编码器,以获得两个相关视图进行对比,如上图所示的GNN Encoder和perturbed GNN Encoder。其中扰动可以按照, h = f ( G ; θ ) , h ′ = f ( G ; θ ′ ) h=f(G;\theta),h'=f(G;\theta') h=f(G;θ),h′=f(G;θ′) θ l ′ = θ l + η ⋅ Δ θ l ; Δ θ l N ( 0 , σ l 2 ) \theta'_l=\theta_l+\eta \cdot \Delta \theta_l;\Delta \theta_l ~ N(0,\sigma^2_l) θl′=θl+η⋅Δθl;Δθl N(0,σl2)
同时作者给出了大量的理论证明。不过实际上,这篇文章的思路和陈丹器大佬在做句子表征,即SimCSE模型中的做法是很类似的,即认为alignment and uniformity是对比学习中重要的两个方面。
paper:https://dl.acm.org/doi/10.1145/3485447.3512156
code:https://github.com/junxia97/SimGRACE
ClusterSCL: Cluster-Aware Supervised Contrastive Learning on Graphs
这一篇文章也是认为监督性对比学习存在问题,如上图:
如图a,(u1, u3) 或 (u2, u4) 属于同一类,但位于不同的图社区中。而 (u1, u2) 或 (u3, u4) 属于不同的类别,但具有相似的结构模式。但现有的监督对比学习方法SupCon在学习时会打破固有的集群分布,如图b。而作者提出的ClusterSCL 执行节点对比并保留集群分布,且从图c可以看到作者实现了更简单的决策边界。
具体来说,作者提出了用于图学习任务的集群感知监督对比学习损失,ClusterSCL 。其主要思想是在监督对比学习期间以节点集群分布的形式保留图的结构和属性属性。即ClusterSCL 引入了集群感知数据增强策略,并将其与监督对比SupCon损失相结合。具体过程如下,是三个隐聚类簇的学习过程。
p ( s i ∣ v i ) = ∫ p ( c i ∣ v i ) p ( s i ∣ v i , c i ) d c i p(s_i|v_i)=\int p(c_i|v_i)p(s_i|v_i,c_i)dc_i p(si∣vi)=∫p(ci∣vi)p(si∣vi,ci)dci
paper:https://dl.acm.org/doi/10.1145/3485447.3512207
code:https://github.com/wyl7/ClusterSCL