作者 | Zhihong Deng
来源 | 知乎
链接 | https://zhuanlan.zhihu.com/p/143161957
编辑 | 机器学习与推荐算法
0 目录
引言
点积 vs. MLP 讲的是什么?
实验设定
实验复现
总结与展望
NCF作者回复
一些后续补充
1 引言
近期推荐系统大佬 Steffen Rendle 及其所在的 Google 研究组在 arXiv 上公开了一篇有趣的文章:
Rendle, Steffen, Walid Krichene, Li Zhang, and John Anderson. "Neural Collaborative Filtering vs. Matrix Factorization Revisited." arXiv preprint arXiv:2005.09683 (2020).
在知乎上也引起了热烈的讨论,详见“如何看待Google推荐系统大佬Steffen Rendle发文讨论何向南的NCF方法中的问题?” [1]
因为这两年主要在做深度学习+推荐,而 Xiangnan He 博士的“Neural Collaborative Filtering”可以说是这个方向上被引用次数最多并被广泛用作baseline的方法之一,自己也曾经在NCF的基础上做过拓展的工作,所以对这个问题挺感兴趣的。
文章很好读,大部分是实验和分析。先快速列一下重点,这篇文章的主要内容包括:
重访NCF论文中的实验,证明在相同的实验设定下,调参后普通的矩阵分解模型能大幅度优于MLP;
通过实验表明,MLP要学习出内积函数需要较大的模型容量与大量的训练数据,难度随着embedding的维数上升而上升;
解释在线上serving时点积函数相比MLP的优势,前者可以通过高效的最大内积搜索算法来快速找到预测分数最高的物品,后者则无高效的算法;
再快速剧透一下我的收获和思考:
使用Rendle开源的代码(仅基于numpy,没用DL库)能完美复现文章给出的实验效果(虽然没怀疑过,但不跑一下怎么有底气讲结论呢~),
不过Rendle这篇文章跑的MF和NCF论文中跑的MF在训练方法上有较大差异,这也是造成效果差异巨大的主要原因;
基于点积的方法在工业界占主导,因为我们已经有很成熟的工具(比如:Faiss)可以快速地找到点积最大的向量,读过Youtube DNN应该也会对serving问题有印象。这个点虽然大家都知道,但在设计模型时还是很值得注意的,毕竟推荐是离应用很近的一门技术,如果只追求效果,脱离了实际就没有意义了;
MLP虽然理论上是universal approximator,但用MLP来近似点积是低效的。这个点在NCF论文里也有提到一下,Rendle这篇论文进一步通过实验来证明这一点。“万能的”MLP在很多任务上都不一定是最佳选择,这也是为什么这些年这么多的工作提出了各种各样的模型结构,某种程度上都是希望引入对问题有用的归纳偏置;
推荐在某种程度上可以简化为用户和物品之间的匹配问题,为合适的用户匹配上合适的物品。但是否匹配不等价于是否相似,所以我不完全认同Rendle论文里类似“MLP-based similarities”的用词,MLP学的未必是相似性,未必要像传统的MF那样学习用户和物品共有的因素。换句话说,用户和物品是否也有一些自己独有的因素是对解决推荐问题有用的呢?这些因素是否能被MLP学习到呢?这需要进一步的研究;
We need benchmark!引用 @王鸿伟 博士的一个回答,我们需要“对一些常用的数据集引入leaderboard机制,固定train-test的划分机制,固定评价指标,这样能最大限度保证公平比较”。虽然这样难免会出现一些side effect,但总体来说对推荐领域的研究者应该是一件好事情。
接下来是正文,我把正文分为四个部分:
点积 vs. MLP 讲的是什么?
实验设定
实验复现
总结与展望
2 点积 vs. MLP 讲的是什么?
用论文的Figure 1来讲,传统的矩阵分解模型,从神经网络的角度来讲,其实就是为输入的user-item pair找到对应的user embedding 和item embedding
,然后通过对两个embedding向量进行点积,将它们聚合为模型的输出
。
而NCF中则提议用MLP来做embedding的聚合,它以user embedding和item embedding拼接所得的向量 为输入,并最终输出
。但为什么要这样做呢?
以NCF论文里的Figure 1说明,假设我们用Jaccard系数来衡量两个用户的相似性,那么根据图(a)所示的交互矩阵,与用户 最相似的应该是用户
,然后是
,最后才是
。然而在图(b)所示的二维embedding空间中,若我们根据点积(或者说余弦相似度)来算用户embedding的相似性,则我们会发现,无论我们如何放置用户
的embedding向量都无法恢复出在交互矩阵上根据Jaccard系数计算出的相似关系。
这个例子其实有一点取巧,如果embedding空间是三维的,我们显然可以找到放置 的合适位置,但如果有更多的用户呢?在真实的推荐系统中,用户数和物品数都至少是万级别以上,但embedding很少会取到256维以上,通过增加embedding维数来解决问题不太实际。那能不能在embedding空间用别的方法计算相似性呢?NCF说:让万能的MLP来试试吧!
“MLP理论上能拟合任何函数”这个说法源于DL二次兴起时代的一篇论文“Multilayer feedforward networks are universal approximators, 1989”,这篇论文从理论上证明多层感知机能以任意精度逼近任意可测函数。这也是NCF论文中用以支撑在推荐模型(特别是协同过滤)中引入神经网络的合理性的一个依据。
直觉上,将矩阵分解模型里的点积替换为MLP应该至少不会得到更差的效果。因为点积操作在带来归纳偏置的同时也限制了模型的表达能力,拥有更强表达能力并在理论上能拟合任意函数的MLP应该是更好的。但这只是最理想的情况。如果考虑到实际场景中可用的数据,这种直觉就未必正确,这也是Rendle这篇文章里试图通过实验论证的一个点。
理论上万能的MLP真的就比点积好吗?
3 实验设定
Rendle文章里反复强调的一点是,文中所有的实验设定均与NCF论文中保持一致,唯一区别是在于调参。具体来说,NCF论文中用了Movielens 1M和Pinterest两个数据集,将所有数据转为为隐式反馈。评估采用留一法,为每个用户留出最后一次点击的物品作为测试(正)样本,并从用户未点击过的物品中随机采样100件作为测试(负)样本。所以测试时,模型需要为每位用户的101件候选物品进行打分,并通过HR和NDCG两个指标来评估模型的效果。
模型的超参数包括:
embedding的维数
;
正则化系数
;
SGD的学习率
;
负采样率(每条正样本采样多少条负样本)
;
训练轮数
;
用于初始化模型系数的(标准正态分布的)标准差
。
如何调参是这篇文章挺值得学习的一点,很少有论文会好好讲。附录A.2里详细地报告了作者是如何为矩阵分解模型搜索最优参数的:
划分验证集,将每个用户倒数第二次点击的物品作为验证(正)样本,同时随机从用户未点击的数据中随机采样出100个验证(负)样本,保持和测试集的获取方式一致;
优先调整
以外的超参,经验上,其它超参取值合适时,
越大效果越好;
作者首先固定了训练轮数
,embedding维数
和标准差
,对学习率
和负采样率
进行了比较粗粒度的grid search,然后从中取较好的结果对正则化系数
进行搜索;
在粗粒度搜索的基础上,对效果较好的设定进一步做
的细粒度搜索,粒度有多细没有具体说,经过细粒度搜索得到两个数据集上矩阵分解模型的最优超参数;
尽管Rendle这篇文章反复强调实验设定相同,但实际上有两个设定需要注意:
验证集的划分方式。NCF论文原话是“To determine hyper-parameters of NCF methods, we randomly sampled one interaction for each user as the validation data and tuned hyper-parameters on it.”,所以采样方式是随机采样。这点我觉得是NCF做得不够好的一点,Rendle这篇论文保持和测试集一致的方式更好;
embedding维数
与预测因子数
的关系。在NCF论文中,GMF和MLP具有相同的
而不是
。
对于baseline里的矩阵分解模型,论文原话是“For MF methods BPR and eALS, the number of predictive factors is equal to the number of latent factors.”,也即令
来做对比实验;
而Rendle论文中认为“We think it is more meaningful to compare models with a fixed embedding dimension.”,将NeuMF模型和MLP模型中的
转换为
时,是分别令
和
。所以两篇论文里矩阵分解模型的容量是明显不同的。
此外,在训练方法上,Rendle文章的MF和NCF论文里的MF有较大不同:
Rendle:模型为bias MF,使用full-batch SGD优化binary logistic loss,学习率为0.002,epoch为256;
NCF:做了ALS和BPR两种,优化方式和损失函数不同,BPR学习率为0.01,epoch为50。
NCF跑的MF模型的超参确实没有调到最佳,但真的要调到最佳需要的时间会很久。每一个baseline,每一个超参,每一个数据集,各种因素叠加起来需要的实验次数和时间成本是令人窒息的 。。。一般对于新的模型算法,如果复现后和原论文没有太大的差异都会沿用原论文的结果。但有的模型,比如MF就不好说了,时间比较久远(但是历久弥坚),自己实现未必会得到最佳的效果。
4 实验复现
latent factor (embedding) 取64维的效果(可与NCF论文的MF模型比较):
Epoch 0: HR=0.1033, NDCG=0.0475 @2020-05-25 12:19:11.320445
Epoch 1: HR=0.4507, NDCG=0.2521 @2020-05-25 12:26:04.234156
Epoch 2: HR=0.4525, NDCG=0.2531 @2020-05-25 12:33:00.099730
Epoch 3: HR=0.4526, NDCG=0.2532 @2020-05-25 12:39:40.255205
Epoch 4: HR=0.4528, NDCG=0.2533 @2020-05-25 12:46:27.078548
Epoch 5: HR=0.4526, NDCG=0.2533 @2020-05-25 12:54:26.653348
Epoch 6: HR=0.4536, NDCG=0.2543 @2020-05-25 13:02:38.142008
Epoch 7: HR=0.4533, NDCG=0.2546 @2020-05-25 13:10:43.632583
Epoch 8: HR=0.4538, NDCG=0.2538 @2020-05-25 13:20:04.050009
Epoch 9: HR=0.4548, NDCG=0.2554 @2020-05-25 13:30:22.135731
Epoch 10: HR=0.4551, NDCG=0.2560 @2020-05-25 13:39:39.388096
... ...
Epoch 246: HR=0.7222, NDCG=0.4459 @2020-05-26 15:33:36.437923
Epoch 247: HR=0.7235, NDCG=0.4460 @2020-05-26 15:40:39.271428
Epoch 248: HR=0.7222, NDCG=0.4462 @2020-05-26 15:48:34.685802
Epoch 249: HR=0.7247, NDCG=0.4468 @2020-05-26 15:56:16.026673
Epoch 250: HR=0.7230, NDCG=0.4460 @2020-05-26 16:04:02.888203
Epoch 251: HR=0.7212, NDCG=0.4468 @2020-05-26 16:11:33.083899
Epoch 252: HR=0.7212, NDCG=0.4463 @2020-05-26 16:18:30.149317
Epoch 253: HR=0.7228, NDCG=0.4459 @2020-05-26 16:25:18.970987
Epoch 254: HR=0.7232, NDCG=0.4462 @2020-05-26 16:34:16.275064
Epoch 255: HR=0.7224, NDCG=0.4460 @2020-05-26 16:45:04.495268
Epoch 256: HR=0.7232, NDCG=0.4460 @2020-05-26 16:55:25.746647
latent factor (embedding) 取192维的效果(Rendle认为latent factor和NCF中predictive vector的维数不是对等的,让embedding的维数对等更合理):
Epoch 0: HR=0.1033, NDCG=0.0473 @2020-05-25 12:17:38.884598
Epoch 1: HR=0.4469, NDCG=0.2500 @2020-05-25 12:22:59.354701
Epoch 2: HR=0.4523, NDCG=0.2519 @2020-05-25 12:28:16.795559
Epoch 3: HR=0.4523, NDCG=0.2520 @2020-05-25 12:33:32.378438
Epoch 4: HR=0.4528, NDCG=0.2517 @2020-05-25 12:38:38.976586
Epoch 5: HR=0.4528, NDCG=0.2515 @2020-05-25 12:43:50.809455
Epoch 6: HR=0.4522, NDCG=0.2519 @2020-05-25 12:49:24.757710
Epoch 7: HR=0.4536, NDCG=0.2528 @2020-05-25 12:55:38.852400
Epoch 8: HR=0.4558, NDCG=0.2544 @2020-05-25 13:01:51.616414
Epoch 9: HR=0.4568, NDCG=0.2551 @2020-05-25 13:08:04.748113
Epoch 10: HR=0.4613, NDCG=0.2572 @2020-05-25 13:14:19.811193
... ...
Epoch 236: HR=0.7280, NDCG=0.4509 @2020-05-26 08:16:56.141805
Epoch 237: HR=0.7285, NDCG=0.4504 @2020-05-26 08:21:34.364774
Epoch 238: HR=0.7281, NDCG=0.4508 @2020-05-26 08:26:13.174173
Epoch 239: HR=0.7281, NDCG=0.4509 @2020-05-26 08:30:51.569680
Epoch 240: HR=0.7285, NDCG=0.4511 @2020-05-26 08:35:29.125432
Epoch 241: HR=0.7281, NDCG=0.4508 @2020-05-26 08:40:06.041894
Epoch 242: HR=0.7290, NDCG=0.4526 @2020-05-26 08:44:44.237962
Epoch 243: HR=0.7290, NDCG=0.4512 @2020-05-26 08:49:22.279415
Epoch 244: HR=0.7306, NDCG=0.4521 @2020-05-26 08:54:02.007358
Epoch 245: HR=0.7290, NDCG=0.4511 @2020-05-26 08:58:40.069729
Epoch 246: HR=0.7283, NDCG=0.4509 @2020-05-26 09:03:53.635225
Epoch 247: HR=0.7288, NDCG=0.4506 @2020-05-26 09:09:20.306718
Epoch 248: HR=0.7281, NDCG=0.4514 @2020-05-26 09:14:43.144485
Epoch 249: HR=0.7268, NDCG=0.4502 @2020-05-26 09:21:02.250252
Epoch 250: HR=0.7296, NDCG=0.4510 @2020-05-26 09:27:29.931265
Epoch 251: HR=0.7291, NDCG=0.4517 @2020-05-26 09:34:12.227367
Epoch 252: HR=0.7295, NDCG=0.4526 @2020-05-26 09:39:52.945344
Epoch 253: HR=0.7288, NDCG=0.4518 @2020-05-26 09:44:48.087030
Epoch 254: HR=0.7295, NDCG=0.4518 @2020-05-26 09:50:05.766447
Epoch 255: HR=0.7281, NDCG=0.4515 @2020-05-26 09:55:35.614230
Epoch 256: HR=0.7291, NDCG=0.4525 @2020-05-26 10:00:34.075762
可以看到效果是真的好~不过因为是直接用numpy跑的,没有优化速度,训练时间比较久。
5 总结与展望
Rendle这篇文章很有意思,因为最近几年做DL+推荐的论文很多都采用了NCF作为baseline并且沿用了论文里的一些结论,包括我自己在做的时候也没有做足够深入的思考。矩阵分解作为推荐领域应用最广泛的模型之一,能够取得比NeuMF更好的效果值得深思。
不过,Rendle也强调了自己这篇文章不是批判DL在推荐领域不work。这和之前ACM RecSys最佳论文针对的点有所不同(参见:如何看待RecSys 2019最佳论文认为现有DNN-based推荐算法带来的基本上都是伪提升?[2])。
这篇文章的侧重点是通过实验研究推荐模型在结合embedding时用点积还是MLP更有效?如果是考虑serving时间的话,那点积是最好的选择。而考虑效果呢?我们曾以为MLP更好,但实验告诉我们未必。
两年前做DeepCF[3]的时候,实验让我意识到MLP和MF学习的“倾向”是不同的,所以结合起来才会有不错的提升,或许从这个方向出发再做进一步研究我们也会得到一些有意思的结论吧。
6 NCF作者回复
以下是原讨论帖中NCF作者He Xiangnan的回复。
师傅终于重出推荐江湖了,而且点名了这篇文章,开心 :) 一篇非常典型的Rendle style的文章,一如既往的赏心悦目而且 insightful。讲讲我对这篇文章的一些看法:
1. 这篇文章最主要的观点是MLP难以学习向量内积。如楼上某匿名人士所说,这点并不新颖,早已是业界&学术界共识,在NCF文章的实验结果中也有体现(在embedding size较大时,MLP的结果弱于GMF),所以NCF的论文中设计了NeuMF用向量乘法来弥补MLP这方面的不足。以及我们后续SIGIR 2017 Neural Factorization Machine也在preliminary实验里论证了这一点,以及Google后续WSDM 2018 Latent Cross里也论证了这一点。Rendle这篇文章的主要贡献是从理论上分析了这一点,分析的很精彩,这个确实是功力非常深厚才能做,很佩服!
2. 关于实验结果NeuMF和GMF不如MF。这点还是有点意外的(单纯MLP不如MF是意料之中)。之前NCF论文虽然对比了MF,但对比的MF优化的loss不同:NCF优化的是log loss,MF优化的是eALS和BPR loss,这里是因为论文实验设计时,从发表角度需要和现有方法做严谨对比。在2016年时,主流的优化MF的方法是BPR和eALS,没有用log loss优化MF的。当然这个结果也反应了: a) 相同模型用不同loss优化的结果差异会很大;b) log loss和BPR、eALS比在某些情况下还是有优势的。
3. 关于NCF论文结果没有用验证集和cherry-picked(这个说法是被Recsys 19的文章带歪了)。这个还真的不是,当时做实验时是严谨的用了验证集选超参,只是验证集没有放到公开的repo里而已;当年公开论文代码和数据是为了方便后人可以复现论文的结果,所以清理出了可直接跑测试集的代码。而且当时调参粒度很粗,就已经拿到了比baselines好的结果,就没有再更多调参了。许多超参的设置基本是默认设置,比如adam的学习率。论文发表后曾有同学反映,可以找到比发表结果更好的超参,问我怎么没用...(事实当然是我没找到这样的参数)不过,调参是无止境的,论文发表最重要的是idea,实验能充分验证idea即可。
4. 关于这篇论文的主要结论:在协同过滤任务上,尤其是考虑到工业界的大规模应用需求,用向量内积要优于用神经网络。我个人也很赞同这个结论。诸多理由如Rendle论文所述,已经讲得很到位,这里就不重复了。这里主要讲一下我个人观点,用神经网络做匹配函数的价值:a) 当输入特征不仅仅是简单的one-hot user/item ID embedding时,例如有history embeddings、side information等,用神经网络做匹配函数可以学到更复杂和非线性的交互,这个还是会很有用的(见许多工业界文章,例如Google的Deep Neural Networks for YouTube Recommendation;阿里的Deep Interest Network;以及我们TOIS 2018的文章Deep Item-based CF,2018在知乎信息流推荐比赛上,单个模型就拿到了第二名的好成绩), b) 当数据规模非常大,导致不能用很大的embedding size来表示所有用户和物品、不得不用small embedding size时,用神经网络做匹配函数会优于内积, c) 召回阶段考虑到时间效率,匹配函数用内积更合适,因为可以支持fast nearest neighbor search;在精排阶段,时间效率要求不高,需要追求更精准、拟合能力更强的模型,匹配函数用神经网络更好。
---- ---分割线,2020/5/29上午补充-------
5. 距离2016年做NCF这个工作已经有4年时间了,最近随着神经网络在推荐任务的效果被质疑,这篇论文也引起了许多关注讨论和一些批评。说说四年前做这篇论文的背景、初衷和经过,希望可以澄清一些批评(当然有些批评我是赞同的,有些批评是不对的,就不一一回复了):
背景:16年初博士毕业开始做这个想法,当时的时代背景:(1)神经网络已经点燃了视觉领域,但在推荐领域还未有波澜;有几篇把深度学习和推荐结合的文章,例如wang hao的collaborative deep learning,但主要是用深度学习从side information里进行特征抽取,协同过滤还是传统方式。大家都不知道怎么把协同过滤formulate成可以用神经网络解决的问题。当然现在回头看来,NCF把协同过滤formulate成神经网络学习问题是非常简单和自然的,以及把MF表示成神经网络的一个特例也很自然,但在当时确实是很困扰推荐领域学者的一个问题。(2)深度学习编程框架还很不成熟,tensorflow刚发表0.1版没多久bug频出且可参考代码很少,最流行框架是theano(现在已经退出了历史舞台),但几乎没有theano的推荐项目(那时几乎没有深度学习+推荐的论文,更别提公开的项目了);当然现在回头看来,NCF的实现是很简单的,有各种各样深度学习推荐系统工具包可用,但在当时是几乎没有可参考代码的,摸索了半年多才做出来,具体过程如下
经过:(1) 自行摸索了theano一段时间,写出了一个theano版本的MF和NCF初版,在小数据和小embedding size上看到了一些效果,但运行速度实在是太慢了,theano实现的MF比传统java/c++实现的MF慢了1000倍都不止(当时GPU是稀缺资源,基本只有做CV的同学才能用到一点,做IR和mining的只能用CPU跑程序)。(2)为了提高方法效率,随后做了一件事,手算了NCF的微分,并用我最擅长的c++实现了这个方法,速度飞起,而且比MF-eALS和MF-BPR,两个最重要的baselines效果好,但由于微分手算,模型没法灵活调整(加一层减一层都得重新算微分,工作量可想而知)。(3) 暑假某一天看到了keras框架,发现有很便捷的方式构造深度模型,于是又用keras实现了一版NCF,也就是后来公开的版本。速度比theano的初版快很多、比c++版还是慢不少,总的来说CPU多线程并行后速度还能忍受,但评测部分ranking all items实在很慢,于是参考了前人的工作(微软www 2015),在测试时采用了负样本采样,每个正样本配对了99个负样本并排序。(4)keras版本写出来后并用负采样的测试协议进行评测,没怎么调超参,效果提升已经很明显(GMF效果优于MF-BPR和MF-eALS;以及GMF和MLP组合成NeuMF后且pretrain,进一步提升),整理实验结果并成文,在成文之前又把所有实验重新跑了一遍,确保所有结果的可复现性。至此,整个想法做了大半年,用theano、c++和keras都进行了实现,最终因keras的易用和灵活选择了这个框架。
初衷:
(1) 个性化推荐里最基础的任务就是协同过滤,希望能把协同过滤问题formulate成适合用神经网络解决的问题。所以NCF主要是为了提供一个使用神经网络解决协同过滤的通用框架,在论文Sec 3.1 General Framework里一再强调了这一点,NCF不是某个具体的一个方法,而是一个框架、一个思想,具体的input features怎么选、interaction function怎么选,都是可以自行设计的(后来许多文章引用NCF作为一个具体的方法,这么做是不对的)。
(2) 那个时候大部分神经网络的设计输出层都是sigmoid,也就是一个0和1之间的概率值,所以NCF就沿用了这个设计,并很自然的想到优化目标用log loss,可以浑然一体形成概率解释,也就是论文的Sec 3.1.1部分。有一些人质疑,为什么没有用当时最流行的pairwise BPR loss? 三个原因:(a) BPR甚至pairwise learning在当时keras框架里没有实现,如果要实现得去改底层代码,难度大,log loss可直接调用现有实现,省事;(b) 已经有很多协同过滤的论文用BPR了,但几乎没有提倡用log loss的,所以想探索一下这种方式是否有效,例如负采样率的影响,我认为是非常有意义的;(c) 天然的概率解释,框架很优雅好看。由于当时在keras里实现BPR是我认为颇有难度的事,所以我当时就压根没有去实现NCF-BPR,楼下有人diss我跑过NCF-BPR但效果不行,所以就隐瞒结果用log loss -- 这纯粹是无中生有。
(3) NCF论文中提出的特例化三个方法,GMF、MLP、NeuMF,是为了说明用神经网络学交互函数是有效的,尤其是通过更好的设计(例如NeuMF的交互函数综合了乘积和多层非线性网络)可以获得更好的效果,这是希望通过实验验证的idea,并不是说NeuMF可以赢过所有线性模型。
(4) 为什么没有用更丰富的input features,例如side info和interaction history?这篇文章最主要是想提出一个通用的神经网络框架可以做协同过滤,并验证这个想法是可行的,所以这里采用了最简单的one-hot ID embedding,其他的设计属于后续工作,例如我们SIGIR 17 Item Silk Road,TOIS 18 Deep Item-based CF等。
反思:NCF这篇论文是在深度学习尚未席卷推荐领域前做的,受限于许多因素,如上述提到的计算资源、编程框架、可参考的开源包等,探索的过程中走了很多弯路,也忽略了一些baseline或NCF变种的实现。站在4年后,现在深度学习百花齐放时代,回头看这个工作,反思一些没有做到位的地方:
(a) 测试时用了负采样,而不是all ranking:Rendle在后来的工作指出了,测试时随机负样本会造成评测的bias,不能完全反应top-k的结果;但当时这个选择是不得已而为之,在已有计算资源情况下的all ranking太慢了,而且不想用更小的数据集做实验;后来我们大部分的工作都是采用all ranking的,例如最近发表的SIGIR 2020 LightGCN;以及我们的NeuRec 2.0工具包,提供了非常快的基于c++的all ranking实现(https://github.com/wubinzzu/NeuRec)
(b) 没能充分比较MF,尤其是在log loss的框架下:当时认为现有的论文发表的MF方法都是基于BPR loss或regression loss的,所以只比较了MF-BPR和MF-eALS作为state-of-the-art,完全不曾想过要比较MF-logloss,而且GMF是MF在log loss上的泛化版,直觉上说不应该比MF-logloss差。
(c) 忽略了神经网络做交互函数时过拟合的问题。在论文投出去后,我也一直纳闷为什么MLP理论上有很强的表示能力,但实际性能缺不如MF?做了许多实验分析,发现MLP可以获得比MF低很多的training loss,但没有转化成测试集上的强泛化,反应了神经网络做交互函数时overfitting的问题,但当时用keras实现NCF时并没有考虑到加正则或dropout。
(d) 探索了MLP对向量内积的拟合缺陷,但受限于时间和贡献量,没有把探索写成NCF的期刊扩展。17年暑假做过一些模拟实验,用向量内积生成模拟数据,然后用MLP拟合,虽然可以拟合的很好,但需要大量的数据。后来看到了Google Latent Cross的工作实验分析了这一点,就没有再深入探索,直到Rendle在这篇文章中给出了理论分析,才云开雾散。
(e) 实验数据略小,且进行了比较强条件的过滤,20-core。这个主要还是受当时计算资源的限制,已经采用了当时Lab CPU server上训练时间能承受的最大规模的数据。此外,矩阵分解等线性方法在dense data上,采用比较大的embedding size效果很好,在这种设置下,神经网络难以发挥出非线性学习交互函数的优势(在sparse data以及small embedding size上较好)。
最后,Rendle也提到了,推荐系统的发展需要一些large-scale benchmark data,让各种方法都在上面公平PK,这样才能过滤出真正有用的进展。很赞同这个观点,而且已经在筹备做这个事了,接下来的几个月我们会基于NeuRec 2.0发布这样的benchmark。
---------分割线 2020/5/29下午补充----------
看到 @时雨苍剑 的讨论,回复如下:
0) “NeuMF也确实不算是比较强的baseline” - 是的,毕竟当时还是处于摸索怎么用NN做协同过滤的阶段,目前我们认为比较强的协同过滤物品推荐方法是LightGCN,欢迎大家尝试并测试效果:https://github.com/kuandeng/LightGCN
1) “遗漏了这篇文章:Johnson et al. Logistic matrix factorization...” 谢谢指正,当年确实是没有发现这篇workshop文章,第一次看到这篇文章应该是2017年,那个时候NCF已经正式发表了,也没法在reference引用了,遗憾..
2) 验证集是这样的:每个用户的训练集随机取一个交互(在剩余的训练集上调参),所以验证集大小和测试集是一样的;调完参之后,用整个训练集再用最优超参训一下模型(这里有一点确实没做到位,在选哪个epoch停的时候,是基于testing data选的,其他的超参都是在验证集上选的;客观的说,这么做虽然不是一百分的严谨,但应该不算cherry pick吧...)
---------
利益相关:题目中提到的"何向南",曾在题目中提到的"推荐系统大佬Steffen Rendle"手下做过实习,在factorization machines还没有被世人认可的时代...
参考
[1] https://www.zhihu.com/question/396722911
[2] https://www.zhihu.com/question/336304380
[3] https://github.com/familyld/DeepC