推荐系统领域是深度学习落地最充分,产生商业价值最大的应用领域之一。
一些最前沿的研究成果大多来自业界巨头的实践。从Facebook 2014年提出的GBDT LR组合模型引领特征工程模型化的方向开始,业界迎来了深度学习推荐系统应用的浪潮。
本文将由简入深,细致讲解Facebook的深度学习推荐系统。
本文内容节选自《深度学习推荐系统》一书。 深度学习在推荐系统领域掀起了一场技术革命,本书是一本致力于提高一线算法工程师们工业级推荐系统实践能力的技术干货。
从那时起,诸如Deep Crossing、Embedding等的深度学习手段被应用在特征工程上,并逐渐过渡到全深度学习的网络。从某种意义上讲,Facebook基于GBDT LR的广告推荐系统成了连接传统机器学习推荐系统时代和深度学习推荐系统时代的桥梁。此外,其在2014年就采用的在线学习、在线数据整合、负样本降采样等技术至今仍具有极强的工程意义。
2019年,Facebook又发布了最新的深度学习模型DLRM[2](Deep Learning Recommender Model),模型采用经典的深度学习模型架构,基于CPU GPU的训练平台完成模型训练,是业界经典的深度学习推荐系统尝试。
本节先介绍Facebook基于GBDT LR组合模型的推荐系统实现,再深入到DLRM的模型细节和实现中,一窥社交领域巨头企业推荐系统的风采。
推荐系统应用场景
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%左右。
GBDT LR模型与其他模型的效果对比
在模型的实际应用中,超参数的调节过程是影响效果的重要环节。在GBDT LR组合模型中,为了确定最优的GBDT子树规模,Facebook给出了子树规模与模型损失的关系曲线。
GBDT子树规模与模型损失的关系曲线
可以看出,在规模超过500棵子树后,增加子树规模对于损失下降的贡献微乎其微。特别是最后1000棵子树仅贡献了0.1%的损失下降。可以说,继续增加模型复杂性带来的收益几乎可以忽略不计,最终Facebook在实际应用中选择了600作为子树规模。
囿于Facebook巨大的数据量及GBDT较难实施并行化的特点,Facebook的工程师在实际应用中采用了“GBDT部分几天更新一次,LR部分准实时更新”的模型更新策略,兼顾模型的实时性和复杂度。
实时数据流架构
为了实现模型的准实时训练和特征的准实时更新,Facebook基于Scribe(由Facebook开发并开源的日志收集系统)构建了实时数据流架构,被称为online data joiner模块(在线数据整合),该模块与Facebook推荐系统其他模块的关系如下。
Facebook的online data joiner与其他模块的关系
该模块最重要的作用是准实时地把来自不同数据流的数据整合起来,形成训练样本,并最终与点击数据进行整合,形成完整的有标签样本。在整个过程中,最应该注意的有以下三点。
1.waiting window(数据等待窗口)的设定
waiting window指的是在曝光(impression)发生后,要等待多久才能够判定一个曝光行为是否产生了对应的点击。如果waiting window过大,则数据实时性会受影响;如果waiting window过小,则会有一部分点击数据来不及与曝光数据进行联结,导致样本CTR与真实值不符。这是一个工程调优的问题,需要有针对性地找到与实际业务相匹配的waiting window。除此之外,少量的点击数据遗漏是不可避免的,这就要求数据平台能够阶段性地对所有数据进行全量重新处理,避免流处理平台产生的误差积累。
2.分布式架构与全局统一的action id(行为id)
为了实现分布式架构下曝光记录和点击记录的整合,Facebook除了为每个行为建立全局统一的request id(请求id),还建立了HashQueue(哈希队列)用于缓存曝光记录。在HashQueue中的曝光记录,如果在等待窗口过期时还没有匹配到点击,就会被当作负样本。Facebook使用Scribe框架实现了这一过程,更多公司使用Kafka完成大数据缓存,使用Flink、Spark Streaming等流计算框架完成后续的实时计算。
3.数据流保护机制
Facebook专门提到了online data joiner的保护机制,因为一旦data joiner由于某些异常而失效(如点击数据流由于action id的Bug无法与曝光数据流进行正确联结),所有的样本都会成为负样本。由于模型实时进行训练和服务,模型准确度将立刻受到错误样本数据的影响,进而直接影响广告投放和公司利润,后果是非常严重的。为此,Facebook专门设立了异常检测机制,一旦发现实时样本流的数据分布发生变化,将立即切断在线学习的过程,防止预测模型受到影响。
降采样和模型校正
为了控制数据规模,降低训练开销,Facebook实践了两种降采样的方法——uniform subsampling(均匀采样)和 negative down sampling(负样本降采样,以下简称负采样)。均匀采样是对所有样本进行无差别的随机抽样,为选取最优的采样频率,Facebook试验了1%、10%、50%、100%四个采样频率,图8-3比较了不同采样频率下训练出的模型的损失。
不同采样频率下的模型损失
可以看到,当采样频率为10%时,相比全量数据训练的模型(最右侧100%的柱状图),模型损失仅上升了1%,而当采样频率降低到1%时,模型损失大幅上升了9%左右。因此,10%的采样频率是一个比较合适的平衡工程消耗和理论最优的选择。
另一种方法负采样则保留全量正样本,对负样本进行降采样。除了提高训练效率,负采样还直接解决了正负样本不均衡的问题,Facebook经验性地选择了从0.0001到0.1的负采样频率,试验效果如下。
不同负采样频率下的模型损失
可以看到,当负采样频率在0.0250时,模型损失不仅小于基于更低采样频率训练出来的模型,居然也小于负采样频率在0.1时训练出来的模型。虽然Facebook在论文中没有做出进一步的解释,但最可能的原因是通过解决数据不均衡问题带来的效果提升。在实际应用中,Facebook采用了0.0250的负采样频率。
负采样带来的问题是CTR预估值的漂移,假设真实CTR是0.1%,进行0.01的负采样之后,CTR将会攀升到10%左右。为了进行准确的竞价及ROI预估,CTR预估模型是要提供准确的、有物理意义的CTR值的,因此在进行负采样后需要进行CTR的校正,使CTR模型的预估值的期望回到0.1%。校正的公式如下。
其中q是校正后的CTR,p是模型的预估CTR,w是负采样频率。通过负采样计算CTR的过程并不复杂,有兴趣的读者可以根据负采样的过程手动推导上面的式子。
Facebook GBDT LR组合模型的工程实践
Facebook基于GBDT LR组合模型实现的广告推荐系统虽然已经是2014年的工作,但我们仍能从中吸取不少模型改造和工程实现的经验,总结来讲最值得学习的有下面三点:
1.特征工程模型化
2014年,在很多从业者还在通过调参经验尝试各种特征组合的时候,Facebook利用模型进行特征自动组合和筛选是相当创新的思路,也几乎是从那时起,各种深度学习和Embedding的思想开始爆发,发扬着特征工程模型化的思路。
2.模型复杂性和实效性的权衡
对GBDT和LR采用不同的更新频率是非常工程化且有价值的实践经验,也是对组合模型各部分优点最大化的解决方案。
3.有想法要用数据验证
在工作中,我们往往有很多直觉上的结论,比如数据和模型实时性的影响有多大,GBDT应该设置多少棵子树,到底用负采样还是随机采样。针对这些问题,Facebook告诉我们用数据说话,无论是多么小的一个选择,都应该用数据支撑,这才是一位工程师严谨的工作态度。
Facebook的深度学习模型DLRM
时隔5年,Facebook于2019年再次公布了其推荐系统深度学习模型DLRM(Deep Learning Recommender Model),相比GBDT LR,DLRM是一次彻底的应用深度学习模型的尝试。接下来将介绍DLRM的模型结构、训练方法和效果评估。
DLRM的模型型各层的作用如下。
DLRM的模型结构
特征工程:所有特征被分为两类:一类是将类别、id类特征用one-hot编码生成的稀疏特征(sparse features);另一类是数值型连续特征(dense features)。
Embedding层:每个类别型特征转换成one-hot向量后,用Embedding层将其转换成维度为n的Embedding向量。也就是说,将稀疏特征转换成Embedding向量。而年龄、收入等连续型特征将被连接(concat)成一个特征向量,输入图中黄色的MLP中,被转化成同样维度为n的向量。至此,无论是类别型稀疏特征,还是连续型特征组成的特征向量,在经过Embedding层后,都被转换成了n维的Embedding向量。
神经网络层(NNs层):Embedding层之上是由三角形代表的神经网络层。也就是说,得到n维的Embedding 向量后,每类Embedding还有可能进一步通过神经网络层做转换。但这个过程是有选择性的,根据调参和性能评估的情况来决定是否引入神经网络层进行进一步的特征处理。
特征交互层(interactions层):这一层会将之前的Embedding两两做内积,再与之前连续型特征对应的Embedding连接,输入后续的MLP。所以这一步其实与3.5节介绍的PNN一样,目的是让特征之间做充分的交叉,组合之后,再进入上层MLP做最终的目标拟合。
目标拟合层:结构图中最上层的蓝色三角代表了另一个全连接多层神经网络,在最后一层使用 sigmoid函数给出最终的点击率预估,这也是非常标准的深度学习模型输出层的设置。
从DLRM的模型结构中可以看出,模型结构并不特别复杂,也没有加入注意力机制、序列模型、强化学习等模型思路,是一个非常标准的工业界深度学习推荐模型。这与Facebook务实的技术风格相关,也说明在海量数据的背景下,简单的模型结构就可以发挥不俗的作用。
DLRM模型并行训练方法
作为一篇来自工业界的论文,模型的实际训练方法往往可以让业界同行收益颇多。Facebook的数据量之大,单节点的模型训练必然无法快速完成训练任务,因此模型的并行训练就是必须采用的解决方法。
简单来说,DLRM融合使用了模型并行和数据并行的方法,对Embedding部分采用了模型并行,对MLP部分采用了数据并行。Embedding部分采用模型并行的目的是减轻大量Embedding层参数带来的内存瓶颈问题。MLP部分采用数据并行可以并行进行前向和反向传播。
其中,Embedding做模型并行训练指的是在一个device(设备)或者计算节点上,仅保存一部分Embedding层参数,每个设备进行并行mini batch梯度更新时,仅更新自己节点上的部分Embedding层参数。
MLP层和特征交互层进行数据并行训练指的是每个设备上已经有了全部模型参数,每个设备利用部分数据计算梯度,再利用全量规约(AllReduce)的方法汇总所有梯度进行参数更新。
DLRM模型的效果
DLRM的训练是在Facebook自研的AI平台Big Basin platform上进行的,平台的具体配置是Dual Socket Intel Xeon 6138 CPU@2.00GHz 8个Nvidia Tesla V100 16GB GPUs。
Facebook Big Basin AI硬件平台
很明显,Big Basin platform是一个高性能的CPU GPU的组合平台,这节约了大量网络通信的成本,但在扩展性方面没有Parameter Server灵活。
在性能的对比上,DLRM选择了谷歌2017年提出的DCN作为baseline(性能基准)。通过对比DLRM和DCN可以发现,DLRM和DCN的主要区别在于特征交叉方式的不同,DLRM采用了不同特征域两两内积的交叉方式,而DCN采用了比较复杂的cross layer的特征交叉方式。以Criteo Ad Kaggle data为测试集,二者的性能对比下。
DLRM与DCN性能对比
可以看出,DLRM在准确率指标上稍胜一筹。当然,模型的性能与数据集的选择、参数的调优都有很大关系,而且DLRM在Adagrad训练方式下的优势已经微乎其微,这里的性能评估读者仅做参考即可。
Facebook深度学习推荐系统总结
无论是GBDT LR组合模型,还是最新的DLRM模型,Facebook的技术选择总给人非常工业化的感觉,简单直接,以解决问题为主。虽然从学术角度看模型的创新性不足,但业界的从业者却能从中借鉴非常多的工程实践经验。DLRM模型是非常标准且实用的深度学习推荐模型。如果公司刚开始从传统机器学习模型转到深度学习模型,则完全可以采用DLRM作为标准实现。而GBDT LR组合模型传递出的特征工程模型化及模型组合的思路,对推荐系统技术发展有更深远的影响。
==图书推荐==
王喆 编著
- 一线大厂推荐工程师倾囊相授
- 教你从零开始构建前沿、实用的推荐系统知识体系
- 揭秘巨头公司推荐系统背后的逻辑
- 梳理深度学习推荐系统的发展脉络,厘清每个关键模型和技术的细节