因果对比学习图神经网络:解决推荐系统中的数据偏差问题

1次阅读
没有评论

共计 1385 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

背景与痛点

推荐系统在实际应用中常面临数据偏差问题,主要包括以下几种类型:

因果对比学习图神经网络:解决推荐系统中的数据偏差问题

  • 流行度偏差 :热门物品被过度推荐,导致长尾物品曝光不足
  • 曝光偏差 :用户只能看到系统之前推荐的内容,形成反馈循环
  • 选择偏差 :用户行为数据仅反映系统历史推荐结果而非真实偏好

传统解决方法如逆倾向评分(IPS)或矩阵分解,往往无法建模复杂的因果关系。而普通图神经网络(GNN)会放大这些偏差,因为它们平等对待所有观测到的交互数据。

技术方案

1. 因果图与传统 GNN 的区别

传统 GNN 直接学习用户 - 物品交互图的表示,而因果对比学习 GNN 需要:

  1. 显式构建包含混淆变量的因果图
  2. 通过干预(intervention)分离因果效应
  3. 设计对比任务增强因果特征学习

2. 因果图构建关键步骤

# 伪代码:因果图结构定义
class CausalGraph:
    def __init__(self):
        # 混淆变量:用户活跃度、物品流行度
        self.confounders = {'user_activity': None, 'item_popularity': None} 

        # 工具变量:用户注册渠道、物品上架时间
        self.instruments = {'user_channel': None, 'item_release_time': None}

3. 对比学习设计

  • 正样本 :对同一用户进行因果干预后的表示
  • 负样本 :不同用户在相同混淆条件下的表示
  • 损失函数 :采用 InfoNCE 损失,温度参数 τ 控制难样本权重

代码实现

import torch
import torch.nn as nn

class CausalGNN(nn.Module):
    def __init__(self, hidden_size=64, tau=0.1):
        super().__init__()
        self.tau = tau  # 温度参数

        # 因果感知的消息传递层
        self.gnn_layers = nn.ModuleList([CausalGraphLayer(hidden_size) 
            for _ in range(3)
        ])

    def forward(self, user_emb, item_emb, adj):
        # 因果消息传递
        for layer in self.gnn_layers:
            user_emb, item_emb = layer(user_emb, item_emb, adj)

        # 对比损失计算
        pos_score = torch.exp(torch.sum(user_emb * item_emb, dim=-1) / self.tau)
        neg_score = ... # 负采样计算
        loss = -torch.log(pos_score / (pos_score + neg_score))

        return loss

实验分析

在 MovieLens-1M 数据集上的对比结果:

模型 NDCU@10 流行度偏差↓ 覆盖率↑
LightGCN 0.721 0.85 0.32
本文方法 0.752 0.62 0.51

关键发现:
1. 温度参数 τ =0.2 时效果最佳
2. 3 层 GNN 比更深网络表现更好

生产实践

1. 内存优化

  • 使用邻接表存储稀疏图
  • 对物品节点进行分桶采样

2. 延迟优化

  • 预计算用户 embeddings
  • 物品最近邻索引使用 FAISS

3. 常见陷阱

  • 混淆变量选择不当会导致模型退化
  • 温度参数需要在线 AB 测试调优

总结与延伸

该方法可推广到:
– 搜索排序中的位置偏差消除
– 广告 CTR 预测中的竞价干扰消除

推荐工具包:
– PyWhy (微软因果推理库)
– CausalML (Uber 开源工具)

正文完
 0
评论(没有评论)