如果我们了解了原理和在实际推荐系统中需要考虑哪些要素,但是当你摩拳擦掌的时候,却发现需要先挖基础,你可能会崩溃。不要重新发明轮子,但事实上你不必也不应该这样做。大厂研发能力强,业务场景复杂,数据量大。挖地基自己开发推荐系统是很常见的。但是,中小型工厂的员工应避免重新发明轮子。这是出于以下原因。1.中小企业,或者刚起步的推荐系统,往往能达到基线效果,通用和开源的可以满足;2.开源轮子有社区贡献。经过几年的测试,大概率已经比从头写一个功能相同的轮子要好;3、对于没有那么大研发实力的工厂来说,时间还是第一位的,先做出来才是第一要务。因为我们想避免重新发明轮子,所以我们需要知道有哪些轮子。不同于介绍一个笼统而全面的“推荐系统”轮子,我更喜欢缩小粒度和重点,在底层编程语言API和庞大而全面的“推荐系统”之间,本文将按照本专栏目录整理开放每个模块可以为您使用的源工具。顺便说一句,在选择开源项目的时候,应该优先选择自己熟悉的编程语言,也应该选择有大公司背书的。毕竟基础技术强,很容易形成社区。此外,你必须考虑在实际项目中已经成功实施的公司,最后是充满活力的社区。内容分析是基于内容推荐,主要工作是处理文本,或者把数据当作文本来处理。与文本分析相关的工作是将非结构化文本转换为结构化文本。主要有三种工作类型。1.主题模型;2.词嵌入;3.文本分类。有几种开源工具可以完成这三种类型的工作。通常我们遇到的数据量都没有那么大,而分布式维护本身就需要专业的人和精力,所以请慎重选择分布式,单机用到极致遇到瓶颈后再考虑分布式。其中FastText的wordembedding和Word2vec的wordembedding是一样的,但是FastText也提供了分类功能。这种分类是非常有利的。效果和CNN差不多,但是效率和线性模型一样。已经在实际项目中进行了测试。LightLDA和DMWE都是微软的开源机器学习工具包。协同过滤和矩阵分解基于用户和基于项目的协同过滤和矩阵分解都依赖于用户-项目关系矩阵的使用。通常涉及以下任务。1.KNN相似度计算;2.SVD矩阵分解;3.SVD++矩阵分解;4.ALS矩阵分解;5.BPR矩阵分解;6.低维稠密向量最近邻搜索。有几个开源工具可以完成这项工作。这里的工作通常是这样的:基本的协同过滤算法通过计算矩阵的行相似度和列相似度得到推荐结果。矩阵分解,得到用户和物品的隐因子向量,为低维稠密向量,进一步利用用户的低维稠密向量搜索物品的向量,得到最近邻结果作为推荐结果,所以需要专门针对最近邻的低维稠密向量搜索。同样,除非数据量达到一定程度,比如超过1亿用户,否则你要谨慎选择分布式版本,这是很不经济的。模型融合模型融合部分包括线性模型和梯度提升树模型。线性模型在模型训练部分比较复杂,可以离线批量进行,而在线预测部分比较简单,可以使用开源接口实现,也可以自己实现。其他工具的Bandit算法比较简单,自己实现也不难,这里就不一一列举了。至于深度学习部分,主要是基于TensorFlow完成的。与其他互联网服务开发一样,存储和接口相关的开源项目也列在相应的章节中,这里不再单独列出。完整的推荐系统这里也整理一下完整的推荐系统开源项目,可以作为学习和参考。所谓完整的推荐系统是指:包括推荐算法的实现、存储、接口。综上所述,大家可能已经注意到,这里的推荐系统算法主要是基于Python和C++的,甚至有些Python项目底层也是用C++开发的。因此,在算法领域,Python和C++作为开发语言会有更广泛的选择。至于完整的推荐系统开源项目,因为它的封装太严密了,比自己组合大模块黑盒多了。所以在优化效果的时候,不是很理想,需要一定的额外学习成本。学习系统本身的开发细节,这个学习成本是额外的,不值得投资。因此,我倾向于选择每个模块的开源项目,然后将它们集成到我自己的推荐系统中。这样做的好处如下。1、单模块开源项目容易上手,学习成本低,性能好;2、问题自己结合起来更容易诊断,不需要就不用开发;3、单个模块的性能和效果更有保障。当然,还是那句话,实际问题具体分析,可能你的情况还有其他的考虑和选择。
