作者
gongyouliu
编辑
auroral-L
全文共字,预计阅读时间30分钟。大家好,我是强哥。一个热爱暴走、读书、写作的人!本章目录
一、推荐算法的业务流程1.数据收集2.ETL与特征工程3.推荐模型构建4.推荐预测5.推荐Web服务6.离线评估与在线评估7.推荐算法的其他支撑模块二、推荐系统的pipeline架构三、推荐系统的工程架构设计原则总结推荐系统是一个偏业务的系统,工程实现和架构设计对推荐系统是否能够产生商业价值非常关键。好的工程实现和架构设计也方便推荐系统的维护与迭代。在后续章节讲解推荐算法和推荐系统工程实践方面的知识之前,我们在本章简单地介绍一下推荐系统工程与架构相关的基本原理和概念,方便读者更好地理解后续章节的内容。作为推荐算法工程师(或者即将准备入行推荐算法)的我们,在平时工作中可能不会直接参与工程相关的工作,但是对推荐系统工程与架构有一个宏观和整体的认识可以更好地让我们去设计算法、更好地与工程团队交流。在小公司,算法和工程可能分得不是那么清楚,算法开发人员也会参与工程的实现,所以了解推荐系统工程架构方面的知识是非常必要的。本章我们从推荐算法的业务流程、推荐系统pipeline架构、推荐系统的工程架构设计原则等3个方面来讲解。首先我们来介绍一下推荐算法的业务流程。一、推荐算法的业务流程推荐算法是机器学习的一个子领域,因此推荐算法的业务流程跟一般的机器学习过程是类似的,一般来说,推荐算法业务流程可以从数据流向的角度来加以说明,具体参考下面图1。图1:推荐系统业务流程上图中圆型和方形的蓝色模块是数据(或者模型),而红色的模块是基于数据之上的操作(算子),下面分别对上面的各个操作(数据收集、特征工程、推荐模型构建、推荐预测、推荐服务、离线评估、在线评估等)进行详细说明,让大家对每一个模块的功能和特色有更好的了解。1.数据收集构建推荐算法模型需要收集很多数据,包括用户行为数据、用户相关数据、物品相关数据、场景化数据(如用户设备属性、用户当前地点、时间、用户停留的页面等)。如果将推荐算法进行推荐的过程类比为厨师做菜,那么这些数据是构建推荐算法模型的各种食材和配料。巧妇难为无米之炊,要构建好的推荐算法,收集到足够多的有价值的数据是非常关键和重要的。第3章《推荐系统的数据源与数据处理》已经对推荐系统相关的数据进行了全面的介绍,这里不再赘述。2.ETL与特征工程收集到的原始数据一般是非结构化的、杂乱无章的,一般在进行后续步骤之前还需要进行ETL,ETL的主要目的是从收集到的原始数据中提取推荐算法建模需要的关键字段(拿视频推荐来说,用户id、时间、播放的节目、播放时长等都是关键字段),将数据转化为结构化的数据存储到数据仓库中。同时根据一定的规则或策略过滤掉脏数据,保证数据质量。在互联网公司中,用户行为数据跟用户规模呈正比,所以当用户规模很大时数据量非常大,一般采用HDFS、Hive、HBase等大数据分布式存储系统来存储数据。用户相关数据、物品相关数据一般是结构化的数据,一般是通过后台管理模块将数据存储到MySQL、ProgreSQL等关系型数据库中(或者快照到Hive表中)。第3章《推荐系统的数据源与数据处理》第二部分已经对ETL进行过介绍,这里不再说明。做完了ETL的工作,接下来就是特征工程了。推荐系统采用各种机器学习算法来学习用户偏好,并基于用户偏好来为用户推荐物品。这些推荐算法用于训练的数据应该是可以被数学模型所理解和处理的,一般是向量的形式,其中向量的每一个分量/维度就是一个特征,所以特征工程的目的就是将推荐算法需要的原始数据通过ETL后再转换为推荐算法可以学习的特征。当然,不是所有推荐算法都需要特征工程,比如,如果要做排行榜相关的热门推荐,只需要对数据做统计排序就可以了。最常用的基于物品的协同过滤和基于用户的协同过滤(后面章节会讲)也只用到用户id,物品id,用户对物品的评分三个维度,也谈不上特征工程(KNN推荐、bayes算法、关联规则等推荐算法也都不需要特征工程)。像logistic回归、FM、深度学习等等复杂一些的机器学习算法需要做特征工程,一般基于模型的推荐算法都需要特征工程。特征工程是一个比较复杂的过程,要做好需要很多技巧、行业知识、经验等。我们在后面会单独用一章的篇幅来讲解特征工程,或者读者可以参考我的另外一个系列「推荐系统与特征工程」,这里不赘述。3.推荐模型构建推荐算法模块是整个推荐系统的核心之一,该模块的核心是根据具体业务及可利用的所有数据设计一套精准、易于工程实现、可以处理大规模数据的(分布式)机器学习算法,进而可以预测用户的兴趣偏好。这里一般涉及到模型训练、预测两个核心模块。下面图2简单描述这两个过程,这也是机器学习的通用流程。好的推荐算法工程实现,希望尽量将这两个过程解耦合,尽量做到通用,方便用到各种推荐业务中。本节我们不详细讲解具体的推荐算法,留到后续章节讲解,下面一小节我们简单说说推荐模型预测。图2:推荐算法建模过程4.推荐预测当我们构建好推荐算法模型后,就可以用该模型进行预测了(即为用户进行个性化推荐)。如果是T+1(每天为用户进行一次推荐)的推荐模型,可以将推荐模型加载到推荐预测的代码块中(用计算机的术语,一般预测的逻辑是一个函数或者一个方法),循环(对所有待推荐的用户循环)为用户计算推荐结果。在计算机工程中有所谓的“空间换时间”的说法,对于推荐系统来说,事先计算好每个用户的推荐结果,将结果存储下来,可以更快的为用户提供推荐服务,及时响应用户的请求,提升用户体验(对于T+1推荐,这样做是非常合适的)。由于推荐系统会为每个用户生成推荐结果,并且每天都会(基本全量)更新用户的推荐结果,一般采用NoSQL数据库来存储,并且要求数据库可拓展,高可用,支持大规模并发读写。针对实时推荐,上面的方法也是可以行的(只不过需要基于用户的实时行为近实时更新用户的推荐结果),不过一般会将推荐预测过程部署成一个Web服务,对于用户的每一次请求,通过该服务来实时为用户提供推荐结果,像TorchServe就是提供这种能力的一种实现(T+1的推荐也可以采用这种方式,在为每个用户循环推荐的过程中调用该服务)。图3:TorchServe的服务流程(图片来源于PyTorch