《DC-GNN: Decoupled Graph Neural Networks for Improving and Accelerating Large-Scale E-commerce Retrieval》(WWW’22)
在工业场景中,数百亿节点和数千亿的边直接端到端的GNN-based CTR模型开销太大,文章把整个GNN框架解耦成三阶段:预训练、聚合、CTR。
但实际上文章是把计算开销前移,将图卷积的计算开销转换成了采样子图的计算开销。
图与数据集
用Taobao近7天的记录作为数据集,有三类节点:user、query和item,每个节点都有丰富的节点属性:设备、年龄等。
有三类边:query搜索item、用户浏览item、用户搜索query。
一共9亿节点、100亿条边。
方法
预训练
每个节点先用RW生成 三个 该节点的子图,然后在子图上用GNN encoder对节点进行卷积编码,得到节点的embedding,然后两个预训练任务:
Link Prediction
L l i n k = ∑ ( q , i p ) ∈ E ( − log σ ( f s ( q , i p ) ) − ∑ k log ( 1 − σ ( f s ( q , i n k ) ) ) ) \mathcal{L}_{l i n k}=\sum_{\left(q, i_{p}\right) \in \mathcal{E}}\left(-\log \sigma\left(f_{s}\left(q, i_{p}\right)\right)-\sum_{k} \log \left(1-\sigma\left(f_{s}\left(q, i_{n}^{k}\right)\right)\right)\right) Llink=(q,ip)∈E∑(−logσ(fs(q,ip))−k∑log(1−σ(fs(q,ink))))
有边连接的是正例,然后采集k个负例,负例用到了难负样本挖掘:
一种是选择K-hop的节点作为负样本,K可以控制难易程度;一种是在维持图结构不变的情况下,将一个正样本替换成全局采得负样本。
文章认为这两种做法都可以强化GNN更加注意节点的属性学习上,避免GNN过分依赖图结构特征,从而缓解over-smoothing。
Multi-view graph contrastive learning
第二个子图和第三个子图得到的embedding,进行对比学习,同一个节点在两个视图的embedding是正例,不同节点是负例。这里只考虑同一类节点之间计算InfoNCE loss,因此会有三个对比学习loss。
所有的loss加起来是total loss:
L q u e r y = ∑ q 1 ∈ v q − log exp ( w f s ( q 1 , q 2 ) ) ∑ v ∈ exp ( w f s ( q 1 , v 2 ) ) L u s e r = ∑ u 1 ∈ v u , v u ∈ V − log