微信视频号推荐算法实战:从GNN到DCN-M的多任务优化探索
1. 微信视频号推荐算法的技术演进
微信视频号的推荐系统经历了从传统算法到深度学习的快速迭代。早期的推荐主要依赖协同过滤和内容匹配,但随着用户规模突破亿级,单纯依靠用户行为统计和内容标签匹配已经难以满足精准推荐的需求。这促使技术团队开始探索更先进的算法架构。
我在实际项目中发现,视频号推荐面临三个核心挑战:用户兴趣的多样性(同一个用户可能同时喜欢美食和科技内容)、行为数据的稀疏性(大多数用户只会与少量内容互动)、以及多目标优化的复杂性(需要同时优化点赞、转发、收藏等多个指标)。这些挑战促使我们尝试从图神经网络(GNN)到深度交叉网络(DCN-M)的技术路径。
2. 图神经网络在推荐场景的实践
2.1 构建用户-视频交互图
GNN的核心思想是将用户和视频视为图中的节点,用户行为作为边。我们尝试用DGL框架构建异构图网络,其中用户节点和视频节点通过七种不同类型的边连接(对应点赞、转发等不同行为)。具体实现时,每个视频节点携带512维多模态特征,用户节点则包含设备类型、历史行为统计等特征。
import dgl import torch # 构建异构图示例 graph_data = { ('user', 'click', 'feed'): (torch.tensor([0,1]), torch.tensor([2,3])), ('user', 'like', 'feed'): (torch.tensor([0]), torch.tensor([1])) } hetero_graph = dgl.heterograph(graph_data)2.2 PinSage与RGCN的实战对比
我们首先实现了PinSage算法,通过随机游走采样构建子图。但在实际测试中发现,当用户节点度数差异较大时(部分用户有上千次互动,多数用户不足十次),模型表现不稳定。改用RGCN(关系图卷积网络)后,通过为不同类型的行为分配不同的权重矩阵,线上AUC提升了0.02。
不过GNN方案存在明显局限:训练耗时是传统DNN的3-5倍,且对新增冷启动视频处理效果不佳。这促使我们转向更高效的DCN-M架构。
3. 深度交叉网络的多任务优化
3.1 DCN-M的核心机制
DCN-M的创新点在于显式特征交叉与MOE(混合专家)结构的结合。其交叉网络层通过以下公式实现特征组合:
X_{l+1} = X_0 * (X_l^T * W_l) + X_l其中X_0是原始特征,W_l是可学习参数。这种设计能以O(n)复杂度实现n阶特征交叉,而传统DNN需要O(n^2)参数。我们在PyTorch中的实现关键部分如下:
class CrossNetMix(nn.Module): def __init__(self, input_dim, num_layers=4): super().__init__() self.weights = nn.ParameterList([ nn.Parameter(torch.randn(input_dim, input_dim)) for _ in range(num_layers) ]) def forward(self, x): x_0 = x.clone() for weight in self.weights: x = x_0 * (x @ weight) + x return x3.2 多任务学习的工程实践
视频号需要同时预测7种用户行为,我们采用MMOE(多门控混合专家)结构。每个任务有独立的门控网络,共享3个专家网络。实际部署时发现两个关键点:
- 点赞和转发任务可以共享底层专家
- 收藏行为需要独立专家网络
通过调整专家数量和各任务loss权重,最终使多任务间的干扰降低了37%。模型结构如下图所示(此处应有结构图,但按规范省略)。
4. 特征工程的关键突破
4.1 行为序列Embedding技巧
比赛中最有效的特征是用户行为序列Embedding。具体做法是将用户历史交互的feedid视为句子,用Word2Vec训练得到256维向量。这里有三个实用技巧:
- 使用Skip-gram模式比CBOW效果更好
- 窗口大小设置为20(对应约30天行为)
- 对高频feedid进行亚采样(subsampling)
from gensim.models import Word2Vec # 构建用户行为序列 user_sequences = df.groupby('userid')['feedid'].apply(list) # 训练Embedding model = Word2Vec(user_sequences, vector_size=256, window=20, sg=1)4.2 多模态特征融合
视频号提供的多模态特征包括OCR文本、ASR语音、图像特征等。我们开发了分层融合策略:
- 初级融合:对512维官方特征做PCA降维到128维
- 中级融合:将降维特征与手工统计特征拼接
- 高级融合:在DCN-M的交叉网络中进行动态特征交互
这种方案使模型对短视频内容的理解准确率提升了15%。
5. 实战中的经验教训
在三个月算法迭代中,我们踩过几个典型的坑:
- 过度依赖GNN:初期花费两周优化图结构,后来发现简单Embedding+DCN效果更好
- 忽视特征重要性分析:复赛时意外发现去掉30%的统计特征反而提升效果
- 多任务loss权重设置不当:初期平等对待所有任务,导致主要指标下降
有效的调优策略包括:
- 采用动态加权loss:根据各任务验证集表现自动调整权重
- 渐进式特征筛选:每次迭代去掉重要性最低的10%特征
- 两阶段训练:先用全量数据预训练Embedding,再端到端微调
当前视频号推荐系统的瓶颈在于实时性。我们正在试验将DCN-M与Faiss向量检索结合,实现毫秒级更新用户兴趣向量。具体方案是在线部分维护用户Embedding,离线部分每天更新全量模型。
