跳转到内容

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 的结构可以拆成 三块

  1. GMF(广义矩阵分解):把 MF 的内积写成「对位相乘 + 一层线性」。等价于 MF,但留了一个可学的权重——网络可以自己决定哪些维度更重要。

  2. MLP(多层感知机):把用户 embedding 和物品 embedding 拼起来(concat,不是相乘),喂给几层全连接。让网络自己学交互方式,不假设是乘法。

  3. 融合: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) 当负样本,标签 0

K 一般取 4-7。负样本太少学不动;太多会让模型偏向「全部预测不喜欢」。这个设计后来被几乎所有隐式反馈推荐论文继承。

踩过的坑

  1. 隐式反馈的「0」是双关:用户没点的物品,可能是「不喜欢」也可能是「没看到」。不能像评分预测那样直接拟合 0/1,要靠负采样——每个正样本随机配几个负样本,避开「全是 0 学不出东西」的陷阱。

  2. embedding 维度不是越大越好:维度大表达力强但容易过拟合。NeuMF 论文里 8 / 16 / 32 / 64 都试过,不同数据集最优点不同。

  3. HR@10 / NDCG@10 的采样评估有坑:论文用「正样本 + 采 99 个负样本,看正样本能不能排进前 10」。Krichene & Rendle 在 KDD 2020 指出这种采样评估和全量排序结果可能不一致,有时候把好模型评成差模型。

  4. 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」,争议至今未平

学到什么

  1. 「把固定公式换成神经网络」是深度学习应用的通用套路——CV 把 SIFT 换成 CNN,NLP 把词袋换成 Transformer,推荐把内积换成 MLP,思路是同一个
  2. 并联架构(GMF + MLP)的设计哲学:让网络同时保留「线性能学到的」和「非线性才能学到的」,最后一层融合
  3. 基线很重要:一个领域的「新方法是不是真的更好」,往往要等几年后有人把旧方法调到极致才能下定论
  4. 评估方法决定结论:采样 HR/NDCG vs 全量排序,可能给出完全不同的模型排名

延伸阅读

关联

  • 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 复现是后续学界主流

反向链接

  • attention —— Attention Is All You Need
  • bpr-2009 —— BPR — 用『i 比 j 更受欢迎』替代『i 是正例 j 是负例』
  • pytorch —— PyTorch — 深度学习主流框架