NeuMF — 用神经网络替掉推荐系统的内积
是什么
NeuMF(Neural Matrix Factorization)是把传统推荐里用户向量乘物品向量的那一步,换成让神经网络自己学怎么乘的方法。
日常类比:你想猜一个人会不会喜欢某部电影。
- 老办法(矩阵分解 MF):把人和电影都变成一组数字(向量),两组数字对位相乘再加起来得分高就推荐。这个加法是写死的。
- NeuMF:把两组数字交给一个小神经网络,让它自己学怎么把这两组数字揉成分数。揉的方式不再是写死的内积,而是网络自己学出来的非线性函数。
一句话:把推荐系统里那个固定的「打分公式」换成一个可训练的小网络。
为什么重要
不理解 NeuMF,下面这些事都没法解释:
- 为什么 2017 年之后所有大厂推荐论文(DeepFM / Wide&Deep / DIN / Two-Tower)都长成「双塔 + 深度网络」的样子
- 为什么推荐系统从「数学优化题」(SVD / ALS / BPR)一夜之间变成「调神经网络」
- 为什么 2020 年 Rendle 团队又发论文说「调好的点积其实打得过 NeuMF」,引发了一场延续几年的争论
- 为什么现在面试推荐岗,候选人开口就讲 embedding、MLP、点击率预估——这套词汇表是 NeuMF 之后才标准化的
核心要点
NeuMF 的结构可以拆成 三块:
-
GMF(广义矩阵分解):把 MF 的内积写成「对位相乘 + 一层线性」。等价于 MF,但留了一个可学的权重——网络可以自己决定哪些维度更重要。
-
MLP(多层感知机):把用户 embedding 和物品 embedding 拼起来(concat,不是相乘),喂给几层全连接。让网络自己学交互方式,不假设是乘法。
-
融合:GMF 和 MLP 并联跑,最后一层把两边的输出拼起来再过一层线性,输出一个 0-1 的分数(用户会不会点这个物品)。
训练目标是二分类的 log loss:观察到的交互算正样本,没观察到的随机采几个当负样本。
实践案例
案例 1:MF 内积长什么样
最简单的 MF:用户 u 的向量是 p_u,物品 i 的向量是 q_i,预测分数是
y_hat(u, i) = p_u · q_i = Σ_k p_uk × q_ik每一维对位相乘再求和,权重全是 1,没法调。
GMF 把它改成:
y_hat(u, i) = h^T (p_u ⊙ q_i)⊙ 是对位相乘,然后再过一个可学的向量 h。当 h 全 1 时退化为 MF——所以叫「广义 MF」。
案例 2:MLP 分支干了什么
input = [p_u; q_i] # 拼接,不是相乘h1 = ReLU(W1 · input + b1)h2 = ReLU(W2 · h1 + b2)...out_mlp = h_L注意:MLP 的输入是「拼接」而不是「相乘」。这一步是 NeuMF 区别 MF 的关键——它放弃了「交互必须是乘法」的假设,让网络自己学。
案例 3:NeuMF 怎么把两边融合
out = sigmoid( h^T [out_gmf; out_mlp] )GMF 出来的向量和 MLP 出来的向量拼成一根,再过一层线性 + sigmoid,输出预测的点击概率。
训练前先单独预训练 GMF 和 MLP,再用它们的 embedding 初始化 NeuMF——论文报告这样收敛更快、效果更好。
案例 4:训练时的负采样
每个用户对每个物品的「正样本」是已观察的交互(看过 / 点过),负样本怎么来?最简单的办法:
for (u, i) in 正样本: for _ in range(K): j = 从全体物品里随机采一个 u 没交互过的 把 (u, j) 当负样本,标签 0K 一般取 4-7。负样本太少学不动;太多会让模型偏向「全部预测不喜欢」。这个设计后来被几乎所有隐式反馈推荐论文继承。
踩过的坑
-
隐式反馈的「0」是双关:用户没点的物品,可能是「不喜欢」也可能是「没看到」。不能像评分预测那样直接拟合 0/1,要靠负采样——每个正样本随机配几个负样本,避开「全是 0 学不出东西」的陷阱。
-
embedding 维度不是越大越好:维度大表达力强但容易过拟合。NeuMF 论文里 8 / 16 / 32 / 64 都试过,不同数据集最优点不同。
-
HR@10 / NDCG@10 的采样评估有坑:论文用「正样本 + 采 99 个负样本,看正样本能不能排进前 10」。Krichene & Rendle 在 KDD 2020 指出这种采样评估和全量排序结果可能不一致,有时候把好模型评成差模型。
-
MLP 替代点积理论可以,实践很难:理论上 MLP 是万能逼近器,能学出任何函数包括点积。但 2020 年 Rendle 团队的复现实验表明:要让 MLP 真的学到接近点积的精度,需要的参数量和数据量都比 MF 多得多。调好的 MF 可以打回 NeuMF——这场争论让推荐学界重新审视「深度学习真的赢了吗」。
适用 vs 不适用场景
适用:
- 隐式反馈的 top-K 推荐(点击 / 收藏 / 购买)
- 用户和物品都有充足交互数据,能撑起 embedding 训练
- 离线评估为主、对延迟不极端敏感的场景
不适用:
- 显式评分预测(1-5 星打分)——NeuMF 是为隐式反馈设计的
- 严重冷启动(新用户新物品没交互)——embedding 学不出来,要靠内容特征
- 极致低延迟召回——双塔模型 + ANN 索引才是标配,NeuMF 这种「user × item 一起喂网络」的形式没法做近似最近邻
历史小故事(可跳过)
- 2009 年:Koren 拿 SVD++ 赢 Netflix Prize,矩阵分解封神
- 2009 年:Rendle 提出 BPR,把 pairwise 排序损失带进推荐
- 2016 年:Google 发 Wide & Deep,第一次把「线性 + 深度」并联架构推广到工业推荐
- 2017 年 4 月:He Xiangnan 团队发 NeuMF(WWW 2017),把 Wide & Deep 思想做成通用学术 baseline,引爆深度推荐论文潮
- 2020 年:Rendle 等人发 RecSys 短论文,把 MF 调到极致,证明「NeuMF 没真的赢 MF」,争议至今未平
学到什么
- 「把固定公式换成神经网络」是深度学习应用的通用套路——CV 把 SIFT 换成 CNN,NLP 把词袋换成 Transformer,推荐把内积换成 MLP,思路是同一个
- 并联架构(GMF + MLP)的设计哲学:让网络同时保留「线性能学到的」和「非线性才能学到的」,最后一层融合
- 基线很重要:一个领域的「新方法是不是真的更好」,往往要等几年后有人把旧方法调到极致才能下定论
- 评估方法决定结论:采样 HR/NDCG vs 全量排序,可能给出完全不同的模型排名
延伸阅读
- 论文 PDF:He et al. 2017 — Neural Collaborative Filtering(10 页,代码也开源)
- 反方论文:Rendle et al. 2020 — Neural Collaborative Filtering vs. Matrix Factorization Revisited(RecSys 短论文,必读)
- 评估方法的坑:Krichene & Rendle 2020 — On Sampled Metrics for Item Recommendation
- 中文讲解:王喆《深度学习推荐系统》 第 3 章把 NeuMF 串进整个推荐演化史
关联
- wide-and-deep —— 并联架构的工业前辈,NeuMF 的思想雏形
- deepfm —— 把 FM 和 DNN 并联,NeuMF 之后最有影响力的改进
- two-tower —— 把 user / item 塔分离用于近似最近邻召回
- bpr-2009 —— pairwise 排序损失,NeuMF 的隐式反馈训练范式前身
- matrix-factorization —— NeuMF 试图替代的对象,2020 年又被证明并未真正被替代
- attention —— 后续 DIN 把注意力机制引入推荐,沿用 NeuMF 的 embedding + DNN 框架
- pytorch —— NeuMF 官方代码原本是 Keras,PyTorch 复现是后续学界主流