RecommendSystem-CheatSheet

Recommend System CheatSheet | 推荐系统术语、算法与实践

推荐系统在社交媒体、资讯阅读、电子商务等各类互联网产品中起到了越来越重要的作用。本质上,推荐系统是一种新的组织信息、传递信息的方式。这种方式火热的根本原因是网络信息指数级增长和信息多媒体化。

信息组织和传递方式大概分为下面 4 代版本。

  • 1.0 版本:导航页面。在互联网发展初期,网络上的信息很少,所以简单的导航页面就可以满足用户对网络信息获取的需要。

  • 2.0 版本:门户网站。随着网民的增加、原来越多的专业作者和编辑在网络上生产内容,这些内容包罗万象,有关于汽车的、有关于体育的。体育里面还有分关于篮球的、关于田径的等等。因此,门户网站这种以树形结构组织网页、传递信息的方式开始爆发,得到用户的青睐。

  • 3.0 版本:检索系统。随着博客、论坛、垂直网站这些 UGC(用户产生内容)平台模式的崛起,大量的信息被非专业人士产生。这些信息大多用来表达自我,具有语言口语化、内容不确定等特点,很难被清晰地分门别类。这时,检索系统闪亮登场。用户无需知道自己想要的信息属于什么类目,只需要把自己的需要输入在一个简单的搜索框里,就可以得到想要的信息。

  • 4.0 版本,全面进入移动互联网时代,每一个拥有智能手机的人都可以轻松产生互联网信息,而且包含更多的图片、声音、视频等更多模态类型的信息。在这个大数据时代,用户甚至很难用语言表达自己想看什么样的信息,于是,推荐系统迎来了其前所未有的机遇。

计算与系统架构

从系统架构来看,现如今推荐系统面临着三大挑战:超大规模数据、用户实时化反馈、多模态信息。

大规模的数据来源于三个方面:网络信息数量、用户数量和用户交互。前文已经提到,网络信息数量是指数级增长的。用户数量虽然有人口上限,但是由于互联网产品的垂直化,动辄过亿用户量的产品已不再是少数。另外,随着前端人机交互技术的发展,用户在产品交互次数已经明显增加。大规模的数据对推荐系统的挑战主要体现在大数据的存储、处理与分析,大规模机器学习系统两个部分。大数据存储、处理与分析已经有主流的开源分布式工具,比如 HDFS、Hadoop、Spark。它们已经是业界标配,可以满足大部分公司大数据处理的需求。另一方面,大规模的机器学习架构大致分为三类解决方案:基于 Map-Reduce 的方案、基于参数服务器(Parameter Server)的方案、基于 All Reduce 的方案。其中,基于参数服务器的方案目前占据主流地位,但是没有垄断性的标配工具。这是由于机器学习任务的多样性,与各个公司业务数据的独特性造成的。很多公司、开源组织或个人相继发布了开源分布式机器学习框架,比如 MLlib、Angel、Multiverso、TensorFlow、MXNet 等等。由于推荐系统的业务场景和机器学习算法的选择多种多样,所以开源机器学习框架并没有明显的高低之分,适合业务自身发展阶段和算法选择的就是最好的。在推荐系统构建初期,算法通常会选择线性模型,这时候使用 Spark 的 MLlib 就是一个比较好的选择。它随 Spark 一起安装,社区相对比较成熟,方便开发人员学习、应用和维护。但如果是重量级的超大规模机器学习,就需要根据自身业务的特点,自主研发自己的机器学习平台,以便在存储、计算、通信等多个方面进行细致的优化。

为了提供更好的用户体验,推荐系统需要实时获取到用户的行为,快速处理数据、进行在线机器学习,最终近乎实时地反馈到下次的推荐服务中。要完成这样的任务,需要从前端到后端整个链路的架构支持。在客户端,需要实时获取用户的操作并实时传回,这需要消息队列(例如,Kafka、ZeroMQ、RabbitMQ 等)的有力保障。收到数据后,需要并行的流式处理框架来进行实时处理,常用的有 Storm、Spark Streaming、Flink 等。随后,流数据处理框架对回传的数据进行清洗、计数、计算特征等处理,另外,计算的结果通常需要立即保存,以备机器学习系统使用。这时,基于内存的、支持快速读写的 NoSQL 数据库可以发挥作用,目前工业界比较成熟应用的有 Redis、Memcache 等。由于目前的推荐系统大多是基于机器学习模型的,所以这里的实时性要求必须由在线机器学习系统来保障。机器学习算法,特别是深度学习算法对计算效率的要求非常高,所以通常会对数据进行采样以减少训练数据规模。但与此同时还要保证模型的效果不会打折扣,所以在线实时机器学习系统的研发和算法研发通常是密不可分的。最后,当短时间内用户再次发出请求时,更新后的模型返回给用户新的推荐结果,完成闭环。一个实时推荐系统要求闭环中的每一个环节都实时高效,必须没有短板,保障整个数据流通畅、高效。

多模态是一个比较新兴的名词,其大致的意思是文字、语言、图像、视频这些不同的内容形式共同表达语义。显而易见,互联网上的内容已经从文本占主体演进到了多媒体混合形态占主体,比如近两年,随着手机摄像的快速发展以及网络成本逐渐降低,涌现出一批短视频产品。在目前的大多数推荐系统中,文本、图片、视频通常被分别处理后送入机器学习系统,分别训练出模型。最后,推荐系统会综合应用这些子模型。而多模态数据要求机器学习推荐系统可以同时处理包含多种模态形式的内容,通过联合学习来提升算法效果。但由于图像等多媒体特征抽取速度比较慢,很容易成为瓶颈,所以架构会面临巨大的挑战。比如,传统参数服务器会将数据随机分配到各个 worker。但对于多模态数据,这种分配方式是不合理的。因为不同类型的数据适用的机器类型不同,图片、视频需要 GPU 机器才能高效计算,而文本和其他浮点型统计数据则使用 CPU 会比较节约成本。显然,这要求系统架构研发强依赖于模态类型的分布和算法研发的设计方案。