推荐系统技术内幕(五):工程篇

算法与工程的关系

算法解释了推荐系统的工作原理,从原理到最终上线的系统,中间还有很大一段距离,这段距离就是由工程来连接的。可以说,所有跟实现相关的工作,都属于工程方面的工作,所以工程上的考虑点非常多,涉及实现相关的方方面面,从实现设计到工作量评估,从项目风险管理到进度把控,大到架构设计、技术选型,小到模块划分、开发语言选择、函数设计,等等。

算法与工程的关系,就是设计与实现的关系,设计的确很重要,然而细节是魔鬼,工程就是要面对各种实现细节问题。

并且算法与工程很难完全分开来考虑:

  • 一方面,好的算法设计,一定需要加上工程实现方面的考虑,绝对不是天马行空、建立在无限投入或无限计算资源的假设上的。
  • 另一方面,工程也必须了解算法的演进需求,才能做好实现设计,应对复杂的算法进化需求。

围绕着推荐系统的实现,工程上的具体工作包括:

  • 算法的实现
  • 数据的存储
  • 服务间的通信
  • 集群的管理

大型公司可能会选择从基础开始实现,他们资金雄厚,业务场景复杂,有比较充分的理由选择造新车轮子,中小型公司的诉求可能就是能快速的搭建起完整的推荐系统,并且能应对自己的业务场景,验证自己的产品逻辑。

既然不想造新车轮子,就需要了解现有的轮子。利用好现有的轮子,搭建起基础版本的推荐系统,然后根据自己的业务需求,选择开发其中成为瓶颈的模块。

下面按照不同的工作分别介绍一些开源的项目.

算法的实现

推荐系统涉及的算法很多,包括内容挖掘,召回和融合,等等。

  • 物品画像
算法 项目 编程语言
主题模型 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索引,等等
  • 存储层:负责内容的存储
发布了52 篇原创文章 · 获赞 105 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/gaofeipaopaotang/article/details/89851756