R&S | 推荐系统的基本结构

很多时候,我们在做各种项目的时候,不自觉的会去关注算法本身,而忽略了整个系统的关系,所谓系统,其实是一个由各个组成成分有机组合的整体,为了避免存在只见树木不见森林的情况,我通过给出一些案例,详细地讨论一下推荐系统整体的结构,以便大家更好的理解,一个内容是为用户推荐的。

懒人目录:

  • 概述
  • YoutuBe 推荐系统
  • Airbnb 推荐系统
  • 今日头条推荐系统原理
  • 小结

概述

现在很多学习算法的人,都喜欢把中心放在机器学习算法上,但是在实际的场景下,机器学习算法只是一个很基本的流程,无论是时间还是难度,其实都不在这些机器学习算法上,那么在推荐系统领域,难点包括但其实在这几块:

  • 用户和item有关信息以及特征表征
  • 冷启动问题
  • 可解释性
  • 补充说明
  • 用户、商家与平台利益的平衡

其实可以看到,大部分问题其实都局限在算法,而是在策略和特征上,构建好的特征,模型才能够产生作用,有好的效果,而策略,则是构建整个系统信息流的重要内容,机器学习算法可以没有,策略不可以没有,因此作为算法工程师,更需要的是对整个系统有更好的结构性把握。

YoutuBe 推荐系统

说到结构,Youtube被作为一大经典。Youtube在2016年发表的论文:《Deep neural networks for YouTube recommendations》被作为目前的重要标杆,具有重要的借鉴意义。

Youtube推荐系统结构

说到结构,就不得不说这章非常经典的图。首先,需要做的就是候选集的生成,从数据库中抽取重要的item,加入一些其他来源的item后(例如广告),开始根据用户行为、item等特征进行排序,最终实现推荐。

在这张图中点出了推荐系统中最为重要的两个任务,也是现在大量相似系统所采用的思路:召回和排序。召回,旨在从海量item中选择一定的内容进入候选池,而排序,则是根据特定的信息进行相应的排序最终为用户展示。

先说说为什么需要划分这两个步骤。我们知道,在item数据库里面,存在着大量的item,选择那些内容推荐给用户,是一个非常难的问题,难点在于复杂度上,将所有产品都用来和所有用户进行匹配,是一个非常难但是又难以避免的问题,所以从算法角度,应该选择复杂度较低、速度较快的方式选择是一个比较好的方法,但是复杂度低、速度快的方法,必然比较简单,而没有考虑到很多特别的信息,因此又还是需要一些精度很高的方法,考虑了这两个需求,所以就形成了这种“召回+排序”的结构。

召回,是指从海量的item中选择特定的内容进入候选池的过程,这个过程个人理解的是不要求结果准确,要的是一种“不进入候选池的肯定不是用户喜欢的”类似的结果,同时也能保证一定的可解释性(说起来,可解释性是一个机器学习中存在的大问题,机器学习可能是猜到用户会喜欢,但是实际上用户可能会觉得一脸懵)。常见的方式有我们熟悉的协同过滤,一般地只采用到用户的历史行为信息,通过协同过滤的方式能够为用户召回大概率比较喜欢的东西。

排序,就是对召回的item进行排序,排序方法难点不是在怎么排(例如快排、冒泡法之类的),而是在于按照什么标准排,从算法层面,这块已经逐步发展成一个比较熟悉的研究方向——学习排序(learning to rank),通过特定标准,进行更为准确高校的排序,其中比较出名的是pointwise,基于点的排序,常见的CTR预估就是基于这种思想,为每个item打分(CTR就是对item的点击率进行预测打分)然后根据分数排序,这是这块最基本的基线。

有关此论文,还有众多可以进行实践的细节方法,日后我会专门写一篇讲述,考虑本文主题在于推荐系统的结构,此处不赘述算法细节,有兴趣的同学可以在参考文献中找到文章信息并查阅。

Airbnb 推荐系统

来自2018年kdd的最佳论文《real-time Personalization using Embeddings for Search Ranking at Airbnb》。

Embedding表征

这篇论文重点放在了Embedding上,通过embedding的方式来对房源、房源类型、用户等进行表征,这种表征的目标是对房源等各方向的信息进行转化,以便加入模型计算,而表征的好坏,直接决定了后续预测和推荐的好坏,这种思想借鉴了NLP领域的word embedding的概念,例如word2vector等。

房源embedding

以房源为例,思路基本借鉴了word2vec中的skip-gram,构建如上图所示的房源点击会话,对一个登录用户,对该次登录下的点击行为做成一次session,按照时间排序(注意,要过滤用户的误操作和标题党诱发用户点击的记录),这个session就和自然语言处理中的一句话是类似,通过构建这样的很多句话,就能够结合ngram构建“语言模型”,实现word2vector算法。

