深度学习推荐系统的前沿实践

参考自《深度学习推荐系统》——王喆,用于学习和记录。

Facebook的深度学习推荐系统

2014年,Facebook发表了广告推荐系统论文 Practical Lessons from Predicting Clicks on Ads at Facebook,提出了经典的GBDT+LR的CTR模型结构。严格意义上讲,GBDT+LR的模型结构不属于深度学习的范畴,但在当时,利用GBDT模型进行特征的自动组合和筛选,开启了特征工程模型化、自动化的新阶段。从那时起,诸如DeepCrossing、Embedding等的深度学习手段被应用在特征工程上,并逐渐过渡到全深度学习的网络。从某种意义上讲,Facebook基于GBDT+LR的广告推荐系统成了连接传统机器学习推荐系统时代和深度学习推荐系统时代的桥梁。此外,其在2014年就采用的在线学习、在线数据整合、负样本降采样等技术至今仍具有极强的工程意义。

2019年,Facebook DLRM(Deep LearningRecommenderModel),模型采用经典的深度学习模型架构,基于CPU+GPU的训练平台完成模型训练,是业界经典的深度学习推荐系统尝试。

推荐系统应用场景

Facebook广告推荐系统的应用场景是一个标准的CTR预估场景,系统输入用户(User)、广告(Ad)、上下文(Context)的相关特征,预测CTR,进而利用CTR进行广告排序和推荐。需要强调的是:Facebook广告系统的其他模块需要利用CTR计算广告出价、投资回报率(Return on Investment,ROI)等预估值,因此CTR模型的预估值应是一个具有物理意义的精准的CTR,而不是仅仅输出广告排序的高低关系(这一点是计算广告系统与推荐系统关键的不同之处)。Facebook也特别介绍了CTR校正的方法,用于在CTR预估模型输出值与真实值有偏离时进行校正。

以GBDT+LR组合模型为基础的CTR预估模型

简而言之,Facebook的CTR预估模型采用了GBDT+LR的模型结构,通过GBDT自动进行特征筛选和组合,生成新的离散型特征向量,再把该特征向量当作LR模型的输人,预测CTR。

其中,使用GBDT构建特征工程和利用LR预测CTR两步是采用相同的优化目标独立训练的。所以不存在如何将LR的梯度回传到GBDT这类复杂的训练问题,这样的做法也符合Facebook一贯的实用主义的风格。

在引入GBDT+LR的模型后,相比单纯的LR和GBDT,提升效果非常显著。从表中可以看出,混合模型比单纯的LR或GBDT模型在损失(Loss)上减少了 3 % 3\% 3% 左右。

GBDT+LR模型与其他模型的效果对比

在模型的实际应用中,超参数的调节过程是影响效果的重要环节。在GBDT + L R +\mathrm{LR} +LR 组合模型中,为了确定最优的GBDT子树规模,Facebook给出了子树规模与模型损失的关系曲线(如图所示)。


GBDT子树规模与模型损失的关系曲线

可以看出,在规模超过500棵子树后,增加子树规模对于损失下降的贡献微乎其微。特别是最后1000棵子树仅贡献了 0.1 % 0.1\% 0.1% 的损失下降。可以说,继续增加模型复杂性带来的收益几乎可以忽略不计,最终Facebook在实际应用中选择了600作为子树规模。

囿于Facebook巨大的数据量及GBDT较难实施并行化的特点,Facebook的工程师在实际应用中采用了“GBDT部分几天更新一次,LR部分准实时更新”的模型更新策略,兼顾模型的实时性和复杂度。

实时数据流架构

为了实现模型的准实时训练和特征的准实时更新,Facebook基于Scribe(由Facebook开发并开源的日志收集系统)构建了实时数据流架构,被称为onlinedatajoiner模块(在线数据整合),该模块与Facebook推荐系统其他模块的关系如图所示。


Facebook 的 online data joiner 与其他模块的关系

该模块最重要的作用是准实时地把来自不同数据流的数据整合起来,形成训练样本,并最终与点击数据进行整合,形成完整的有标签样本。在整个过程中,最应该注意的有以下三点。

1.waiting window(数据等待窗口)的设定

waiting window 指的是在曝光(impression)发生后,要等待多久才能够判定一个曝光行为是否产生了对应的点击。如果waitingwindow过大,则数据实时性会受影响;如果waitingwindow过小,则会有一部分点击数据来不及与曝光数据进行联结,导致样本CTR与真实值不符。这是一个工程调优的问题,需要有针对性地找到与实际业务相匹配的waitingwindow。除此之外,少量的点击数据遗漏是不可避免的,这就要求数据平台能够阶段性地对所有数据进行全量重新处理,避免流处理平台产生的误差积累。

