本文原文发在中国推荐系统社区的第一期电子杂志上,文栋为杂志的面世作出了大量的努力。因为原文的配图在出版中出了些纰漏,在这里作出了更正。
Duine 是由一个挪威的团队开发的开源推荐引擎,发音为 Dinner 少一个 r 音。不久前 resys group 里有人提出来,能翻墙的朋友可通过这个链接来挖坑。当时我提过一点初步的见解,最近抽时间把它大致地作了一番研究,不妨拿出来与大家一同探讨。
总的来说,我认为相对于大部分文章与系统里研究具体的推荐算法或推荐系统的某个要点,Duine 做了一个很好的探索:就是怎样把这一切整合成一个很完善而且很优美的系统,是很值得研究的框架。但如果从代码层面来说,则是作个参考即可,因为代码库已经快一年没更新了。这个项目的不足之处,或者说任何一个个性化推荐系统的困难之处,大都已经列在这个项目的 RoadMap 页面。在其 RoadMap 中有这么一句话:
Our collaborative prediction technique does not scale well currently, we need to add clustering (and probably more) and get in track with current research. We’d like to have more techniques, for instance a matrix factorization prediction technique.
可惜这已经是一年前的愿景,至今仍未有什么更新。一言概之,如果你想做一个完善的推荐系统,Duine 极具参考价值,但如果要实际使用,并面向一定量的用户,不能偷懒,每个模块的代码你还是得重新来实现。
与 Mahout-Taste 的对比
Taste 是推荐领域另一个更著名的项目。简单来说,Taste 是一个推荐器的集合,而 Duine 立志于做一个推荐框架,可以认为 Taste 要解决的问题是 Duine 的一个子集。Taste 专注于利用 Mahout 的分解思想来能高效地实现一些推荐算法,而在 Duine 中推荐器只是其中的一个模块,它同时还处理用户资料库(User Profile)、反馈(Feedback)、推荐可解释性(Explanation)等等更多的模块,以及这些模块之间如何交互的问题。
下面根据我个人的理解介绍 Duine 的三个主要的方面:推荐框架、推荐过程、自省过程,其实还应该有一个很重要的是反馈过程,但由于在 Duine 中这并不是一个重要的模块,这里就不多说了。以下不完全是按照原文档的叙述,有些地方会加入了我个人的理解或实践上的认识,如有不妥之处,还请指出。
推荐框架

