跳转至

NGCF

NGCF 把图神经网络用到协同过滤里。

MovieLens 很自然可以看成图:用户通过评分连接到电影。一个用户的表示应该受他看过的电影影响,一部电影的表示也应该受看过它的用户影响。

NGCF 会在用户-电影图上传播信息,并在消息传递时加入神经网络变换。相比普通矩阵分解,它显式使用了高阶邻居:通过电影连起来的用户,通过用户连起来的电影,以及更远的结构。

第一版要控制图规模,或者先做采样。完整图训练可能比较重。写完以后建议和 LightGCN 对比,因为 LightGCN 正好在问:NGCF 里那些额外神经网络组件到底是不是必要的。

flowchart LR
  U[用户] --> M[电影邻居]
  M --> U2[更新用户表示]
  U2 --> M2[更远电影]

NGCF 的消息传递比 LightGCN 更复杂。它会在传播过程中加入特征变换和非线性,让模型有更强表达能力。但表达能力更强不代表一定更好。后来的 LightGCN 之所以重要,就是因为它证明了很多时候简单传播已经足够强。

在 MovieLens 上,第一版可以先保留评分大于等于 4.0 的边。训练目标可以用 BPR:用户喜欢过的电影应该比采样负样本排得更靠前。

调试时不要一开始跑全图。先拿一个子图确认边、节点编号、负采样和 loss 都对,再扩大规模。

运行

默认全量运行:

./06-graph-recommendation/ngcf/run.sh --sample-ratings none --num-workers 8 --save-checkpoints --checkpoint-every 0

【非主线】想先快速试跑:

./06-graph-recommendation/ngcf/run.sh --sample-ratings 2000000 --num-workers 8 --save-checkpoints --checkpoint-every 0

默认命令只保存 checkpoints/best.pt。报告会写入验证指标、测试指标、推荐样例和 checkpoint 大小。