深入浅出推荐系统(九):排序:古法良方--线性模型与树模型

在深度学习出来之前,逻辑回归(Logistics Regression,LR)在广告及推荐系统的排序模块里,可以说是横扫千军一般的存在。它实现简单,性能高效,通过大量的特征堆砌就可以不断提升效果,因此是CTR模型的不二选择。但其线性特性使之无法捕捉特征间的组合模式。因此,FM、FMM模型被相继提出,相较于LR,后者可以捕获特征间的二阶组合。同时,Facebook提出了通过GBDT解决LR特征组合的问题,以不同方式完美解决了LR的这一弱点。 [ 1 ] ^{[1]} [1]此后,GBDT与LR的组合方案开始在业界广泛使用。今天的文章,我们就来谈一谈LR与GBDT的融合模型,看看它是如何在CTR预估中发挥威力的。

基础模型介绍

LR模型

LR原理

提到LR,就需要先从线性回归模型讲起,线性回归的概念是这样的:对多维空间中的样本点,使用特征的加权线性组合去拟合样本的分布和轨迹。如下图所示:
在这里插入图片描述
公式表示如下:
h w ( x i ) = w 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n h w ( x j ) = x T x i = W T X X = ( 1 x 1 ⋮ x n ) W = ( w 0 w 1 ⋮ w n ) \begin{align} &h_w(x^i) = w_0 + w_1x_1 + w_2x_2 + ... + w_nx_n \\ &h_w(x^j) = x^Tx_i=W^TX \\ & \qquad X =\begin{array}{lc} \left( \begin{array}{c} 1 \\ x_1 \\ \vdots \\ x_n \end{array} \right) \end{array} \qquad W = \begin{array}{lc} \left( \begin{array}{c} w_0 \\ w_1 \\ \vdots \\ w_n \end{array} \right) \end{array} \end{align} hw(xi)=w0+w1x1+w2x2+...+wnxnhw(xj)=xTxi=WTXX= 1x1xn W= w0w1wn
使用最小二乘法,线性回归可以求得最优解。之后就可以用训练好的模型进行预测。线性模型较好地完成回归任务,即,可以对连续值–如房价、外卖配送时间、客流量等进行有效预测。但由于线性回归预测值并无上下界,因此较难完成分类任务。即使对于二分类任务,采用阈值方式,也较难设计出一个较好的分类器。这种情况下,逻辑回归应运而生。

逻辑回归的目标是将线性输出范围强制规范到(0,1)之间。形式上,它在线性回归之外套了一层sigmod函数(也就是“逻辑”函数)。
y = 1 1 + e − f ( x ) = 1 1 + e − W T x y = \frac{1}{1+e^{-f(x)}} = \frac{1}{1+e^{-W^T}x} y=1+ef(x)1=1+eWTx1

其中 e − W T x e^{-W^T}x eWTx就是线性回归的部分。逻辑回归虽名为回归,其实是为分类任务而设计的。它适用于各种用于回答“是/否”的二分类的场景,如风控(鉴别样本的好坏)、CTR预估(用户是否点击)、用户画像中对于分类特征预估(如性别、用户对于某些类别是否喜欢)等。在推荐系统的CTR预估场景中,0为未点击,1为点击,可以用于训练。当训练好模型参数后,线上获取特征值,带入模型,就可以算出模型预估出的结果,其取值范围为(0,1),恰好可以代表用户点击的概率,对于每一个物品都预估了相应的CTR,则预估值就有了排序的意义。

那么该如何训练LR模型呢?训练模型之前需要先确定模型的损失函数:线性回归的损失函数是误差平方和,对于逻辑回归,则是交叉熵损失函数,这个名字比较拗口。在信息论里,其含义是指两个概率分布的差异性信息,公式上表达如下:
H ( p , q ) = − ∑ x p ( x ) l o g q ( x ) H(p,q) = -\sum_{x}p(x)logq(x) H(p,q)=xp(x)logq(x)