搜索排序

推荐系统不是一个独立的问题,在很多场景下,用户是有明确目标和意图的,最好的体现方式就是“搜索”,如果说推荐系统对用户而言是一个被动的推送,那么搜索就是用户的一次主动的探索。在这篇论文里面,就讨论了这个问题,在Airbnb中,将这个搜索问题看成是一个回归问题,标签上,5表示用户联系了房东但没预订,1表示房源预订成功,-0.4表示房东拒绝了用户的预订,然后使用GDBT方法进行计算(浑然感觉树类的模型对这种有显著上下界的预测问题似乎有比较好的结果)。

此处想强调的是,将这个排序问题抽象为回归问题,设计好合理的标签,特征合适的特征(文中提到的是100个,涵盖房源特征,用户特征,搜索特征,和交叉特征等)是这次问题成功解决的关键,而有关GDBT,非常重要,但是却不会成为这篇文章的主要核心工作,可以关注的是,为什么选了这个而没有选其他,一方面,来源于对算法的理解,另一方面,来源于工程上的考虑(模型大小和复杂度等)。

今日头条推荐系统原理

来源于今日头条算法架构师曹欢欢博士的一次分享,网络上没找到视频,PPT倒是已经发布很广了,这个分享的内容非常丰富,挺推荐大家好好看看,感觉能给大家很多启发,下面我选几个我认为很关键的点和大家分享,不全哈。

典型推荐特征

典型推荐特征

曹欢欢博士将推荐系统的特征分为4个维度,相关性特征、环境特征、热度特征以及协同特征,这里面让我理解到这几个关键点:

  • 用户和item的特征本身不重要,重要的是两者的匹配
  • 环境特征,即地理、时间特征,有利于识别用户使用场景,例如上班、通勤等
  • 热度特征单独分开,对用户关注度以及冷启动很有效
  • 协同特征能有效解决算法“越推越窄”的问题

召回策略

曹欢欢博士介绍到召回策略要求性能达到极致,要求超时不能超过50ms,于是提到了“倒排”的思路(就是搜索系统中最基本的“倒排索引”的概念),离线维护一个倒排,key可以是分类、话题等信息,线上可以快速召回,能够快速召回有用的信息。

文本分析

针对近日头条这种以文本为重心的推荐系统,文本分析是非常重要的一环,里面涵盖了标签提取、文本特征提取、语义标签、命名实体识别等技术,所以要整理这块内容,NLP是一个不可或缺的重点。那么相似的,涉及图像(推荐P图方法)、视频(抖音快手)、音乐(网易云音乐QQ音乐),也有相似的特征提取方法,也需要这些提取方法,有兴趣或者有需要的需要进行对应领域的学习。

其他

这个分享内容众多,难以详细展开描述,里面有诸如用户标签、实验平台等信息,非常值得大家学习,当然,我也会单独撰文对本次报告进行总结和讨论。

小结

经过上面几个案例的讨论,相信大家对整个推荐系统有了一个总体的把握和认识,下面我总结一下上面提到的要点:

  • 召回+排序是当前推荐系统的一个重要构建方式,可供参考,当然如果有更加创新的方法欢迎大家提出一起学习。
  • Embedding是一种对非数字、高度稀疏等特点的特征进行表征的重要方法。
  • 问题的抽象、设计是一个问题成功解决的重要一环(其实这就要求对抽象模型的深入理解,这个比会推公式、写代码本身还要更加重要,毕竟在算法领域已经发展到这个程度,算法本身已经不是难题)
  • 特征的合理构建和整理(即特征工程,有的公司甚至专门设置了有关岗位)
  • 多领域的结合与应用

先讨论到这,还是那句话哈,上面提到的几篇论文和分享,我会单独撰文,敬请期待。

参考文献

[1] Youtube论文:Deep neural networks for YouTube recommendations
[2] Airbnb论文:Real-time Personalization using Embeddings for Search Ranking at Airbnb
[3] 今日头条报告名:今日头条推荐系统架构设计实践 曹欢欢
[4] Youtube论文讲解:https://blog.csdn.net/guoyuhaoaaa/article/details/84938943
[5] Airbnb论文论文讲解:https://blog.csdn.net/Zhangbei_/article/details/87821401
[6] 似乎是今日头条报告的原文+PPT:https://blog.csdn.net/zkq_1986/article/details/79153376

最后,推荐大家看论文哈,讲解只是读者对该论文的理解,如果能啃得动论文还是非常推荐大家看论文。

推荐阅读更多精彩内容