2.分布式架构与全局统一的action id(行为id)

为了实现分布式架构下曝光记录和点击记录的整合,Facebook除了为每个行为建立全局统一的requestid(请求id),还建立了HashQueue(哈希队列)用于缓存曝光记录。在HashQueue中的曝光记录,如果在等待窗口过期时还没有匹配到点击,就会被当作负样本。Facebook使用Scribe框架实现了这一过程,更多公司使用Kafka完成大数据缓存,使用Flink、Spark Streaming后续的实时计算。

3.数据流保护机制

Facebook 专门提到了 online data joiner 的保护机制,因为一旦 data joiner 由于某些异常而失效(如点击数据流由于action id的Bug无法与曝光数据流进行正确联结),所有的样本都会成为负样本。由于模型实时进行训练和服务,模型准确度将立刻受到错误样本数据的影响,进而直接影响广告投放和公司利润,后果是非常严重的。为此,Facebook专门设立了异常检测机制,一旦发现实时样本流的数据分布发生变化,将立即切断在线学习的过程,防止预测模型受到影响。

降采样和模型校正

为了控制数据规模,降低训练开销,Facebook实践了两种降采样的方法uniform sub sampling(均匀采样)和 negative down sampling(负样本降采样,以 下简称负采样)。均匀采样是对所有样本进行无差别的随机抽样,为选取最优的采样频率,Facebook 1 % 1\% 1% 10 % 10\% 10% 50 % 50\% 50% 100 % 100\% 100% 四个采样频率,下图比较 了不同采样频率下训练出的模型的损失。

不同采样频率下的模型损失

可以看到,当采样频率为 10 % 10\% 10% 时,相比全量数据训练的模型(最右侧 100 % 100\% 100% 的柱状图),模型损失仅上升了 1 % 1\% 1% ,而当采样频率降低到 1 % 1\% 1% 时,模型损失大幅上升了 9 % 9\% 9% 左右。因此, 10 % 10\% 10% 的采样频率是一个比较合适的平衡工程消耗和理论最优的选择。

另一种方法负采样则保留全量正样本,对负样本进行降采样。除了提高训练效率,负采样还直接解决了正负样本不均衡的问题,Facebook经验性地选择了从 0.0001到0.1的负采样频率,试验效果如图所示。


不同负采样频率下的模型损失

可以看到,当负采样频率在0.0250时,模型损失不仅小于基于更低采样频率训练出来的模型,居然也小于负采样频率在0.1时训练出来的模型负采样是保留所有的正样本,对负样本进行降采样。虽然Facebook 在论文中没有做出进一步的解释,但最可能的原因是通过解决数据不均衡问题带来的效果提升。在实际应用中,Facebook采用了0.0250的负采样频率。

负采样带来的问题是CTR预估值的漂移,假设真实CTR是 0.1 % 0.1\% 0.1% ,进行0.01的负采样之后,CTR将会攀升到 10 % 10\% 10% 左右。为了进行准确的竞价及ROI预估,CTR预估模型是要提供准确的、有物理意义的CTR值的,因此在进行负采样后需要进行CTR的校正,使CTR模型的预估值的期望回到 0.1 % 0.1\% 0.1% 。校正的公式如式所示。

q = p p + ( 1 − p ) / w q=\frac{p}{p+(1-p)/w} q=p+(1p)/wp

其中 q q q 是校正后的CTR, p p p 是模型的预估CTR, w w w 是负采样频率。

Facebook GBDT+LR 组合模型的工程实现

Facebook基于GBDT+LR组合模型实现的广告推荐系统虽然已经是2014年的工作,但我们仍能从中吸取不少模型改造和工程实现的经验,总结来讲最值得学习的有下面三点:

1.特征工程模型化

2014年,在很多从业者还在通过调参经验尝试各种特征组合的时候,Facebook利用模型进行特征自动组合和筛选是相当创新的思路,也儿乎是从那时起,各种深度学习和Embedding的思想开始爆发,发扬着特征工程模型化的思路。

2.模型复杂性和实效性的权衡

对GBDT和LR采用不同的更新频率是非常工程化且有价值的实践经验,也是对组合模型各部分优点最大化的解决方案。

3.有想法要用数据验证

在工作中,我们往往有很多直觉上的结论,比如数据和模型实时性的影响有多大,GBDT应该设置多少棵子树,到底用负采样还是随机采样。针对这些问题,Facebook告诉我们用数据说话,无论是多么小的一个选择,都应该用数据支撑,这才是一位工程师严谨的工作态度。

Facebook 的深度学习模型 DLRM

时隔5年,Facebook于2019年再次公布了其推荐系统深度学习模型DLRM(DeepLearning Recommend er Model),相比GBDT+LR,DLR M习模型的尝试。接下来将介绍DLRM的模型结构、训练方法和效果评估。

