推荐系统resys小组线下活动见闻2009-08-22

http://www.tuicool.com/articles/vUvQVn

不久前,始于2006年的 netflix prize 名花有主,几年来一直领先的Bellkor队得到了最后的冠军及100万美元的奖金。但就在Bellkor队提交的结果实现跨越性的成绩之后到30天后比赛正式结束,中间还发生了很多风起云涌的趣事。其中就有The Ensemble组加入争夺,该组内有几名中国人。

就在netflix prize结束不久,国内搞个性化推荐的研究者或从业者聚集在一起,在google group上开通了一个名为 resys 的交流组。初期组里的交流非常激烈,不久后就开展了第一次的线下活动,也就是上周,在奇遇花园,由The Ensemble组的成员xlvector主讲参加netflix prize的经历与算法体系。我是一个有一定学术背景,但已经一年来基本脱离这个圈子的人,本着对本行业理论知识的渴求去听,得到的收获可谓颇丰。之前没时间整理总结一下,这回可不能再偷懒了。

先用照片简单介绍一下聚会情况,然后再总结一下算法方面的东西。

奇遇花园当天下午过来参加聚会的人数近30人

奇遇花园当天下午过来参加聚会的人数近30人

xlvector同学在讲参加netflix prize的经历和算法

xlvector同学在讲参加netflix prize的经历和算法

wangyt同学在讲RBM

wangyt同学在讲RBM

会后与clickstone及NP的合影

会后与clickstone及NP的合影

散会后的讨论依旧很热烈

散会后的讨论依旧很热烈

会上xlvector所用的PPT可以从 这里 看到,这里讲的算法严格地说是从netflix数据集里根据RMSE的目标衍生出来的一个算法体系,实际的商用推荐系统或者说广泛意义上的学术界上的推荐系统,则是另外的一套体系。比如,商用推荐系统,类别比较多,不同的类别的推荐系统可能都不一样,即使同是电影推荐系统,商用推荐系统除了打分因素,还会考虑其它的因素(如语义),作为评判标准的需求方面不单是RMSE,还有多样性,点击率等等。而广泛意义的学术界上的推荐系统,关于推荐质量的评估体系本就不统一,RMSE属于是精确度这一维度中的一种量化指标,其它还有如多样性、可解释性等等难以量化的指标。而工程上的实现还需要考虑计算效率、稀疏性、存储量、分布并行等许多问题。

但由netflix衍生出来的那套算法体系还是有意义的,它毕竟在一个统一的框架里,描绘了在一种确定的量化指标的情况下,怎样才可以把推荐系统里的一些共性的问题解决得最好。

按照报告所讲的内容,这套体系里的算法主要可以分为以下几类,这个我按照出现时间顺序叙述为:KNN和邻域模型;矩阵分解与降维;Boltzmann机和RBM;时间相关的模型。

  • KNN和邻域模型:是很基本很符合人的认识的一种推荐方式,分为user-based和item-based两种。他们的核心都是根据user-item-rating打分记录,计算相似度矩阵,然后进行推荐。user-based是根据打分记录计算出用户之间的相似度矩阵,然后把跟你相似的用户喜欢的而你没收藏过的条目推荐给你。item-based是根据打分记录计算出条目之间的相似度矩阵,然后根据你喜欢的条目,把跟这些条目相关的而你又没收藏过的条目推荐给你。实际使用因为用户相似度矩阵通常要比条目相似度矩阵要大得多,所以item-based的方法使用比较广泛。
  • 矩阵分解与降维:通常是SVD,理论上SVD分解可以把一个user-item-rating的矩阵M分解成M=U*D*V的形式,U是用户特征矩阵,V是条目特征矩阵,D是包含特征值从大到小排序的对角矩阵。只取D中的前K个有效元素,后面的置0,U*D就得到一个降维后的用户特征矩阵,V*D就得到一个降维后的条目特征矩阵,对这两个特征矩阵进行比较,就知道哪些用户跟哪些条目更相近了。SVD有解析上的分解方法,但如果矩阵规模很大,这一步会非常慢,所以netflix prize上使用的都是迭代的方法,每次输入一个user-item-rating记录,用EM算法进行迭代求优,直至求得最优值。这种方法及其升级版本的SVD++算法据xlvector说是单个模型的性能的极限。
  • Boltzmann机和RBM:Boltzmann机很早以前我就知道是把模拟退火算法应用于神经网络训练而生成的一种神经网络模型,也是一种迭代取优的方法,但一直对其原理没有深究。当天wangyt上来给我们讲约束Boltzmann机RBM,我是听得云里雾里,基本没听明白。只听懂了它的性能:它的性能不如SVD++,但在作模型融合时有特别的优势,也许是因为它适用于一些其它算法不适用于的人群。
  • 时间相关模型:就是把时间的因素考虑到模型里面去了,多加了一些变参,模型也变复杂了,没什么太特别的东西。
  • 分类器融合:以上说的都是一个个的分类器,精度到0.90基本到头了,后面的进步就要靠把上面说的各种分类器融合到一个集成分类器里。这个我了解,因为跟我一年毕业的那个博士师兄做的就是分类器融合。在netflix prize里面,到最后都是在拼分类器的融合,谁能找到更多更好的分类器,谁能做出更好的融合算法,谁的预测精度就高。但是我看来,里面用的分类器融合算法比较我那个师兄做的那一大堆森林理论,还是要相对简单一些,当然不是越复杂就越好了。最后做成的集成分类器通常有好几百个,光计算量也够呛的,单个分类器里面不同质的也就上面那几大类,其它的都是参数上的变化。

最后三十天的故事:按照大赛规则,Bellkor提交了过线的结果之后,再过30天,比赛就会结束,所以最后30天里的故事也比较多。如多个组开始组成一个更大的组The ensemble,以便集成更多的分类器,得到更高精度;大组之间的交流与争论;做完正规工作之后还要相应地研究一些“作弊策略”。都是些挺有意思的事情。

最后The ensemble做到了英雄榜上的第一(第一组测试集精度最高)。根据规则,要在两组数据上进行考察,并作加权平均,而这个值Bellkor略胜了一点点,The emsemble只能饮恨。

最后补充几点:

  • xlvector同学认为,没有一个模型是最好的,多个模型的整合才能得到最佳的结果,所以人手也显得很重要。我的认为是,在实际推荐系统中,要得到好的效果,多个不同质(CF?语义?其它因素?)的算法整合也很重要,也就是hybrid recommendation。
  • 算法可能有数据依赖性,在netflix数据集上表示良好的算法与参数,在你的数据集上未必就是最好的。
  • 在netflix prize论坛上找到了两个单分类器的c/c++源代码,可以拿来体验一下。SVD 、 nprize 、 Kadri框架 。
原文地址:https://www.cnblogs.com/DjangoBlog/p/3770422.html