算法与工程的关系
算法解释了推荐系统的工作原理,从原理到最终上线的系统,中间还有很大一段距离,这段距离就是由工程来连接的。可以说,所有跟实现相关的工作,都属于工程方面的工作,所以工程上的考虑点非常多,涉及实现相关的方方面面,从实现设计到工作量评估,从项目风险管理到进度把控,大到架构设计、技术选型,小到模块划分、开发语言选择、函数设计,等等。
算法与工程的关系,就是设计与实现的关系,设计的确很重要,然而细节是魔鬼,工程就是要面对各种实现细节问题。
并且算法与工程很难完全分开来考虑:
- 一方面,好的算法设计,一定需要加上工程实现方面的考虑,绝对不是天马行空、建立在无限投入或无限计算资源的假设上的。
- 另一方面,工程也必须了解算法的演进需求,才能做好实现设计,应对复杂的算法进化需求。
围绕着推荐系统的实现,工程上的具体工作包括:
- 算法的实现
- 数据的存储
- 服务间的通信
- 集群的管理
大型公司可能会选择从基础开始实现,他们资金雄厚,业务场景复杂,有比较充分的理由选择造新车轮子,中小型公司的诉求可能就是能快速的搭建起完整的推荐系统,并且能应对自己的业务场景,验证自己的产品逻辑。
既然不想造新车轮子,就需要了解现有的轮子。利用好现有的轮子,搭建起基础版本的推荐系统,然后根据自己的业务需求,选择开发其中成为瓶颈的模块。
下面按照不同的工作分别介绍一些开源的项目.
算法的实现
推荐系统涉及的算法很多,包括内容挖掘,召回和融合,等等。
- 物品画像
算法 | 项目 | 编程语言 |
---|---|---|
主题模型 | LightLDA | C++ |
主题模型,词嵌入 | gensim | python |
主题模型 | plda | c++ |
词嵌入 | DMWE | c++ |
词嵌入 | tensorflow-word2vec | python |
词嵌入,文本分类 | FastText | c++/python |
文本分类 | liblinear | c++,java,python |
文本分类 | libsvm | c++,java |
文本分类 | weka | java |
- 召回
算法 | 项目 | 编程语言 |
---|---|---|
knn相似度计算与搜索 | kgraph | c++/python |
knn相似度计算与搜索 | annoy | c++/python |
knn相似度计算与搜索 | faiss | c++/python |
knn相似度计算与搜索 | nmslib | c++/python |
倒排索引 | Elastic Search | java |
kv检索 | rocksDB,TiDB | java |
SVD,SVD++,BPR | lightfm | python |
ALS,BPR | implicit | python |
ALS,BPR | QMF | c++/python |
- 融合
算法 | 项目 | 编程语言 |
---|---|---|
GBDT | lightGBM | c++ |
GBDT | xgBoost | c++ |
wide and deep | tensorflow-wide&deep | python |
fm,ffm | libFFM | c++,python |
数据的计算与存储
推荐系统是数据贪婪型系统,数据主要包括内容数据、用户行为数据、训练数据、画像数据、模型数据,等等。围绕着这些数据的分析和存储,有了数据计算和存储的需求。这些数据一般比较大,超出了单机的处理能力,需要借助一些计算框架进行处理:
- 数据计算
功能 | 项目 | 编程语言 |
---|---|---|
批处理 | Hadoop | java |
批处理 | Spark | java |
流计算 | Storm | java |
批处理,流计算 | Flink | java |
- 数据存储
功能 | 项目 |
---|---|
文档存储 | mongo db |
key-value存储 | rocksdb |
key-value缓存 | memcache |
key-value缓存 | redis |
列式存储 | Hbase |
列式存储 | Cassandra |
文件存储 | HDFS |
通信
功能 | 项目 | 编程语言 |
---|---|---|
序列化 | Protobuf | C++,java,python,go |
序列化 | Flatbuffer | C++,java,python,go |
RPC接口 | GRPC | C++,java,python,go |
序列化,RPC接口 | Thrift | C++,java,python,go |
消息队列 | Kafka | C++,java,python,go |
集群管理
功能 | 项目 |
---|---|
容器引擎 | docker |
容器管理框架 | kubernetes |
分布式资源管理框架 | mesos |
分布式应用管理框架 | marathon |
分布式协调服务 | zookeeper |
在完成了我们推荐系统基础版本的搭建,度过了产品逻辑验证阶段之后,提升推荐效果和系统效率就摆上了日程。开源的项目面对的场景比较复杂,在我们具体的业务场景下可能表现不如意,这时候就是集中资源,各个击破系统瓶颈的时候了。
推荐服务架构设计
一般情况,推荐服务的架构设计可以分以下几层:
- 接口层:负责响应客户端的请求
- 产品与算法策略层:负责实现各类产品策略,一般都是由专家经验总结的规则
- 排序层:负责对各召回的内容进行融合排序
- 召回层:负责召回推荐候选集
- 索引层:负责提供内容的检索接口,常见的包括倒排索引,KV索引,KNN索引,等等
- 存储层:负责内容的存储