DLRM的模型结构如图所示,模型各层的作用如下。


DLRM的模型结构

特征工程:所有特征被分为两类:一类是将类别、id类特征用one-hot编码生成的稀疏特征(sparse features);另一类是数值型连续特征(dense features)。

Embedding层:one-hot向量后,Embedding其转换成维度为 n n n Embedding。也就是说,将稀疏特征转换成Embedding向量。而年龄、收人等连续型特征将被连接(concat)成一个特征向量,输入图中黄色的MLP中,被转化成同样维度为 n n n 的向量。至此,无论是类别型稀疏特征,还是连续型特征组成的特征向量,在经过Embedding层后,都被转换成了 n n n Embedding。

神经网络层(NNs层):Embedding层之上是由三角形代表的神经网络层。也就是说,得到 n n n Embedding,每类Embedding还有可能进一步通过神经网络层做转换。但这个过程是有选择性的,根据调参和性能评估的情况来决定是否引入神经网络层进行进一步的特征处理。

特征交互层(interactions层):这一层会将之前的Embedding两两做内积,再与之前连续型特征对应的Embedding连接,输入后续的MLP。所以这一步其实与之前节介绍的PNN一样,自的是让特征之间做充分的交叉,组合之后,再进入上层MLP做最终的目标拟合。

目标拟合层:结构图中最上层的蓝色三角代表了另一个全连接多层神经网络,在最后一层使用sigmoid函数给出最终的点击率预估,这也是非常标准的深度学习模型输出层的设置。

从DLRM的模型结构中可以看出,模型结构并不特别复杂,也没有加人注意力机制、序列模型、强化学习等模型思路,是一个非常标准的工业界深度学习推荐模型。这与Facebook务实的技术风格相关,也说明在海量数据的背景下,简单的模型结构就可以发挥不俗的作用。

DLRM模型并行训练方法

作为一篇来自工业界的论文,模型的实际训练方法往往可以让业界同行收益颇多。Facebook的数据量之大,单节点的模型训练必然无法快速完成训练任务,因此模型的并行训练就是必须采用的解决方法。

简单来说,DLRM融合使用了模型并行和数据并行的方法,对Embedding部分采用了模型并行,对MLP部分采用了数据并行。Embedding部分采用模型并行的目的是减轻大量Embedding层参数带来的内存瓶颈问题。MLP部分采用 数据并行可以并行进行前向和反向传播。

其中,Embedding做模型并行训练指的是在一个device(设备)或者计算节点上,仅保存一部分Embedding层参数,每个设备进行并行minibatch梯度更新时,仅更新自己节点上的部分Embedding层参数。

MLP层和特征交互层进行数据并行训练指的是每个设备上已经有了全部模型参数,每个设备利用部分数据计算梯度,再利用全量规约(AllReduce)的方法汇总所有梯度进行参数更新。

DLRM模型的效果

DLRM 的训练是在 Facebook 自研的 AI 平台 Big Basin platform 上进行的,平台的具体配置是 Dual Socket Intel Xeon 6138 CPU@2.00GHz + 8 {+8} +8 Nvidia TeslaV 10016 GB GPUs。

很明显,Big Basin platform 是一个高性能的 CPU+GPU的组合平台,没有采用类似ParameterServer的分布式硬件架构。这节约了大量网络通信的成本,但在扩展性方面没有ParameterServer灵活。

在性能的对比上,DLRM选择了谷歌2017年提出的DCN作为baseline(性能基准)。通过对比本节介绍的DLRM和DCN可以发现,DLRM和DCN的主要区别在于特征交叉方式的不同,DLRM采用了不同特征域两两内积的交叉方式,而DCN采用了比较复杂的crosslayer的特征交叉方式。以Criteo Ad Kaggle data 为测试集,二者性能对比如图所示:

DLRM与DCN性能对比

可以看出,DLRM在准确率指标上稍胜一筹。当然,模型的性能与数据集的选择、参数的调优都有很大关系,而且DLRM在Adagrad训练方式下的优势已经微乎其微,这里的性能评估仅做参考即可。

Facebook深度学习推荐系统总结

无论是GBDT+LR组合模型,还是最新的DLRM模型,Facebook的技术选择总给人非常工业化的感觉,简单直接,以解决问题为主。虽然从学术角度看模型的创新性不足,但业界的从业者却能从中借鉴非常多的工程实践经验。DLRM模型是非常标准且实用的深度学习推荐模型。如果公司刚开始从传统机器学习模型转到深度学习模型,则完全可以采用DLRM作为标准实现。而GBDT+LR组合模型传递出的特征工程模型化及模型组合的思路,对推荐系统技术发展有更深远的影响。

