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 大小。