This commit is contained in:
2024-08-10 19:46:55 +08:00
commit 2233526534
798 changed files with 35282 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
# 推荐系统的意义
随着移动互联网的飞速发展,人们已经处于一个信息过载的时代。在这个时代中,信息的生产者很难将信息呈现在对它们感兴趣的信息消费者面前,而对于信息消费者也很难从海量的信息中找到自己感兴趣的信息。推荐系统就是一个将信息生产者和信息消费者连接起来的桥梁。平台往往会作为推荐系统的载体,实现信息生产者和消费者之间信息的匹配。上述提到的平台方、信息生产者和消费者可以分别用平台方(如:腾讯视频、淘宝、网易云音乐等)、物品(如:视频、商品、音乐等)和用户和来指代。下面分别从这三方需求出发,介绍推荐系统的存在的意义。
## 平台方
平台方一般是为信息生产者提供物品展示的位置,然后通过不同的方式吸引用户来到平台上寻找他们感兴趣的物品。平台通过商家对物品的展示以及用户的浏览、观看或下单等行为,就产生了所谓的"流量"。
对平台方而言,流量的高效利用是推荐系统存在的重要原因。以典型的电商网站一般具有如图所示的树状拓扑结构,树状结构在连通性方面有着天然的劣势,阻碍这流量的高效流通。推荐系统的出现使得原本的树状结构变成网络拓扑结构,大大增强了整个网络的连通性。推荐模块不仅使用户在当前页面有了更好的选择路径,同时也给了每个商品增加入口和展示机会,进而提高了成交概率。而推荐质量的好坏,直接决定了用户选择这条路径的可能性,进而影响着流量的利用效率。
<div align=center>
<img src="https://typoraimg-1252051831.cos.ap-guangzhou.myqcloud.com/image-20220514232543182.png" alt="image-20220514232543182" style="zoom: 80%;" />
</div>
推荐系统解决产品能够最大限度地吸引用户、留存用户、增加用户粘性、提高用户转化率的问题从而达到平台商业目标增长的目的。不同平台的目标取决于其商业的盈利目的例如对于YouTube其商业目标是最大化视频被点击点击率以及用户观看的时长完播率同时也会最大化内置广告的点击率对于淘宝等电商平台除了最大化商品的点击率外最关键的目标则是最大化用户的转化率即由点击到完成商品购买的指标。推荐系统能够平台带来丰厚的商业价值 。
## 信息生产者(物品)
因为在互联网大数据时代下物品的长尾性和二八原则是非常严重的。具体来说对于一个平台而言80%的销售额可能是那些最畅销20%的物品。但是那20%的物品其实只能满足一小部分人的需求对于绝大多数的用户的需求需要从那80%的长尾物品中去满足。虽然长尾物品的总销售额占比不大,但是因为长尾物品的数量及其庞大,如果可以充分挖掘长尾物品,那这些长尾物品的销售额的总量有可能会超过热门商品。
物品只是信息生产者的产物,对于信息生产者而言,例如商家、视频创作者等,他们也更希望自己生产的内容可以得到更多的曝光,尤其是对于新来的商家或者视频创作者,这样可以激发他们创作的热情,进而创作出更多的商品或者视频,让更多的用户的需求得到满足。
对于一个平台而言,无论是否靠平台上的物品直接盈利,其将平台上的内容与用户进行匹配的能力都是衡量平台的重要标准之一,推荐系统的好坏很大程度上决定了平台匹配需求和供给的能力。推荐系统匹配需求和供给的能力决定了其最终的商业价值。
## 信息消费者(用户)
推荐系统对于用户而言,除了将平台上的需求和供给进行匹配外,还需要尽可能地提高用户的体验,但是对于一个平台来说,影响用户体验的因素非常多(产品设计、广告数量等)。对于一个有明确需求的用户来说,用户在平台上可以直接通过搜索来快速满足自己的需求,但这也仅仅是一个平台最基础的用户体验(平台做的好是应该的,但是做的不好可能会被喷)。对于一个没有明确需求的用户来说,用户会通过浏览平台上的推荐页来获取一些额外的惊喜需求。因为用户没有明确的需求,也就对推荐页浏览的内容没有明确的预期,但是并不说明用户没有期待。我们每天都希望自己的一天中充满惊喜,这样生活才会感觉更加的多姿多彩。推荐系统可以像为用户准备生日礼物一样,让呈现的内容给用户带来惊喜,进而增强用户对平台的依赖。此外,在给用户带来惊喜的同时,也会提高平台的转化率(例如成交额)
## 推荐和搜索的区别
搜索和推荐都是解决互联网大数据时代信息过载的手段,但是它们也存在着许多的不同:
1. **用户意图**:搜索时的用户意图是非常明确的,用户通过查询的关键词主动发起搜索请求。对于推荐而言,用户的需求是不明确的,推荐系统在通过对用户历史兴趣的分析给用户推荐他们可能感兴趣的内容。
2. **个性化程度**:对于搜索而言,由于限定的了搜索词,所以展示的内容对于用户来说是有标准答案的,所以搜索的个性化程度较低。而对于推荐来说,推荐的内容本身就是没有标准答案的,每个人都有不同的兴趣,所以每个人展示的内容,个性化程度比较强。
3. **优化目标**对于搜索系统而言更希望可以快速地、准确地定位到标准答案所以希望搜索结果中答案越靠前越好通常评价指标有归一化折损累计收益NDCG、精确率Precision和召回率Recall。对于推荐系统而言因为没有标准的答案所以优化目标可能会更宽泛。例如用户停留时长、点击、多样性评分等。不同的优化目标又可以拆解成具体的不同的评价指标。
4. **马太效应和长尾理论**:对于搜索系统来说,用户的点击基本都集中在排列靠前的内容上,对于排列靠后的很少会被关注,这就是马太效应。而对于推荐系统来说,热门物品被用户关注更多,冷门物品不怎么被关注的现象也是存在的,所以也存在马太效应。此外,在推荐系统中,冷门物品的数量远远高于热门物品的数量,所以物品的长尾性非常明显。
> 对于搜索、推荐、广告这三个领域的区别和联系可以参考王喆老师写的[排得更好VS估得更准VS搜的更全「推荐、广告、搜索」算法间到底有什么区别](https://zhuanlan.zhihu.com/p/430431149)
## 推荐系统的应用
个性化推荐系统通过分析用户的行为日志,得到用户当前的甚至未来可能的兴趣,给不同的用户展示不同的(个性化)的页面来提高网站或者app的点击率、转化率、留存率等指标。推荐系统被广泛应用在广告、电商、影视、音乐、社交、饮食、阅读等领域。下面简单的通过不同的app的推荐页来感受一下推荐系统在各个内容平台的存在形式。
- **电商首页推荐(淘宝、京东、拼多多)**
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421190313917.png" alt="image-20220421190313917" style="zoom: 15%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421191138469.png" alt="image-20220421191138469" style="zoom:53%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421191441104.png" alt="image-20220421191441104" style="zoom:53%;" />
</div>
- **视频推荐抖音、快手、B站、爱奇艺**
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421190629410.png" alt="image-20220421190629410" style="zoom:55%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421191849577.png" alt="image-20220421191849577" style="zoom: 53%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421192047973.png" alt="image-20220421192047973" style="zoom:53%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421192209412.png" alt="image-20220421192209412" style="zoom:55%;" />
</div>
- **饮食推荐(美团、饿了么、叮咚买菜)**
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421192623380.png" alt="image-20220421192623380" style="zoom:53%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421192717773.png" alt="image-20220421192717773" style="zoom:55%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421192749794.png" alt="image-20220421192749794" style="zoom:55%;" />
</div>
- **音乐电台网易云音乐、QQ音乐、喜马拉雅**
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421193139183.png" alt="image-20220421193139183" style="zoom: 57%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421193447933.png" alt="image-20220421193447933" style="zoom:68%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421193325921.png" alt="image-20220421193325921" style="zoom: 54%;" />
</div>
- **资讯、阅读(头条、知乎、豆瓣)**
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421193856262.png" alt="image-20220421193856262" style="zoom:53%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421193923283.png" alt="image-20220421193923283" style="zoom:55%;" />
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220421194244083.png" alt="image-20220421194244083" style="zoom:55%;" />
</div>
**参考资料:**
- 《推荐系统实践》
- 《从零开始构建企业级推荐系统》
- 《智能搜索和推荐系统》

View File

@@ -0,0 +1,174 @@
# 推荐系统架构
推荐和搜索系统核心的的任务是从海量物品中找到用户感兴趣的内容。在这个背景下,推荐系统包含的模块非常多,每个模块将会有很多专业研究的工程和研究工程师,作为刚入门的应届生或者实习生很难对每个模块都有很深的理解,实际上也大可不必,我们完全可以从学习好一个模块技术后,以点带面学习整个系统,虽然正式工作中我们放入门每个人将只会负责的也是整个系统的一部分。但是掌握推荐系统最重要的还是梳理清楚整个推荐系统的架构,知道每一个部分需要完成哪些任务,是如何做的,主要的技术栈是什么,有哪些局限和可以研究的问题,能够对我们学习推荐系统有一个提纲挈领的作用。
所以这篇文章将会从**系统架构**和**算法架构**两个角度出发解析推荐系统通用架构。系统架构设计思想是大数据背景下如何有效利用海量和实时数据,将推荐系统按照对数据利用情况和系统响应要求出发,将整个架构分为**离线层、近线层、在线层**三个模块。然后分析这三个模块分别承担推荐系统什么任务,有什么制约要求。这种角度不和召回、排序这种通俗我们理解算法架构,因为更多的是考虑推荐算法在工程技术实现上的问题,系统架构是如何权衡利弊,如何利用各种技术工具帮助我们达到想要的目的的,方便我们理解为什么推荐系统要这样设计。
而算法架构是从我们比较熟悉的**召回、粗排、排序、重排**等算法环节角度出发的,重要的是要去理解每个环节需要完成的任务,每个环节的评价体系,以及为什么要那么设计。还有一个重要问题是每个环节涉及到的技术栈和主流算法,这部分非常重要而且篇幅较大,所以我们放在下一个章节讲述。
架构设计是一个非常大的话题,设计的核心在于平衡和妥协。在推荐系统不同时期、不同的环境、不同的数据,架构都会面临不一样的问题。网飞官方博客有一段总结:
> We want the ability to use sophisticated machine learning algorithms that can grow to arbitrary complexity and can deal with huge amounts of data. We also want an architecture that allows for flexible and agile innovation where new approaches can be developed and plugged-in easily. Plus, we want our recommendation results to be fresh and respond quickly to new data and user actions. Finding the sweet spot between these desires is not trivial: it requires a thoughtful analysis of requirements, careful selection of technologies, and a strategic decomposition of recommendation algorithms to achieve the best outcomes for our members.
> **“我们需要具备使用复杂机器学习算法的能力,这些算法要可以适应高度复杂性,可以处理大量数据。我们还要能够提供灵活、敏捷创新的架构,新的方法可以很容易在其基础上开发和插入。而且,我们需要我们的推荐结果足够新,能快速响应新的数据和用户行为。找到这些要求之间恰当的平衡并不容易,需要深思熟虑的需求分析,细心的技术选择,战略性的推荐算法分解,最终才能为客户达成最佳的结果。”**
所以在思考推荐系统架构考虑的第一个问题是确定边界:知道推荐系统要负责哪部分问题,这就是边界内的部分。在这个基础上,架构要分为哪几个部分,每一部分需要完成的子功能是什么,每一部分依赖外界的什么。了解推荐系统架构也和上文讲到的思路一样,我们需要知道的是推荐系统要负责的是怎么问题,每一个子模块分别承担了哪些功能,它们的主流技术栈是什么。从这个角度来阅读本文,将会有助于读者抓住重点。
## 系统架构
推荐系统架构,首先从数据驱动角度,对于数据,最简单的方法是存下来,留作后续离线处理,**离线层**就是我们用来管理离线作业的部分架构。**在线层**能更快地响应最近的事件和用户交互,但必须实时完成。这会限制使用算法的复杂性和处理的数据量。离线计算对于数据数量和算法复杂度限制更少,因为它以批量方式完成,没有很强的时间要求。不过,由于没有及时加入最新的数据,所以很容易过时。
个性化架构的关键问题,就是如何以无缝方式结合、管理在线和离线计算过程。**近线层**介于两种方法之间可以执行类似于在线计算的方法但又不必以实时方式完成。这种设计思想最经典的就是Netflix在2013年提出的架构整个架构分为
1. 离线层:不用实时数据,不提供实时响应;
2. 近线层:使用实时数据,不保证实时响应;
3. 在线层:使用实时数据,保证实时在线服务;
### 设计思想
网飞的这个架构提出的非常早,其中的技术也许不是现在常用的技术了,但是架构模型仍然被很多公司采用。
这个架构为什么要这么设计本质上是因为推荐系统是由大量数据驱动的大数据框架最经典的就是lambda架构和kappa架构。而推荐系统在不同环节所使用的数据、处理数据的量级、需要的读取速度都是不同的目前的技术还是很难实现一套端到端的及时响应系统所以这种架构的设计本质上还是一种权衡后的产物所以有了下图这种模型
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220409205047285.png" alt="在这里插入图片描述" style="zoom:70%;" />
</div>
上面是网飞的原图,我搬运了更加容易理解的线条梳理后的结构:
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220409204658032.png" alt="在这里插入图片描述" style="zoom:90%;" />
</div>
整个数据部分其实是一整个链路,主要是三块,分别是客户端及服务器实时数据处理、流处理平台准实时数据处理和大数据平台离线数据处理这三个部分。
看到这里,一个很直观的问题就是,为什么数据处理需要这么多步骤?这些步骤都是干嘛的,存在的意义是什么?
我们一个一个来说首先是客户端和服务端的实时数据处理。这个很好理解这个步骤的工作就是记录。将用户在平台上真实的行为记录下来比如用户看到了哪些内容和哪些内容发生了交互和哪些没有发生了交互。如果再精细一点还会记录用户停留的时间用户使用的设备等等。除此之外还会记录行为发生的时间行为发生的session等其他上下文信息。
这一部分主要是后端和客户端完成,行业术语叫做埋点。所谓的埋点其实就是记录点,因为数据这种东西需要工程师去主动记录,不记录就没有数据,记录了才有数据。既然我们要做推荐系统,要分析用户行为,还要训练模型,显然需要数据。需要数据,就需要记录。
第二个步骤是流处理平台准实时数据处理,这一步是干嘛的呢,其实也是记录数据,不过是记录一些准实时的数据。很多同学又会迷糊了,实时我理解,就是当下立即的意思,准实时是什么意思呢?准实时的意思也是实时,只不过没有那么即时,比如可能存在几分钟的误差。这样存在误差的即时数据,行业术语叫做准实时。那什么样的准实时数据需要记录呢?在推荐领域基本上只有一个类别,就是用户行为数据。也就是用户在观看这个内容之前还看过哪些内容,和哪些内容发生过交互。理想情况这部分数据也需要做成实时,但由于这部分数据量比较大,并且逻辑也相对复杂,所以很难做到非常实时,一般都是通过消息队列加在线缓存的方式做成准实时。
最后我们看第三个步骤,叫做离线数据处理,离线也就是线下处理,基本上就没有时限的要求了。
一般来说离线处理才是数据处理的大头。所有“脏活累活”复杂的操作都是在离线完成的比如说一些join操作。后端只是记录了用户交互的商品id我们需要商品的详细信息怎么办需要去和商品表关联查表。显然数据关联是一个非常耗时的操作所以只能放到离线来做。
接下来详细介绍一下这三个模块。
### 离线层
离线层是计算量最大的一个部分,它的特点是不依赖实时数据,也不需要实时提供服务。需要实现的主要功能模块是:
1. 数据处理、数据存储;
2. 特征工程、离线特征计算;
3. 离线模型的训练;
这里我们可以看出离线层的任务是最接近学校中我们处理数据、训练模型这种任务的,不同可能就是需要面临更大规模的数据。离线任务一般会按照天或者更久运行,比如每天晚上定期更新这一天的数据,然后重新训练模型,第二天上线新模型。
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220409205904314.png" alt="在这里插入图片描述" style="zoom:70%;" />
</div>
#### 离线层优势和不足
离线层面临的数据量级是最大的面临主要的问题是海量数据存储、大规模特征工程、多机分布式机器学习模型训练。目前主流的做法是HDFS收集到我们所有的业务数据通过HIVE等工具从全量数据中抽取出我们需要的数据进行相应的加工离线阶段主流使用的分布式框架一般是Spark。所以离线层有如下的优势
1. 可以处理大量的数据,进行大规模特征工程;
2. 可以进行批量处理和计算;
3. 不用有响应时间要求;
但是同样的,如果我们只使用用户离线数据,最大的不足就是无法反应用户的实时兴趣变化,这就促使了近线层的产生。
### 近线层
近线层的主要特点是准实时,它可以获得实时数据,然后快速计算提供服务,但是并不要求它和在线层一样达到几十毫秒这种延时要求。近线层的产生是同时想要弥补离线层和在线层的不足,折中的产物。
它适合处理一些对延时比较敏感的任务,比如:
1. 特征的事实更新计算例如统计用户对不同type的ctr推荐系统一个老生常谈的问题就是特征分布不一致怎么办如果使用离线算好的特征就容易出现这个问题。近线层能够获取实时数据按照用户的实时兴趣计算就能很好避免这个问题。
2. 实时训练数据的获取比如在使用DIN、DSIN这行网络会依赖于用户的实时兴趣变化用户几分钟前的点击就可以通过近线层获取特征输入模型。
3. 模型实时训练:可以通过在线学习的方法更新模型,实时推送到线上;
近线层的发展得益于最近几年大数据技术的发展很多流处理框架的提出大大促进了近线层的进步。如今Flink、Storm等工具一统天下。
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220409205830027.png" alt="在这里插入图片描述" style="zoom:70%;" />
</div>
### 在线层
在线层,就是直接面向用户的的那一层了。最大的特点是对响应延时有要求,因为它是直接面对用户群体的,你可以想象你打开抖音淘宝等界面,几乎都是秒刷出来给你的推荐结果的,不会说还需要让你等待几秒钟时间。所有的用户请求都会发送到在线层,在线层需要快速返回结果,它主要承担的工作有:
1. 模型在线服务;包括了快速召回和排序;
2. 在线特征快速处理拼接根据传入的用户ID和场景快速读取特征和处理
3. AB实验或者分流根据不同用户采用不一样的模型比如冷启动用户和正常服务模型
4. 运筹优化和业务干预:比如要对特殊商家流量扶持、对某些内容限流;
典型的在线服务是用过RESTful/RPC等提供服务一般是公司后台服务部门调用我们的这个服务返回给前端。具体部署应用比较多的方式就是使用Docker在K8S部署。而在线服务的数据源就是我们在离线层计算好的每个用户和商品特征我们事先存放在数据库中在线层只需要实时拼接不进行复杂的特征运算然后输入近线层或者离线层已经训练好的模型根据推理结果进行排序最后返回给后台服务器后台服务器根据我们对每一个用户的打分再返回给用户。
在线层最大的问题就是对实时性要求特别高,一般来说是几十毫秒,这就限制了我们能做的工作,很多任务往往无法及时完成,需要近线层协助我们做。
## 算法架构
我们在入门学习推荐系统的时候更加关注的是哪个模型AUC更高、topK效果好哪个模型更加牛逼的问题从基本的协同过滤到点击率预估算法从深度学习到强化学习学术界都始终走在最前列。一个推荐算法从出现到在业界得到广泛应用是一个长期的过程因为在实际的生产系统中首先需要保证的是稳定、实时地向用户提供推荐服务在这个前提下才能追求推荐系统的效果。
算法架构的设计思想就是在实际的工业场景中,不管是用户维度、物品维度还是用户和物品的交互维度,数据都是极其丰富的,学术界对算法的使用方法不能照搬到工业界。当一个用户访问推荐模块时,系统不可能针对该用户对所有的物品进行排序,那么推荐系统是怎么解决的呢?对应的商品众多,如何决定将哪些商品展示给用户?对于排序好的商品,如何合理地展示给用户?
所以一个通用的算法架构,设计思想就是对数据层层建模,层层筛选,帮助用户从海量数据中找出其真正感兴趣的部分。
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220409211354342.png" alt="在这里插入图片描述" style="zoom:90%;" />
</div>
- 召回
召回层的主要目标时从推荐池中选取几千上万的item送给后续的排序模块。由于召回面对的候选集十分大且一般需要在线输出故召回模块必须轻量快速低延迟。由于后续还有排序模块作为保障召回不需要十分准确但不可遗漏特别是搜索系统中的召回模块
如果没有召回层每个User都能和每一个Item去在线排序阶段预测目标概率理论上来说是效果最好但是是不现实的线上不延迟允许所以召回和粗排阶段就要做一些候选集筛选的工作保证在有限的能够给到排序层去做精排的候选集的时间里效果最大化。另一个方面就是通过这种模型级联的方式可以减少用排序阶段拟合多目标的压力比如召回阶段我们现在主要是在保证Item质量的基础上注重覆盖率多样性粗排阶段主要用简单的模型来解决不同路的召回和当前用户的相关性问题最后截断到1k个以内的候选集这个候选集符合一定的个性化相关性、视频质量和多样性的保证然后做ranking去做复杂模型的predict。
目前基本上采用多路召回解决范式分为非个性化召回和个性化召回。个性化召回又有content-based、behavior-based、feature-based等多种方式。
召回主要考虑的内容有:
1. **考虑用户层面**:用户兴趣的多元化,用户需求与场景的多元化:例如:新闻需求,重大要闻,相关内容沉浸阅读等等
2. **考虑系统层面**:增强系统的鲁棒性;部分召回失效,其余召回队列兜底不会导致整个召回层失效;排序层失效,召回队列兜底不会导致整个推荐系统失效
3. **系统多样性内容分发**:图文、视频、小视频;精准、试探、时效一定比例;召回目标的多元化,例如:相关性,沉浸时长,时效性,特色内容等等
4. **可解释性推荐一部分召回是有明确推荐理由的**:很好的解决产品性数据的引入;
- 粗排
粗排的原因是有时候召回的结果还是太多,精排层速度还是跟不上,所以加入粗排。粗排可以理解为精排前的一轮过滤机制,减轻精排模块的压力。粗排介于召回和精排之间,要同时兼顾精准性和低延迟。目前粗排一般也都模型化了,其训练样本类似于精排,选取曝光点击为正样本,曝光未点击为负样本。但由于粗排一般面向上万的候选集,而精排只有几百上千,其解空间大很多。
粗排阶段的架构设计主要是考虑三个方面一个是根据精排模型中的重要特征来做候选集的截断另一部分是有一些召回设计比如热度或者语义相关的这些结果仅考虑了item侧的特征可以用粗排模型来排序跟当前User之间的相关性据此来做截断这样是比单独的按照item侧的倒排分数截断得到更加个性化的结果最后是算法的选型要在在线服务的性能上有保证因为这个阶段在pipeline中完成从召回到精排的截断工作在延迟允许的范围内能处理更多的召回候选集理论上与精排效果正相关。
- 精排
精排层,也是我们学习推荐入门最常常接触的层,我们所熟悉的算法很大一部分都来自精排层。这一层的任务是获取粗排模块的结果,对候选集进行打分和排序。精排需要在最大时延允许的情况下,保证打分的精准性,是整个系统中至关重要的一个模块,也是最复杂,研究最多的一个模块。
精排是推荐系统各层级中最纯粹的一层他的目标比较单一且集中一门心思的实现目标的调优即可。最开始的时候精排模型的常见目标是ctr,后续逐渐发展了cvr等多类目标。精排和粗排层的基本目标是一致的都是对商品集合进行排序但是和粗排不同的是精排只需要对少量的商品(即粗排输出的商品集合的topN)进行排序即可。因此,精排中可以使用比粗排更多的特征,更复杂的模型和更精细的策略(用户的特征和行为在该层的大量使用和参与也是基于这个原因)。
精排层模型是推荐系统中涵盖的研究方向最多,有非常多的子领域值得研究探索,这也是推荐系统中技术含量最高的部分,毕竟它是直接面对用户,产生的结果对用户影响最大的一层。目前精排层深度学习已经一统天下了,精排阶段采用的方案相对通用,首先一天的样本量是几十亿的级别,我们要解决的是样本规模的问题,尽量多的喂给模型去记忆,另一个方面时效性上,用户的反馈产生的时候,怎么尽快的把新的反馈给到模型里去,学到最新的知识。
- 重排
常见的有三种优化目标Point Wise、Pair Wise 和 List Wise。重排序阶段对精排生成的Top-N个物品的序列进行重新排序生成一个Top-K个物品的序列作为排序系统最后的结果直接展现给用户。重排序的原因是因为多个物品之间往往是相互影响的而精排序是根据PointWise得分容易造成推荐结果同质化严重有很多冗余信息。而重排序面对的挑战就是海量状态空间如何求解的问题一般在精排层我们使用AUC作为指标但是在重排序更多关注NDCG等指标。
重排序在业务中获取精排的排序结果还会根据一些策略、运营规则参与排序比如强制去重、间隔排序、流量扶持等、运营策略、多样性、context上下文等重新进行一个微调。重排序更多的是List Wise作为优化目标的它关注的是列表中商品顺序的问题来优化模型但是一般List Wise因为状态空间大存在训练速度慢的问题。
由于精排模型一般比较复杂基于系统时延考虑一般采用point-wise方式并行对每个item进行打分。这就使得打分时缺少了上下文感知能力。用户最终是否会点击购买一个商品除了和它自身有关外和它周围其他的item也息息相关。重排一般比较轻量可以加入上下文感知能力提升推荐整体算法效率。比如三八节对美妆类目商品提权类目打散、同图打散、同卖家打散等保证用户体验措施。重排中规则比较多但目前也有不少基于模型来提升重排效果的方案。
- 混排
多个业务线都想在Feeds流中获取曝光则需要对它们的结果进行混排。比如推荐流中插入广告、视频流中插入图文和banner等。可以基于规则策略如广告定坑和强化学习来实现。
## 总结
整篇文章从系统架构梳理了Netfliex的经典推荐系统架构整个架构更多是偏向实时性能和效果之间tradeoff的结果。如果从另外的角度看推荐系统架构比如从数据流向或者说从推荐系统各个时序依赖来看就是我们最熟悉的召回、粗排、精排、重排、混排等模块了。这种角度来看是把推荐系统从前往后串起来其中每一个模块既有在离线层工作的也有在在线层工作的。而从数据驱动角度看更能够看到推荐系统的完整技术栈推荐系统当前面临的局限和发展方向。
召回、排序这些里面单拿出任何一个模块都非常复杂。这也是为什么大家都说大厂拧螺丝的原因,因为很可能某个人只会负责其中很小的一个模块。许多人说起自己的模块来如数家珍,但对于全局缺乏认识,带来的结果是当你某天跳槽了或者是工作内容变化了,之前从工作当中的学习积累很难沉淀下来,这对于程序员的成长来说是很不利的。
所以希望这篇文章能够帮助大家在负责某一个模块,优化某一个功能的时候,除了能够有算法和数据,还能能够考虑对整个架构带来的影响,如何提升整体的一个性能,慢慢开阔自己的眼界,构建出一个更好的推荐系统。
**参考资料**
- 《从零开始构建企业级推荐系统》
- [Netflix](https://netflixtechblog.com/system-architectures-for-personalization-and-recommendation-e081aa94b5d8)
- [回顾经典Netflix的推荐系统架构](https://zhuanlan.zhihu.com/p/114590897)
- [大数据处理中的Lambda架构和Kappa架构](https://www.cnblogs.com/xiaodf/p/11642555.html)
- [张俊林:推荐系统技术演进趋势](https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247496363&idx=1&sn=0d2b2ac176e2a72eb2e760b7b591788f&chksm=fbd740c7cca0c9d16c76fdeb1a874a53f7408d8125b2e1bed3173ecb69d131167c1c9c35c71f&scene=21#wechat_redirect)
- [推荐算法架构1召回/等](https://blog.csdn.net/u013510838/article/details/123023259)
- [微信"看一看"多模型内容策略与召回](https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247503484&idx=2&sn=e2a2cdd3a517ab09e903e69ccb1e9f94&chksm=fbd77c10cca0f50642dde47439ed919aa2e61b7ff57bc4cbaacc3acaac3c620a1ed6f92684ab&scene=21#wechat_redirect)
- [阿里粗排技术体系](https://mp.weixin.qq.com/s/CN3a4Zb4yEjgi4mkm2lX6w)
- [推荐系统架构与算法流程详解](https://mp.weixin.qq.com/s/tgZIdYENwQqDScjt7R28EQ)
- [业内推荐系统架构介绍](https://mp.weixin.qq.com/s/waLW4aULeLoOB54_X-CzdQ)
- [推荐系统笔记,一张图看懂系统架构](https://mp.weixin.qq.com/s/Zj4lCBe2bYNT6uT2-d-pNg)

View File

@@ -0,0 +1,200 @@
## 推荐系统的技术栈
推荐系统是一个非常大的框架,有非常多的模块在里面,完整的一套推荐系统体系里,不仅会涉及到推荐算法工程师、后台开发工程师、数据挖掘/分析工程师、NLP/CV工程师还有前端、客户端甚至产品、运营等支持。我们作为算法工程师需要掌握的技术栈主要就是在算法和工程两个区域了所以这篇文章将会分别从算法和工程两个角度出发结合两者分析当前主流的一些推荐算法技术栈。
## 算法
首先我们从推荐系统架构出发,一种分法是将整个推荐系统架构分为召回、粗排、精排、重排、混排等模块。它的分解方法是从一份数据如何从生产出来,到线上服务完整顺序的一个流程。因为在不同环节,我们一般会考虑不同的算法,所以这种角度出发我们来研究推荐系统主流的算法技术栈。
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220409211354342.png" alt="在这里插入图片描述" style="zoom:90%;" />
</div>
为了帮助新手在后文方便理解,首先简单介绍这些模块的功能主要是:
- 召回从推荐池中选取几千上万的item送给后续的排序模块。由于召回面对的候选集十分大且一般需要在线输出故召回模块必须轻量快速低延迟。由于后续还有排序模块作为保障召回不需要十分准确但不可遗漏特别是搜索系统中的召回模块。目前基本上采用多路召回解决范式分为非个性化召回和个性化召回。个性化召回又有content-based、behavior-based、feature-based等多种方式。
- 粗排:粗拍的原因是有时候召回的结果还是太多,精排层速度还是跟不上,所以加入粗排。粗排可以理解为精排前的一轮过滤机制,减轻精排模块的压力。粗排介于召回和精排之间,要同时兼顾精准性和低延迟。一般模型也不能过于复杂
- 精排:获取粗排模块的结果,对候选集进行打分和排序。精排需要在最大时延允许的情况下,保证打分的精准性,是整个系统中至关重要的一个模块,也是最复杂,研究最多的一个模块。精排系统构建一般需要涉及样本、特征、模型三部分。
- 重排获取精排的排序结果基于运营策略、多样性、context上下文等重新进行一个微调。比如三八节对美妆类目商品提权类目打散、同图打散、同卖家打散等保证用户体验措施。重排中规则比较多但目前也有不少基于模型来提升重排效果的方案。
- 混排多个业务线都想在Feeds流中获取曝光则需要对它们的结果进行混排。比如推荐流中插入广告、视频流中插入图文和banner等。可以基于规则策略如广告定坑和强化学习来实现。
### 画像层
首先是推荐系统的物料库,这部分内容里,算法主要体现在如何绘制一个用户画像和商品画像。这个环节是推荐系统架构的基础设施,一般可能新用户/商品进来或者每周定期会重新一次整个物料库计算其中信息为用户打上标签计算统计信息为商品做内容理解等内容。其中用户画像是大家比较容易理解的比如用户年龄、爱好通常APP会通过注册界面收集这些信息。而商品画像形式就非常多了比如淘宝主要推荐商品抖音主要是短视频所以大家的物料形式比较多内容、质量差异也比较大所以内容画像各家的做法也不同当前比较主流的都会涉及到一个多模态信息内容理解。下面我贴了一个微信看一看的内容画像框架然后我们来介绍下在这一块主要使用的算法技术。
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220410143333692.png" alt="在这里插入图片描述" style="zoom:90%;" />
</div>
一般推荐系统会加入多模态的一个内容理解。我们用短视频形式举个例子,假设用户拍摄了一条短视频,上传到了平台,从推荐角度看,首先我们有的信息是这条短视频的作者、长度、作者为它选择的标签、时间戳这些信息。但是这对于推荐来说是远远不够的,首先作者打上的标签不一定准确反映作品,原因可能是我们模型的语义空间可能和作者/现实世界不一致。其次我们需要更多维度的特征比如有些用户喜欢看小姐姐跳舞那我希望能够判断一条视频中是否有小姐姐这就涉及到封面图的基于CV的内容抽取或者整个视频的抽取再比如作品的标题一般能够反映主题信息除了很多平台常用的用“#”加上一个标签以外我们也希望能够通过标题抽取出基于NLP的信息。还有更多的维度可以考虑封面图多维度的多媒体特征体系包括人脸识别人脸embedding标签一二级分类视频embedding表示水印OCR识别清晰度低俗色情敏感信息等多种维度。
这里面涉及的任务主要是CV的目标检测、语义分割等任务NLP中的情感分析、摘要抽取、自然语言理解等任务。但是这部分算法一般团队都会有专门负责的组不需要推荐算法工程师来负责他们会有多模态的语意标签输出主要形式是各种粒度的Embedding。我们只需要在我们的推荐模型中引入这些预训练的Embedding。
#### 文本理解
这应该是用的最多的模态信息包括item的标题、正文、OCR、评论等数据。这里面也可以产生不同粒度的信息比如文本分类把整个item做一个粗粒度的分类。
这里的典型算法有RNN、TextCNN、FastText、Bert等
#### 关键词标签
相比文本分类关键词是更细粒度的信息往往是一个mutil-hot的形式它会对item在我们的标签库的选取最合适的关键词或者标签。
这里典型的算法有TF-IDF、Bert、LSTM-CRF等。
#### 内容理解
在很多场景下,推荐的主题都是视频或者图片,远远多于仅推荐文本的情况,这里视频/图片item中的内容中除了文本的内容以外更多的信息其实来源于视频/图片内容本身, 因此需要尝试从多种模态中抽取更丰富的信息。主要包括分类信息、封面图OCR的信息、视频标签信息等
这里典型的算法有TSN、RetinaFace、PSENet等。
#### 知识图谱
知识图谱作为知识承载系统,用于对接内外部关键词信息与词关系信息;内容画像会将原关系信息整合,并构建可业务应用的关系知识体系,其次,依赖业务中积累用户行为产生的实体关系数据,本身用户需求的标签信息,一并用于构建业务知识的兴趣图谱,基于同构网络与异构网络表示学习等核心模型,输出知识表示与表达,抽象后的图谱用于文本识别,推荐语义理解,兴趣拓展推理等场景,直接用于兴趣推理的冷启场景已经验证有很不错的收益。
这方面的算法有KGAT、RippleNet等。
### 召回/粗排
推荐系统的召回阶段可以理解为根据用户的历史行为数据,为用户在海量的信息中粗选一批待推荐的内容,挑选出一个小的候选集的过程。粗排用到的很多技术与召回重合,所以放在一起讲,粗排也不是必需的环节,它的功能对召回的结果进行个粗略的排序,在保证一定精准的前提下,进一步减少往后传送的物品数量,这就是粗排的作用。
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220410000221817.png" alt="在这里插入图片描述" style="zoom:90%;" />
</div>
召回模块面对几百上千万的推荐池物料规模,候选集十分庞大。由于后续有排序模块作为保障,故不需要十分准确,但必须保证不要遗漏和低延迟。目前主要通过多路召回来实现,一方面各路可以并行计算,另一方面取长补短。可以看到各类同类竞品的系统虽然细节上多少存在差异,但不约而同的采取了多路召回的架构,这类设计考虑如下几点问题:
1. **考虑用户层面**:用户兴趣的多元化,用户需求与场景的多元化:例如:新闻需求,重大要闻,相关内容沉浸阅读等等
2. **考虑系统层面**:增强系统的鲁棒性;部分召回失效,其余召回队列兜底不会导致整个召回层失效;排序层失效,召回队列兜底不会导致整个推荐系统失效
3. **系统多样性内容分发**:图文、视频、小视频;精准、试探、时效一定比例;召回目标的多元化,例如:相关性,沉浸时长,时效性,特色内容等等
4. **可解释性推荐一部分召回是有明确推荐理由的**:很好的解决产品性数据的引入;
介绍了召回任务的目的和场景后,接下来分析召回层面主要的技术栈,因为召回一般都是多路召回,从模型角度分析有很多召回算法,这种一般是在召回层占大部分比例点召回,除此之外,还会有探索类召回、策略运营类召回、社交类召回等。接下来我们着重介绍模型类召回。
#### 经典模型召回
随着技术发展在Embedding基础上的模型化召回是一个技术发展潮流方向。这种召回的范式是通过某种算法对user和item分别打上Embedding然后user与item在线进行KNN计算实时查询最近领结果作为召回结果快速找出匹配的物品。需要注意的是如果召回采用模型召回方法优化目标最好和排序的优化目标一致否则可能被过滤掉。
在这方面典型的算法有FM、双塔DSSM、Multi-View DNN等。
#### 序列模型召回
推荐系统主要解决的是基于用户的隐式阅读行为来做个性化推荐的问题序列模型一些基于神经网络模型学习得到Word2Vec模型再后面的基于RNN的语言模型最先用的最多的Bert这些方法都可以应用到召回的学习中。
用户在使用 APP 或者网站的时候,一般会产生一些针对物品的行为,比如点击一些感兴趣的物品,收藏或者互动行为,或者是购买商品等。而一般用户之所以会对物品发生行为,往往意味着这些物品是符合用户兴趣的,而不同类型的行为,可能代表了不同程度的兴趣。比如购买就是比点击更能表征用户兴趣的行为。在召回阶段,如何根据用户行为序列打 embedding可以采取有监督的模型比如 Next Item Prediction 的预测方式即可;也可以采用无监督的方式,比如物品只要能打出 embedding就能无监督集成用户行为序列内容例如 Sum Pooling。
这方面典型的算法有CBOW、Skip-Gram、GRU、Bert等。
#### 用户序列拆分
上文讲了利用用户行为物品序列,打出用户兴趣 Embedding 的做法。但是,另外一个现实是:用户往往是多兴趣的,比如可能同时对娱乐、体育、收藏感兴趣。这些不同的兴趣也能从用户行为序列的物品构成上看出来,比如行为序列中大部分是娱乐类,一部分体育类,少部分收藏类等。那么能否把用户行为序列物品中,这种不同类型的用户兴趣细分,而不是都笼统地打到一个用户兴趣 Embedding 里呢?用户多兴趣拆分就是解决这类更细致刻画用户兴趣的方向。
本质上,把用户行为序列打到多个 embedding 上,实际它是个类似聚类的过程,就是把不同的 Item聚类到不同的兴趣类别里去。目前常用的拆分用户兴趣 embedding 的方法,主要是胶囊网络和 Memory Network但是理论上很多类似聚类的方法应该都是有效的所以完全可以在这块替换成你自己的能产生聚类效果的方法来做。
这方面典型的算法有Multi-Interest Network with Dynamic Routing for Recommendation at Tmall等。
#### 知识图谱
知识图谱有一个独有的优势和价值,那就是对于推荐结果的可解释性;比如推荐给用户某个物品,可以在知识图谱里通过物品的关键关联路径给出合理解释,这对于推荐结果的解释性来说是很好的,因为知识图谱说到底是人编码出来让自己容易理解的一套知识体系,所以人非常容易理解其间的关系。知识图谱的可解释性往往是和图路径方法关联在一起的,而 Path 类方法,很多实验证明了,在排序角度来看,是效果最差的一类方法,但是它在可解释性方面有很好的效果,所以往往可以利用知识图谱构建一条可解释性的召回通路。
这方面的算法有KGAT、RippleNet等。
#### 图模型
推荐系统中User和Item相关的行为、需求、属性和社交信息具有天然的图结构可以使用一张复杂的异构图来表示整个推荐系统。图神经网络模型推荐就是基于这个想法把异构网络中包含的结构和语义信息编码到结点Embedding表示中并使用得到向量进行个性化推荐。知识图谱其实是图神经网络的一个比较特殊的具体实例但是知识图谱因为编码的是静态知识而不是用户比较直接的行为数据和具体应用距离比较远这可能是导致两者在推荐领域表现有差异的主要原因。
这方面典型的算法有GraphSAGE、PinSage等。
### 精排
排序模型是推荐系统中涵盖的研究方向最多有非常多的子领域值得研究探索这也是推荐系统中技术含量最高的部分毕竟它是直接面对用户产生的结果对用户影响最大的一层。目前精排层深度学习已经一统天下了这是王喆老师《深度学习推荐算法》书中的精排层模型演化线路。具体来看分为DNN、Wide&Deep两大块实际深入还有序列建模以及没有提到的多任务建模都是工业界非常常用的所以我们接下来具体谈论其中每一块的技术栈。
<div align=center>
<img src="https://ryluo.oss-cn-chengdu.aliyuncs.com/图片image-20220410234144149.png" alt="在这里插入图片描述" style="zoom:90%;" />
</div>
#### 特征交叉模型
在深度学习推荐算法发展早期很多论文聚焦于如何提升模型的特征组合和交叉的能力这其中既包含隐式特征交叉Deep Crossing也有采用显式特征交叉的探究。本质上是希望模型能够摆脱人工先验的特征工程实现端到端的一套模型。
在早期的推荐系统中基本是由人工进行特征交叉的往往凭借对业务的理解和经验但是费时费力。于是有了很多的这方面的研究从FM到GBDT+LR都是引入模型进行自动化的特征交叉。再往后就是深度模型深度模型虽然有万能近似定理但是真正想要发挥模型的潜力显式的特征交叉还是必不可少的。
这方面的经典研究工作有DCN、DeepFM、xDeepFM等
#### 序列模型
在推荐系统中历史行为序列是非常重要的特征。在序列建模中主要任务目标是得到用户此刻的兴趣向量user interest vector。如何刻画用户兴趣的广泛性是推荐系统比较大的一个难点用户历史行为序列建模的研究经历了从Pooling、RNN到attention、capsule再到transformer的顺序。在序列模型中又有很多细分的方向比如根据用户行为长度有研究用户终身行为序列的也有聚焦当下兴趣的还有研究如何抽取序列特征的抽取器比如研究attention还是胶囊网络。
这方面典型的研究工作有DIN、DSIN、DIEN、SIM等
#### 多模态信息融合
在上文我们提到算法团队往往会利用内容画像信息既有基于CV也有基于NLP抽取出来的信息。这是非常合理的我们在逛抖音、淘宝的时候关注的不仅仅item的价格、品牌同样会关注封面小姐姐好不好看、标题够不够震惊等信息。除此之外在冷启动场景下我们能够利用等信息不够多如果能够使用多模态信息能很大程度上解决数据稀疏的问题。
传统做法在多模态信息融合就是希望把不同模态信息利用起来通过Embedding技术融合进模型。在推荐领域主流的做法还是一套非端到端的体系由其他模型抽取出多模态信息推荐只需要融合入这些信息就好了。同时也有其他工作是利用注意力机制等方法来学习不同模态之间的关联来增强多模态的表示。
比较典型的工作有Image Matters: Visually modeling user behaviors using Advanced Model Server、UMPR等。
#### 多任务学习
很多场景下我们模型优化的目标都是CTR有一些场景只考虑CTR是不够的点击率模型、时长模型和完播率模型是大部分信息流产品推荐算法团队都会尝试去做的模型。单独优化点击率模型容易推出来标题党单独优化时长模型可能推出来的都是长视频或长文章单独优化完播率模型可能短视频短图文就容易被推出来所以多目标就应运而生。信息流推荐中我们不仅希望用户点进我们的item还希望能有一个不错的完播率即希望用户能看完我们推荐的商品。或者电商场景希望用户不仅点进来还希望他买下或者加入购物车了。这些概率实际上就是模型要学习的目标多种目标综合起来包括阅读、点赞、收藏、分享等等一系列的行为归纳到一个模型里面进行学习这就是推荐系统的多目标学习。
这方面比较典型的算法有ESSM、MMoE、DUPN等。
#### 强化学习
强化学习与一般有监督的深度学习相比有一些很显著的优势首先强化学习能够比较灵活的定义优化的业务目标考虑推荐系统长短期的收益比如用户留存在深度模型下我们很难设计这个指标的优化函数而强化学习是可以对长期收益下来建模。第二是能够体现用户兴趣的动态变化比如在新闻推荐下用户兴趣变化很快强化学习更容易通过用户行为动态产生推荐结果。最后是EE也就是利用探索机制这种一种当前和长期收益的权衡强化学习能够更好的调节这里的回报。
这方面比较典型的算法有DQN、Reinforcement Learning for Slate-based Recommender Systems: A Tractable Decomposition and Practical Methodology
#### 跨域推荐
一般一家公司业务线都是非常多的,比如腾讯既有腾讯视频,也有微信看一看、视频号,还有腾讯音乐,如果能够结合这几个场景的数据,同时进行推荐,一方面对于冷启动是非常有利的,另一方面也能补充更多数据,更好的进行精确推荐。
跨域推荐系统相比一般的推荐系统要更加复杂。在传统推荐系统中,我们只需要考虑建立当前领域内的一个推荐模型进行分析;而在跨域推荐中,我们更要关心在不同领域间要选择何种信息进行迁移,以及如何迁移这些信息,这是跨域推荐系统中非常关键的问题。
这方面典型的模型有DTCDR、MV-DNN、EMCDR等
### 重排序
我们知道常见的有三种优化目标Point Wise、Pair Wise 和 List Wise。重排序阶段对精排生成的Top-N个物品的序列进行重新排序生成一个Top-K个物品的序列作为排序系统最后的结果直接展现给用户。重排序的原因是因为多个物品之间往往是相互影响的而精排序是根据PointWise得分容易造成推荐结果同质化严重有很多冗余信息。而重排序面对的挑战就是海量状态空间如何求解的问题一般在精排层我们使用AUC作为指标但是在重排序更多关注NDCG等指标。
重排序在业务中还会根据一些策略、运营规则参与排序比如强制去重、间隔排序、流量扶持等但是总计趋势上看还是算法排序越来越占据主流趋势。重排序更多的是List Wise作为优化目标的它关注的是列表中商品顺序的问题来优化模型但是一般List Wise因为状态空间大存在训练速度慢的问题。这方面典型的做法基于RNN、Transformer、强化学习的都有这方面因为不是推荐的一个核心所以没有展开来讲而且这一块比较依赖实际的业务场景。
这里的经典算法有MRR、DPP、RNN等
## 工程
推荐系统的实现需要依托工程很多研究界Paper的idea满天飞却忽视了工业界能否落地进入工业界我们很难或者很少有组是做纯research的所以我们同样有很多工程技术需要掌握。下面列举了在推荐中主要用到的工程技术
- **编程语言**Python、Javascala、C++、sql、shell
- **机器学习**Tensorflow/Pytorch、GraphLab/GraphCHI、LGB/Xgboost、SKLearn
- **数据分析**Pandas、Numpy、Seaborn、Spark
- 数据存储mysql、redis、mangodb、hive、kafka、es、hbase
- 相似计算annoy、faiss、kgraph
- 流计算Spark Streaming、Flink
- 分布式Hadoop、Spark
上面那么多技术我内容最重要的就是加粗的三部分第一是语言必须掌握的是PythonC++和JAVA中根据不同的组使用的是不同的语言这个如果没有时间可以等进组后慢慢学习。然后是机器学习框架Tensorflow和Pytorch至少要掌握一个吧前期不用纠结学哪个这个迁移成本很低基本能够达到触类旁通而且面试官不会为难你只会这个不会那个。最后是数据分析工具Pandas是我们处理单机规模数据的利器但是进入工业界Hadoop和Spark是需要会用的不过不用学太深会用即可。
## 总结
本文从算法和工程两个角度分析了推荐系统的一个技术栈,但是还有很多方向遗漏,也有很多方向受限于现在的技术水平深度不够和有错误的情况,后续会不断补充和更正。
所以技术栈我列出的是一个非常广度的技术,实际上每一个技术钻研下去都需要非常多时间,而且不一定是你实际工作中会遇到的,所以不要被那么多技术吓到,也要避免陷入技术细节的海洋中。
我和非常多的大厂面试官讨论过技术深度和广度的问题,得出来的结论是对于入门的推荐算法工程师而言,实际上深度和广度的要求取决于你要去的组,有些组有很深的推荐技术沉淀,有很强的工程师团队,这样的组就会希望候选者能够在某个方面有比较深入的研究,这个方面既包含工程方面也包含研究方面。但是如果是比较新的组、或者技术沉淀不深、推荐不是主要任务的组,对深度要求就不会很高。总而言之,我认为对于应届生/实习生来说,在推荐最重要的工程技术/研究方向,至少在召回和排序模块,需要选一个作为方向,是需要较深钻研。对于其他技术/研究方向需要有一定了解,比如可以没用过强化学习,但是要知道强化学习能够在推荐中解决什么问题,剩下的可以等到真实**遇到需要后再去学习**。
**参考资料**
- [万字入门推荐系统](https://mp.weixin.qq.com/s/aaOosZ57qJpIU6cma820Xw)
- [张俊林:技术演进趋势:召回->排序->重排](https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247496363&idx=1&sn=0d2b2ac176e2a72eb2e760b7b591788f&chksm=fbd740c7cca0c9d16c76fdeb1a874a53f7408d8125b2e1bed3173ecb69d131167c1c9c35c71f&scene=21#wechat_redirect)
- [微信"看一看"多模型内容策略与召回](https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247503484&idx=2&sn=e2a2cdd3a517ab09e903e69ccb1e9f94&chksm=fbd77c10cca0f50642dde47439ed919aa2e61b7ff57bc4cbaacc3acaac3c620a1ed6f92684ab&scene=21#wechat_redirect)
- [多目标学习在推荐系统中的应用](https://mp.weixin.qq.com/s/u_5RdZ-BcIu_RoWNri76ig)
- [强化学习在美团“猜你喜欢”的实践](https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749434&idx=2&sn=343e811408542dd1984582b8639240a6&chksm=bd12a5778a652c61ed4297f1a17582cad4ca6b8e8d4d66843f169e0eda9f6aede988bc675743&mpshare=1&scene=23&srcid=1115EcgbMw6GAhMnzV0URvgd#rd)
- [推荐系统技术演进趋势:重排篇](https://mp.weixin.qq.com/s/YorzRyK0iplzqutnhEhrvw)
- [阿里强化学习重排实践](https://mp.weixin.qq.com/s/ylavFA_MXLUhIBLCqxAjLQ)