Airbnb 基于 Embedding 的实时搜索推荐系统

2018年,Airbnb 在 KDD 上发表了论文 Real-time Personalization usingEmbedding s for Search Ranking at Airbnb,被评为当次会议的最佳论文。该文第一作者,Airbnb的高级机器学习科学家Mihajlo也在多个技术会议上分享过Airbnb的搜索推荐系统。其中,Airbnb对Embedding技术的应用尤为值得学习。

作为深度学习的“核心操作”之一,Embedding技术不仅能够将大量怖疏特征转换成稠密特征,便于输入深度学习网络,而且能够通过Embedding将物品的语义特征进行编码,直接通过相似度的计算进行相似物品的搜索。Airbnb正是充分挖掘了Embedding的这两点优势,基于Embedding构建了其实时搜索推荐系统。

推荐系统应用场景

Airbnb作为全世界最大的短租网站,提供了一个连接房主(host)和短租客(guest/user)的中介平台。这样一个短租房中介平台的交互方式是一个典型的搜索推荐场景,租客输人地点、价位、关键词等信息后,Airbnb会给出房源的搜索推荐列表,如图所示。


Airbnb的搜索业务场景

在展示了房源推荐列表后,租客和房主之间的交互方式包括以下几种(如图所示):
租客点击(Click)房源。
租客立即预订(Instant Book)房源。
租客发出预订请求(BookingRequest),房主有可能拒绝(Reject)、同意(Accept)或者不响应(NoResponse)租客的预订请求。


Airbnb中的不同交互方式

Airbnb的搜索团队正是基于这样的业务场景,利用几种交互方式产生的历史数据构建了实时搜索排序模型。为了捕捉用户的“短期”和“长期”兴趣,Airbnb并没有将用户历史数据中的点击房源id序列(clickedlistingids)或者预订房源id序列(bookedlistingids)直接输人排序模型,而是先对租客和房源分别进行Embedding,进而利用Embedding的结果构建出诸多特征,作为排序模型的输人。

具体到Embedding方法上,Airbnb 生成了两种不同的 Embedding,分别对用户的“短期”和“长期”兴趣进行编码。其中生成短期兴趣Embedding的目的是进行房源的相似推荐,以及对用户进行session(会话)内的实时个性化推荐。生成长期兴趣Embedding的目的是在最终的推荐结果中照顾到用户之前的预订偏好,推荐更容易被用户预订的个性化房源

基于短期兴趣的房源Embedding方法

Airbnb 利用 Session 内点击数据对房源进行 Embedding,捕捉用户在一次搜索过程中的短期兴趣,其中Session内点击数据指的是一个用户在一次搜索过程中点击的房源序列,这个序列需要满足两个条件:一是只有在房源详情页停留超过30秒才算序列中的一个数据点;二是如果用户超过30分钟没有动作,那么这个序列会被打断,不再是一个序列。这么做的目的有二,一是清洗噪声点和负反馈信号;二是避免非相关序列的产生。Session内点击序列的定义和条件示意图如图所示。

Session内点击序列的定义和条件

有了由点击房源组成的序列(sequence),就可以像之前介绍的Item2vec方法那样,把这个序列当作一个“句子”样本,开始Embedding的过程。Airbnb选择了Word2vec 的 skip-gram model 作为 Embedding 方法的框架,通过修改Word2vec的目标函数(objective)使其逼近Airbnb的业务目标。

这里直接列出Word2vec的skip-gram model:

arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D log ⁡ p ( c ∣ w ) = ∑ ( w , c ) ∈ D ( log ⁡ e v c ⋅ v w − log ⁡ ∑ c ′ e v c ′ ⋅ v w ) \underset{\theta}{\arg\operatorname*{max}}\sum_{(w,c)\in D}\log p(c|w)=\sum_{(w,c)\in D}\left(\log\mathrm{e}^{v_{c}\cdot v_{w}}-\log\sum_{c^{\prime}}\mathrm{e}^{v_{c^{\prime}}\cdot v_{w}}\right) θargmax(w,c)Dlogp(cw)=(w,c)D(logevcvwlogcevcvw)

在采用负样本的训练方式后,目标函数转换成了如下形式:
arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D log ⁡ σ ( v c ⋅ v w ) + ∑ ( w , c ) ∈ D ′ log ⁡ σ ( − v c ⋅ v w ) \arg\operatorname*{max}_{\theta}\sum_{(w,c)\in D}\log\sigma\left(v_{c}\cdot v_{w}\right)+\sum_{(w,c)\in D^{\prime}}\log\sigma\left(-v_{c}\cdot v_{w}\right) argθmax(w,c)Dlogσ(vcvw)+(w,c)Dlogσ(vcv

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值