推荐系统工程系列(1): 我眼中的推荐系统

本文发表于知乎专栏:www.zhihu.com/column/c_14…

也欢迎大家关注和订阅我的专栏

1.前言

为什么会有这个专栏?

相信跟大多数人一样,我的技术启蒙书籍,也是吴军老师的 《数学之美》。大学时期,第一次看的时候,被数学&算法的魅力深深吸引,也是从那个时候,开始接触到推荐这个概念。工作后,大部分时间也都是开发推荐相关的系统与工程。随着业务的发展,推荐技术日新月异,也变得越来越复杂,因此也希望通过知识沉淀的方式,与大家交流学习,来提升自己的整体认识。

另一方面,网络上有非常的多的大V,很好的技术专栏介绍推荐系统。比如 王喆的机器学习笔记 更侧重算法&论文解读,我也希望从工程实现的角度,谈谈我的理解。

2.推荐系统综述

1. 什么是推荐系统,推荐系统解决了什么问题?

推荐系统是一种个性化的信息过滤系统。

从认知心理学的角度,人类通过采集信息,对信息的提取,加工,转换为概念和知识,不断加深我们对外部世界的理解。

信息的形式可以是,文字,图片,声音,视觉影响等。随着人类文明的发展,人类获取信息的方式也在不断转变。最初原始部落时代,是龟壳象形文字,壁画,到中世纪的是羊皮卷,纸张,工业革命则是电报,电话,再到现代的互联网。

技术的升级使得信息的创造和传递成本降低,自然就带来了信息的急剧爆炸。

面对过载的海量信息,为了提高信息获取效率,于是搜索系统应运而生,典型的就是谷歌和百度。

但是搜索是一种主动的,带有明确意图的行为。大部分时候,人们的注意力,关注点都是模糊的,不确定的,个体的偏好兴趣也差异极大。推荐系统则进一步提升了信息的获取效率,将不同信息分发给对应偏好的人群,人不再是单向的获取信息,信息也可以主动与人建立联系。

2. 推荐系统的大规模应用

当今世界,推荐系统已经渗透到生活的各个角落。

从资讯类的头条抖音,电商类的淘宝,拼多多,甚至生活娱乐类的美团,大众点评,都在大规模使用推荐系统,提高用户与平台的粘性。

image.png

3.推荐系统架构

如何搭建一套推荐系统?推荐系统由哪些模块组成?

推荐系统架构

image.png

首先是推荐的内容来源:

内容来源一般跟所在的业务领域相关。比如资讯类或者视频应用类,内容一般由用户上传(UGC)或者MCN机构上传(PGC)到平台。平台会对内容进行安全和质量等审核。同时也会进行一般黑产,灰产的打击。内容入库后,会根据不同的类型,进行内容理解。比如图文的内容,会进行标签抽取。视频内容会用多模态技术进行标签建立。解析完毕后,每条内容对应一个id和标签体系,存储到内容池中,供推荐系统使用。电商,音乐,电影等其他场景也是类似。

从工程实现的角度上,推荐系统主要分为三个大块。

  1. 在线模块: 决定推什么内容
  2. 离线模块: 学习用户习惯,提高系统对用户刻画的准确率
  3. 管理平台: 实验管理,推荐结果分析等

3.1 在线模块

以youtube为例子,每天都有成百上千万的内容传到平台,经过内容审核入库后。内容池子可以达到百千万

如何能够从成千上百万的内容池中挑选用户喜欢的内容?

为了解决这个问题,推荐系统一般会有若干个阶段。

  1. 索引&特征: 会根据内容特性提前建立若干种类型的索引
  2. 召回阶段: 用户请求时会从各种索引种取出千/万 条item.
  3. 粗排阶段: 针对这上千/万条item,进行第一遍打分,再筛选出几百条或者千条。这个阶段的排序模型一般都比较简单,能够过滤掉一些与用户兴趣明显不想管的
  4. 精排阶段: 得到几百条item后,精排阶段会建立相对精细的模型,根据用户的画像,偏好,上下文,结合业务目标进行排序。一般精排后返回50-100条给到engine侧。
  5. 重排阶段: engine 侧拿到精排的50条item。还会做很多的人工干预和产品逻辑,比如item之间的多样性,产品策略逻辑,比如热门,置顶,多种内容之间的位置混合等等。最终会返回5-10条左右的item,曝光给客户端。