其中,p是真实概率,q是预估概率,由于p取值仅为1和0,因此可以展开如下:
H ( y , y ^ ) = − ∑ i = 1 m [ y ( i ) l o g y ^ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ] H(y, \hat{y}) = -\sum_{i=1}^{m}[y^{(i)}log\hat{y}^{(i)}+(1-y^{(i)})log(1-\hat{y}^{(i)}] H(y,y^)=i=1m[y(i)logy^(i)+(1y(i))log(1y^(i)]

交叉熵越低,意味着预估的概率分布与真实的概率分布越接近,结果越好。从公式中也可以看出,当真实值y=1时,损失函数变为 y ( i ) l o g y ^ ( i ) y^{(i)}log\hat{y}^{(i)} y(i)logy^(i) y ^ ( i ) \hat{y}^{(i)} y^(i)越接近1,则 l o g y ^ ( i ) log\hat{y}^{(i)} logy^(i)越接近0,损失函数越小;反之亦然。因此,逻辑回归的目标就是最小化交叉熵损失函数。

训练是用比较常见的方法:对损失函数求导,采用梯度下降法求解。所谓梯度下降,是指当一个函数拥有最值时,通过往当前的切线(即导数方向)不断下降逼近最优解。梯度下降的方法可以使得模型训练变成多轮次迭代,每一轮迭代都逐渐减少loss。如下图:
在这里插入图片描述

通过不断的梯度下降,来训练模型,使损失函数值越来越小。为了提升训练的效率,会使用随机梯度下降(Stochastic gradient descent,SGD)或小批量梯度下降(Mini-Batch Gradient Descent)等方法 [ 2 ] ^{[2]} [2];不同参数更新频率有所区别,则可以使用Adam [ 2 ] ^{[2]} [2]等方法对参数进行更新;为了防止训练过程出现震荡(在最值点附近反复震荡),通常会为了防止过拟合(预测结果在训练集上表现很好但是实际测试效果不好),会对参数进行正则化 [ 3 ] ^{[3]} [3],包括L1正则和L2正则,本质是对参数的数量和取值大小进行限制。本文不再对具体优化方法进行详细阐述,感兴趣的读者可以查阅文末参考资料。

LR实际应用

LR原理介绍完了,那该如何应用LR来训练一个点击率预估模型呢?大致流程如下:
在这里插入图片描述
如图所示,整个训练和预估流程分为如下几步:

  1. 获取原始数据和标签数据,对原始数据进行清洗和特征转换,图中我们给了几个例子:其中X代表特征数据,包含了用户画像特征(年龄、性别、爱好等),场景特征(时间戳、搜索历史等),物品特征(当前类目,页面关键词等),浏览日志和点击日志需要进行拼接才能获得,其中点击为标签数据y,0代表未点击,1代表点击。由于LR模型限制,需要对原始数据转化,将其转化成离散特征(如连续特征年龄,可以转化为年龄段:0-25,26-30,31-45…从而变成离散特征)。
  2. 离线进行模型训练,以得到对应特征的模型参数,训练既可以在spark平台上进行,也可以在本地训练(可以使用sklearn包等),如果公司有机器学习平台,也可以将数据导入机器学习平台进行训练;
  3. 训练结果就是LR模型的各个参数,参数可以写入线上KV存储,供给线上服务。由于LR模型相对简单,这里可选的手段有很多,如mysql、redis、tair等均可,即使以文件方式提供给线上服务加载亦可,原则是能够匹配线上请求的快速响应以及公司相关的技术栈。对于复杂模型如深度学习,则需要专门的线上inference服务来实现。
  4. 线上实时获取各类物品、用户及场景特征,通过转换器将特征转换为与训练数据一致的类型的特征(离线和在线需保持一样的特征转换逻辑):这种转化既可以以服务方式统一提供,也可以以脚本、封装library的方式提供。
  5. 线上通过服务读取训练好的LR模型参数,将转换好的特征输入模型,进行实时预估;线上的请求数据写入实时流,并最终保存在离线系统中,用于下次的训练。
  6. 根据预估值对当前批次的物品进行排序。

以上就是LR模型的介绍,接下来我们看下GBDT模型。

GBDT

GBDT原理

GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树。从名字中可以看出,GBDT的基础模型是决策树,它实质就是多棵决策树的组合。其核心思想是误差强化(Boosting):在训练基分类器(决策树)时采用串行的方式,依次生成新的决策树;在生成新决策树时,针对前一棵决策树分错的样本,给予更高的权重。所有决策树生成后,则训练完毕。预测可以并行进行,根据每棵决策树的加权结果,得到最终的预测结果。

GBDT的思想很简单,它将每棵决策树当作一个弱分类器,弱分类器的结果相加等于预测值,预测值与实际值有一个误差,即残差,而下一颗决策树就去拟合这个残差,使得残差越来越小。这样所有弱分类器加起来,就变成了强分类器。

GBDT训练与预测

举一个简单的例子,一个系统对用户做用户画像,猜测用户的年龄,假设可用的特征包括:常见购物品类、购物均价,上网时间,性别等等。我们使用这些特征构建GBDT树,来预测用户年龄。假设有4个样本,年龄分别为:23岁、19岁、36岁、26岁。我们构建的GBDT树如下图所示:
在这里插入图片描述
在每个节点上,比较各个特征,选择最合适的分割点(最合适的分割点会使得子节点上总体预估损失最小)进行分割。如上图左侧,将原始样本分成左右两个节点,样本根据不同分支条件流入不同子节点。子节点的取值取样本均值(如果预估的是分类目标,如性别、是否已婚等,也需要使用数值来表达,同样取均值来生成节点预估值);接着,节点内样本根据预估值和实际值的差异计算残差,如上图中右边的树所示。基于残差继续生成新的树。图中仅给了两棵树的示例,实际上可以在残差基础上继续生成新的树,直到残差总体小于某个阈值,或达到指定树的棵数为止。

预测的时候,则使用样本在每棵树上对应的节点预估值做加和。比如第一个样本(23),在第一棵树上的预估值是21,第二棵树预估值是2,加起来是23。其他节点依此类推。

读者读到这里,也许会有疑问,为什么需要使用残差来构建新的树呢?何不使用原始值来构建呢?这里提一句,继续使用原始值构建树的方案,即为随机森林,背后的思想是多个专家投票决定。那么GBDT用残差来构建新的树,优势在何处呢?因为GBDT本质是用残差来代表负梯度(损失函数为均方根的情况下),所谓负梯度就是让损失函数最快下降的方向,而每构建一棵新的树,都会让损失不断变小,相当于逐步优化,因此GBDT可以达到一个更好的预估精度。

GBDT优势及应用

那么GBDT有哪些良好特性呢?一、它可以构建出良好的特征组合,比如我们上面示例图中,第二棵树就将“23点以后上网天数比例”和“购物均价”这两个特征进行了有效组合,这一良好特性也使得GBDT能够跟LR结合进行CTR预估,这个我们马上会谈到;二、它有很好的泛化能力,不像一般的决策树或随机森林,由于GBDT使用多棵树不断拟合负梯度,因此它每棵树的深度都很浅,这就决定了GBDT具有良好的泛化能力(简单模型的适配性要高于复杂模型)。同时,GBDT训练时的低偏差可以通过多棵树来实现,因此也具备了较好的预估精度;三、可以进行特征选择,筛选出重要特征,这个是决策树的一般特性,在树节点分裂时,总会先选出最重要的特征,事实上树从高到低的选择的分裂特征,可以看成是特征重要度的排序。

但GBDT同样也有弱点:它不太擅长处理大量id类特征,而比较适合处理连续值。因为id类特征通常具有海量特性(如用户id,商品id),GBDT由于树的深度和棵树限制,无法进行有效的存储;且对id类特征进行分割,存在着性能瓶颈,单机很难完成。

那么实践中,GBDT是如何被使用的呢?虽然LR+GBDT是深度学习出来之前较为流行的CTR预估模型,但实际上存在大量只用GBDT进行CTR预估的实践。一般训练过程中,以点击/未点击为二分类目标,在大量特征基础上构建GBDT,而线上应用时,则将缓存好的参数取出,根据获取的实时变量,对点击率进行预估和排序。

融合模型

分别介绍完了LR和GBDT,我们进入今天的重头戏–两者的融合模型。如前面所说,LR具有快速、大规模的优点,但无法捕获组合特征;而GBDT则恰恰相反。因此,将两者结合有助于发挥二者所长。两者融合模型如下图所示:
在这里插入图片描述

GBDT每棵树上的输出节点作为LR的输入,每个节点使用0/1来表示。对于单一样本,通过遍历树,就能得到该样本的所有LR特征(不得不说,由于树的存在,对缺失值的处理也会变得更友好)。如我们前面GBDT的图例所示,该GBDT树对每个样本都会输出5个节点,假如某样本常见购物品类为游戏,23点以后上网天数比例>50%,且购物均价<=100,则该样本的GBDT输出向量为[1,0,0,1,0],将这个向量输入LR模型继续进行分类。

整个方案说起来还是比较简单的,它巧妙的地方在于能想到融合这两种模型,并分别利用了各自的特性。方法虽然简单,但能够想到这种方法,却并不简单。LR+GBDT的重大意义在于,它推动了特征工程模型化这个重要趋势,为后续深度学习中embedding技术的应用开辟了先河。这也给了我们一些启发,我们是否可以借助不同模型的特性,将其互相融合呢?!

工程实践

讲完了LR+GBDT的原理,我们来看看工程上是如何实践的。在广告系统中,广告ID通常是一个重要特征(推荐系统也是如此,但推荐系统中物品数量级要远远高于广告),因此对于那些曝光充分的广告,由于其训练样本充足,可以单独针对该广告建树,从而能够最大化地利用该广告的有区分度的特征和特征组合。而长尾广告则共同构建一类树(如以广告类别等为节点构建的树),这样对于曝光不充分的广告,也有机会得到相应特征。

由于LR+GBDT是两套模型的组合,因此在线上部署时有一些需要注意的点:通常情况下,LR和GBDT是分开训练的,GBDT可以每天或几天训练一次;而LR可以每天甚至实时训练。需要注意的是,灌入LR的GBDT特征一定要保证版本的一致性,即,当GBDT切换时,要确保同步训练的LR切换到对应版本。一般来说,线上对每个模型会存在两套版本,两者需要保证版本的同步切换,以避免新GBDT特征输出给老LR模型的情况。

总结

LR+GBDT模型可以说是深度学习到来之前最强大的CTR预估模型了。它充分利用了GBDT能够自动组合特征的优点,从而弥补了LR的缺陷。但这个模型组合仍然具有一些局限性:GBDT在训练过程中需要串行训练,没办法达到全局并行;且对于高维稀疏特征,GBDT容易过拟合。同时,由于双模型的存在,使得在线工程处理变得非常复杂,有时候模型线下表现很好,上线却不尽如人意,很多线上问题可能是由于工程原因引起的,较难排查。

推荐系统中,LR+GBDT代表着传统机器学习最后的骄傲。事实上,随着深度学习的迅猛发展,这个模型在大公司中已不再流行(在中小型公司里仍然还有很大的应用价值)。然而,回顾这个模型的起源、原理和实践过程,仍颇具意义。笔者最近在调研多模态领域的知识,在多模态领域,也存在着多个模型组合的情况,如图片产生的embedding,该如何应用在文本分类中?是每次同时训练两个模型,还是低频更新图片模型,高频训练文本模型?这些问题其实完全可以借鉴GBDT+LR的设计方案。

我们分析模型的优缺点,只是为了从中借鉴,进而扬长避短。由于每个模型都各有优劣,所以能够结合业务思考,选出最适合场景的模型,才是算法工程师的独特价值所在。

[1] Practical Lessons from Predicting Clicks on Ads at Facebook. http://quinonero.net/Publications/predicting-clicks-facebook.pdf
[2] 知乎:从 SGD 到 Adam —— 深度学习优化算法概览(一). https://zhuanlan.zhihu.com/p/32626442
[3] 吴恩达机器学习:LR回归与正则化. https://blog.csdn.net/weixin_44330777/article/details/108657746

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值