推荐系统在线学习架构

0 / 553

广告和推荐系统的 CTR 预估模型有三种部署形态: 离线预测,在线预测和在线学习,其中在线学习是近几年迅速推广的架构。

1. 离线预测

离线预测的架构很简单,其要点离线计算好所有的可能的预测结果。具体过程如下所示:1)在线上,从用户和物品属性抽取用户和物品特征,将抽取的特征合并进日志生成训练数据,训练机器学习模型;将几乎所有可能的请求合并特征,进而生成预测实例,用模型得到预测结果;2)线上就很简单了,接入线下传过来的预测结果。这里稍微难理解的是 “穷尽几乎所有可能的请求”,疑惑那么多可能的请求怎么可能穷尽呢?微博广告系统(虚构的)所有可能的请求貌似很多,但每个用户只需要匹配若干个广告就行了。因此微博广告系统的预测结果 “userid,adid1,adid2…,adidn” 上载到线上,一旦线上传一个 userid 请求展示广告,线上模块就按照一定的逻辑返回预测结果中这个用户对应的广告。

adrec2

离线预测架构最大的优势是简单,其将机器学习全过程和绝大部分控制逻辑都搬到线下,规避了线上的各种隐患。这样不那么厉害的工程师用不那么厉害的机器也能搞定线上模块了,毕竟线上模块只需要实现少量的控制逻辑和展示。这大大降低了建立一个广告和推荐系统的难度。

离线预测架构也有其劣势,其中两个突出问题是系统开销大和灵活性不够。系统开销大主要是预测时需要对所有可能用户物品对进行预测,消耗大量的系统资源。这逼得我们发展出一系列的预测优化技巧,我之前的工作: 超大规模 LR 预测优化 便是优化了 LR 的预测性能,使之 10 分钟处理完 380 亿量级的预测实例,应该能够处理万亿级预测数据。腾讯同学可以关注下 km 中 wxg 同学的文章:万亿级实例打分预测,优化了 XGBoost 的预测性能,使之能够处理万亿级预测数据。离线预测架构的另一个大问题就是灵活性不够,比如离线预测架构完全无法支撑用强化学习或者多臂老虎机解决冷启动问题。

为了解决这些问题,我们引入在线预测架构。很多大团队直接跳过了离线预测架。我 2010 年在百度实习见识的就是在线预测架构了。

2. 在线预测

在线预测的广告和推荐系统过程如下所示:1)线下部分,从用户和物品属性抽取用户和物品特征,把抽取的特征合并进日志生成训练数据用于训练机,并把抽取的特征上载到线上 Redis 服务器;2)线上部分,来了一个请求,从 Redis 服务器取出用户和物品特征,将特征合并进请求生成预测实例,用线上模型得到预测结果。

adrec1

在线预测解决了离线预测的问题,系统变得更加灵活,也变得更加复杂了。随着数据量的增加,业务场景多样化,在线预测面临了两个突出问题。

第一个问题是系统性能。随着特征工程和深度学习的发展,机器学习要求和能够利用的数据量越来越多。这个时候线下训练需要的系统资源和时间越来越长。训练系统