图1. Duine 推荐框架各个模块/概念及其相互的关系
1、Ratable Item:例如书、电影、音乐等等用户可以对它表达自己的观点与爱好的事物集,它所包含的一 meta 信息也可作为推荐器的依据之一。拓展一下这个概念,你可以为自己的推荐系统构建一个 Item Profile 模块。
2、User Profile:用户资料库,这是所有模块里最不容易定义的一部分,通常用户的性别、年龄、职业等人口统计学的信息是应该被包含在资料库中的(如果有的话);如果能通过对用户行为与收藏的统计得到一些有价值的表征用户兴趣的信息与类别信息,也应该存放在其中;有些系统会把用户的收藏与评分信息也归入该模块,有些系统则倾向于把这部分数据独立出来,因为这部分数据量毕竟比较大,这关系到应该把源数据还是应该把中间计算结果存储在资料库中。Duine 实际采用的是一个更广义的 Profile Model 的概念,其中包括:Rating Model、Interest Model、User Similarity Model 以及 Item Similarity Model。
3、Prediction Technique:这是推荐框架的核心,也是推荐系统研究中被讨论最多的模块。学术研究与工业应用中已经催生出大量的推荐算法,目前为止可以说最强大的推荐算法不是某一个算法,而是一个适用于不同用户需求的混合式的推荐算法。Duine 的推荐池中采用的推荐器并不太复杂,下面会逐一介绍。
4、Prediction & Explanation:这是推荐器模块直接输出到用户的结果,推荐池依据已知的 User Profile 与Ratable Item(或许你可以认为它是 Item Profile)的输入,对未知的 user-item 作出预测。如果这个推荐系统足够 User Friendly 的话,它还应该输入自己对这个预测的解释,毕竟一个可解释的推荐结果更容易为用户所接受,这也是为什么 amazon 在每个推荐的下面都会给出自己的推荐依据。可解释的东西有很多,比如某一个推荐器的决策依据,再比如下一节要讲的推荐决策过程。
5、Feedback & Feedback Processor:一个有反馈的推荐系统才能向着更优化的方向演进,反馈更快,系统会得到更快的学习机会。Feedback Processor 收集来自用户的显式或隐式的反馈,并把变化更新到 User Profile 中。这里的反馈包括面比较广,不单指用户对推荐结果的爱好表达,还包括一般的收藏、评分行为这类用户与推荐系统之间的交互。
6、Validity Indicators:这个我不知道该如何翻译更合适,所以在下文根据自己的理解把它译为“自省”。每个推荐器都需要一个自我评价与校正的机制,这样才能促使系统的不断竞争与进化。Duine 中对这一模块的处理比较简单,只是根据测试集的测试结果对每个推荐器的可靠程度作一个评价。实际上这是很难以解决好的一部分,不同的推荐器应该有不同的校验方法,并且需要有能力根据用户的反馈对自身进行校正,也许拥有一个高级的“自省过程”是一个“有智能”的推荐系统的前提条件。
推荐过程
现在 Duine 包含有如下的一些推荐器:
- UserAverage:返回该用户对其它条目打分的平均值。
- AlreadyKnow:返回用户 Ui 对条目 Ij 的实际打分,适用于 Ui 已经对 Ij 有打分的情况。
- TopNDeviation:通过其它用户对 Ij 的打分,预测 Ui 对 Ij 的打分。我的理解是应该根据时间、用户权值选择一个已经打分用户的子集,进行预测。
- Collaborative Filtering (Social Filtering):相当于 user-based 的 KNN,根据以往的打分历史算出跟 Ui 相似的用户,再根据这批用户对 Ij 的打分预测 Ui 对 Ij 的打分。
- Information Filtering:相当于 content-based 的推荐,提取 Ij 的语义,跟 Ui 的 profile 中相应的信息进行匹配,预测其打分。
- Case-based Reasoning:相当于 item-based 的 KNN,先算出条目间的相似度,然后根据 Ui 的打分条目及其与 Ij 的相似度,预测 Ui 对 Ij 的打分。
- InterestLMS:根据条目本身的信息来计算条目的吸引程度。
这里的推荐器大都比较寻常,但基本上已经覆盖了大多的用户需求。实际使用中可以根据本身的技术贮备改善原有的推荐器,或加入更多其它类型的推荐器。

图2. DUINE的推荐过程
图 2 展示的是一个推荐器结构图,从最顶部的根结点到叶子结点走一遍即是一个推荐过程,非叶子节点代表某一类推荐策略。如图红线所示则表示了对一个新用户的推荐流程。在这个例子中,系统在根结点发现该用户并未对该条目评分,并且在 User Profile 中没找到用户的 taste 信息,因而转到 rationalStrategy;这个推荐策略有一个子推荐策略及两个推荐器,根据判断那两个推荐器不满足推荐要求,则转向 firstTimeUser 推荐策略;以此类推直到找到一个叶子节点作为合适的推荐器为止。
自省(Validation)过程:
正如上文所述,Duine 的自省是一个狭义的自省过程,主要的目的在于根据一组训练数据集对各个推荐器进行测试,并得到相应的置信度,以便在推荐过程为不同的用户选择合适的推荐器。比如 MovieLens、Netflix 的开放数据就可以用来实现这个过程。除此之外,Duine 的自省过程还可以看作是对其推荐交互过程的一种仿真。最后,自省过程体现了一个仲裁者的角色,任何对推荐算法改动后造成的效果变化都可以通过自省过程体现出来。拥有一个评价体系也是推荐系统进化的必要基石,虽然 Duine 的这个评价体系还比较简单。
跟我们想像中的不一样,Duine 的自省过程并不是把所有数据载入,然后对推荐器进行训练,相对而言,它的训练过程更接近于现实中人与推荐系统的交互,即更像是一种对现实情况的仿真,很难说这样做的效果就比批量训练的方式更好,但这无疑更贴近一种在线的训练模式,与离线训练模式可以形成互补。

这是一个很直观的模拟过程,可以让人很形象地了解到一个整体的推荐系统的各个模块是可以怎样协同工作的。不同之足在于忽略了太多困难的细节,各模块之间为了简单直观而赋予了太强的耦合,以致于看起来也只能是一个仿真器,无法真正地在现实中使用。另外就是效率问题,由于 Duine 更注重整体,所以在效率上没有太多关注,这个自省的过程非常缓慢,处理 9 万多条 log 数据也要耗费几个小时的时间。
最近评论