根据业务特性,在线流程还有许多比较细的模块,比如去重服务,避免给用户推荐重复的内容。特征预处理,特征抽取等模块。这些后面会单独介绍。

3.2 离线模块

推荐系统如何学习用户的习惯?

image.png

在给用户下发推荐若干item后,系统记录用户的点击,播放,停留时长,点赞收藏购物车等与业务相关的用户行为指标,通过样本平台处理后,得到训练样本。

目前业界有两种训练方式,一种是批式,每个小时训练,另一种是流式,样本拼接完后直接经由深度学习平台训练。

深度学习框架百花齐放。开源的tensorflow,pytorch,mxnet等等。但在推荐这个场景,目前的训练框架可能会有一些性能上的问题(分布式训练,超大规模稀疏参数等),因此各个大厂基本也都是采用 自研 + 开源 的方式结合。

如:

  1. 阿里的XDL : 基于tensorflow 上改造。
  2. 百度paddlepaddle: 自研深度学习平台,与tensorflow 不兼容
  3. 腾讯的numerous无量: 从之前的完全自研,也在慢慢与tensorflow看齐。
  4. 字节的BytePs: 自研了PS 参数服务器部分,核心的训练框架也是兼容tensorflow。

训练平台拟合好模型后,推到线上服务,通过在线serving的方式,提供召回 +粗排 + 精排 + rerank等各个阶段调用。如此一来,就形成了数据的闭环。在线产生用户行为数据,通过离线学习拟合,重新作用到在线服务上

这块比较复杂的样本平台的设计,训练框架的调研,也会在后面单独写文章介绍。

3.3 推荐管理平台

系统模块之间如何高效协作,快速迭代?

在推荐这个场景下,用户的需求其实并不是特别的明确,用户感受推荐结果的好与坏,是个非常主观的感受。因此每个平台会通过设定一些点击率,互动指标等进行量化和判断。产品 & 运营 & 技术 优化指标的时候,需要频繁进行AB Test。因此高效率的实验管理,流量划分,实验结果的置信度,独立性等就变得非常重要。

另外,推荐系统其实是个相对复杂的系统,由于数据链路复杂,因此也常常要求推荐结果可解释,可诊断,可视化,尽量减少推荐系统的黑核化。

4.推荐系统的挑战

推荐系统发展到现在,虽然大的架构已经相对稳定,如召回 + 粗排+精排+混排等。但在系统性能和通用性,迭代效率等角度考量下,各个 模块之间如何组织串联,依旧是个比较大的难题。

比如:

  1. 特征抽取应该在那个环节做?特征服务还是样本服务?如何保证特征一致性。
  2. 样本上报,如何避免特征穿越?
  3. 样本拼接如何提高效率,并行实验
  4. 索引的选型,成本与效率的考量
  5. 流式训练下, 特征的实时性,样本拼接性能,以及训练平台,serving模型如何实时更新等等工程问题

5 写作计划

接下来专栏,打算分为6个大的模块,分别介绍下各个大的模块行业内的做法与工程实践上的思考

  1. 去重服务模块
  2. 特征工程模块
  3. 索引模块
  4. 召回模块
  5. 样本模块
  6. 训练框架模块

5. 参考资料

www.zhihu.com/column/c_13…

zhuanlan.zhihu.com/p/143816066

www.infoq.cn/article/Y4G…*ePCv1we82rJVC5I

www.woshipm.com/pd/4202594.…

www.woshipm.com/pd/4223123.…

www.woshipm.com/it/3563857.…

zhuanlan.zhihu.com/p/114590897

おすすめ

転載: juejin.im/post/7035275858113724447