【搜狐】新闻推荐系统的 CTR 预估模型
出自 搜狐技术产品 公众号
一简介
在推荐系统的排序环节中,我们经常使用CTR(Click-Through Rate)预估的方式来构建排序模型。在业界的实际应用上,如何通过大规模数据提取出有效特征对用户行为建模、泛化一直是研究人员的工作方向,由于在推荐系统的实际应用中,数据通常非常稀疏,如何从大规模的稀疏特征中提取出有效的泛化特征是CTR预估模型的一个重大挑战。本文我们首先介绍了CTR预估模型的演变历史,并介绍如何使用DNN在推荐系统的排序情景进行CTR预估,通过特殊的网络结构得到高效的泛化特征提高模型的预测能力。
二 DNN在推荐系统中的应用
2.1 点击率预估模型
在新闻推荐系统中,想得到用户最可能点击的新闻,给定某用户及新闻的集合,通过提取特征我们可以得到三种特征:
-
用户特征(用户兴趣、年龄、性别等)
-
上下文特征(机型、网络等)
-
待预估新闻特征(类别、标签等)
我们需要计算出用户对待预估新闻的点击率,通过对预估点击率的降序排序得出用户最可能点击的前K个新闻。
最开始做点击率预估的模型为LR(Logistic Regression),将上述特征代入LR模型可以得到一个简单的点击率预估模型。然而,在推荐情景中,用户的行为是稀疏的,即一个用户能看到的新闻是有限的,如何从用户有限的浏览中推测出用户可能喜欢的新闻,就是推荐工作的重点,在这里使用LR如果只是简单的对上述特征进行建模,是无法得到特别好的效果的,原因是LR模型本身无法对特征进行泛化,它只能对某特征直接计算其相应的权重?,如果想使得LR具备泛化能力,则需要我们在数据端"手动泛化",例如:
将用户的兴趣与待估新闻的类别进行组合,得到一个interact特征,假如用户喜欢看科比相关的新闻,则待排新闻为体育类别的新闻应该比娱乐类别的新闻的值应该更高,因此我们能构造出特征用户喜欢科比且待排新闻为体育类
,并且通过业务理解,我们能知道这个特征一定比用户喜欢科比且待排新闻为娱乐类
在LR模型中得到的权重高。
则模型收敛后理应可得到:
通过这种特征工程的方法,我们使得LR能预测用户对没看过的新闻的偏好程度,即具备了一定的泛化能力,同时由于LR模型的简单构造,我们可以由业务理解去判断模型训练是否正确,特征提取是否正确,即提高了我们的debug能力。
2.2 更强的泛化能力
从上面的做法中我们不难看出这么做的优势与劣势,优势是我们可以快速调试出可用模型,如果训练不符合预期可以直接从训练得到的权重中看出问题,并通过分析特征权重帮助特征工程做更强的泛化特征。劣势是由于模型本身表达能力有限,我们只能通过人工的特征工程满足泛化能力,而这种特征工程往往需要庞大的精力来调研、分析、实验,每一步都有可能因为不慎或马虎导致结果不符合预期,因此我们希望通过增强模型自身的泛化能力,来减少后期研发人员的做特征工程的复杂度。
2.1.1 FM(Factorization Machine)
逻辑回归的F(x)的计算方式只包含线性关系,限制了模型的表达能力,可以通过增加非线性关系来增强模型的表达能力,具体地,FM模型公式如下:
FM模型使用了一个矩阵作为隐含特征 ,每个特征?都会对应一个?维的?向,通过计算两两特征的隐含向量?的内积,得到了两个特征间的相关性。如果用户喜欢科比,而新闻标签含有NBA,则在模型收敛后,这两个特征的隐含向量内积应该比较大。
通过梯度下降方法更新?,?收敛得到模型参数。相比于LR,增加了一个隐含矩阵来表示特征的两两交叉关系,如果特征有?个,隐含矩阵维度为?,则矩阵空间复杂度为?(?✱?),通过简化计算可知计算的时间复杂度为?(?✱?),其中?为特征非0的个数,并没有增加很大的运算量。内积的方式可以使模型具有预测能力:即便有两个特征在训练数据中从未在一个样本中同时出现,我们也可以通过隐含向量知道两个特征的相关性。
FM模型实际可扩展为高阶,然而只有二阶可以简化计算,三阶及以上计算复杂度过高,实际业界基本不会使用,但FM阐述了一个重要思想,通过引入隐含矩阵,以内积的方式表示特征之间的关系,由此提升了模型的泛化能力,鉴于其泛化的思想及模型简洁而有效的能力,FM模型在实际使用中大受欢迎,而后续发展的DNN相关的ctr预估模型也有不少借鉴了FM的思想。
2.1.2 DNN
随着近年计算能力的提升,DNN重新回到大众视野,由于DNN具备非常强的拟合能力,在各个领域都取得了优秀的性能提升。人们首先通过研究DNN在NLP、图像领域的应用,进而发展到推荐领域,2016年Google提出的Wide & Deep Learning for Recommender Systems⁽¹⁾提供了一种思路,将多层全连接网络定义为Deep Model, 额外增加一个形似LR的 Wide Model,利用两者各自的优势得到一个融合模型。
由于DNN参数数量庞大,而推荐情景下大部分特征为稀疏特征,如果将原始特征拼接(concatenate)起来作为输入层直接输入DNN,会出现训练参数规模过大而无法训练的问题,因此需要一个嵌入层(Embedding)将大规模稀疏特征首先映射到一个低维密集(dense)的空间中,再与其他特征拼接到一块作为输入层输入DNN。
除了DNN,wide&deep模型额外添加了一个wide模型,实际上就是将上文中LR的特征组合过程作为一个独立模块加入模型中,例如上图所示,将用户安装过的App与当前曝光展现的App做一个组合特征作为wide model的其中一个特征,这里又可以结合业务知识去做特征组合,获得一些强泛化能力的特征。
最后将DNN的隐含层最后一层与wide特征拼接到一块,通过Logistic得到一个[0, 1]
值,通过梯度更新收敛得到ctr预估模型。wide&deep模型通过DNN获得了特征之间高阶的非线性关系,提高了模型的泛化能力,但DNN这种结构去学习简单的低阶交叉实际上是比较低效的,通过在DNN外加入一个wide层,人工引入业务相关的组合特征,可以使模型快速学习到有效的低阶交叉特征,这些特征由于有人们对业务的认识,对业务情景往往具备较强的拟合能力,与DNN合并后效果会比单一DNN更好。
到这里我们希望能进一步扩展,能否让DNN模型像FM一样不需要通过人工组合特征,让模型自己学到低阶的交叉特征呢?这就是接下来我们要讲到的Deep & Cross Network所做到的事情。
03
Deep & Cross Network
Deep & Cross Network(DCN)⁽²⁾是由Google于2017年提出的推荐模型,相比于普通的多层全连接网络,多出一个Cross Netork,乍一听很唬人,实际是通过矩阵来进行特征交叉,利用残差思想构造深层网络的一个模型模块,通过模型而不是人工组合得到高阶组合特征,下面我们具体介绍DCN模型。
3.1 模型结构
DCN模型结构如上图所示,其基本结构和wide&deep网络类似,输入层对稀疏类别型特征采用Embedding的方式映射到一个低维密集向量,与数值型特征直接拼接起来作为网络输入特征。由于这是一个CTR预估模型,样本是0/1的二分类监督问题,所以输出层采用sigmoid将输出限定在[0,1]之间表示模型预估点击率。
网络中间分为两块:Cross network与Deep network。其中deep网络就是多层的全连接网络,而cross网络则是cross layer通过一系列计算输出结果。
3.2 Cross Network
Cross Network的具体计算公式为:
用图来表示这个公式:
公式中,作为列向量,表示cross层的第层,第层输出,则函数可以看作拟合第层与第层的残差。
这种特殊的结构可以使得交叉特征的阶(degree)随着cross层增加,对于第层,交叉特征相对于?₀的阶为。整个cross网络的参数量为:?✕?✕2,这里?为输入列向量?₀的维度,?为cross network的网络层数,每一层包含一组?,?,因此乘2。DNN由于全连接,隐含层的第一层的权重?就需要与输入层做笛卡尔积,而相对于全连接网络,cross网络引入的参数量非常小,与输入层特征维度呈线性关系。
3.2.1 深入理解Cross Network
我们可以将cross网络理解为每一个cross层,都将与?₀了一次pairwise交互,然后再通过高效的方式转回输入层的特征维度。分析一下上图的Feature Crossing
的过程,令,其中,这个公式实际可以这么看:
我们将原式的前两项相乘,这里面得到的每一个值都可以看作当前cross层特征与输入特征做了一次bit-wise的乘积,并且我们可以看作得到了一个?²的行向量,再乘以一个块对角矩阵,其中列向量,将结果投影回了维,这个过程做了一次特征交叉,特征维度通过压缩回输入特征的大小?²→?,大大减少了空间复杂度。
3.2.2 DCN与FM
FM模型内每个特征有一个隐含向量,两个特征的交叉关系是通过向量内积得到的;而在DCN里,每个特征与标量相关联,特征的关系是集合和的乘积,两者都具备特征交叉泛化的能力。
这种参数共享的方式不但能让模型泛化得出一些训练样本未出现过的特征交互,而且能使得模型鲁棒性更强,噪音数据的影响更小。在我们推荐的情景下特征十分稀疏,假如两个特征几乎从未在训练样本里共同出现过,则直接组合特征并不会带来收益,但通过参数共享的方式,我们仍能从参数乘积得到特征组合的效果。
另外,通常我们说的FM限制了模型只能得到二阶组合,超过二阶计算量会以次方增长,而DCN通过巧妙的设计,将特征交叉从单层变成了多层,获得多阶交互的同时计算量仍为线性增长。
3.2.3 已经最好了吗?
从上文描述的Feature Crossing
计算方式,我们看到了一种既能高效计算特征间的高阶交叉,又没有带来庞大计算量的特征交叉方法,那这个方法已经完美了吗,是否还有能够改进完善的地方?首先,在推荐情景中,我们会出现许多稀疏特征,例如用户id、物品id等等,这类稀疏的id型特征在DNN模型通常都需要通过embedding转为低维密集特征,然后我们把各个特征拼接到一起得到了输入特征?₀,即我们的特征?₀内会有好几个都属于用户的embedding特征,他们共同表示了一个用户的属性。
回到cross network的计算,Feature Crossing
可以表示为,即?₀与两个向量内每个元素都做乘积**(bit-wise),然而我们知道内的embedding特征是共同表示一个域(field)的,则他们内部的乘积组合并没有太大作用,我们更需要的是不同域的embedding进行交叉组合,在这一方面,FM是做的更好的,我们可以将FM的隐含向量看作特征的embedding,两个隐含向量的内积实际就是两个域的embedding向量乘积(vector-wise)**,并不会让embedding内的元素进行交叉组合。
04
总结
本文主要介绍了推荐系统的关键环节:排序。这里我们讲述了一种业界比较通用的方法:CTR预估模型。点击率预估模型研究的问题是已知我们当前要推荐的用户、当前所处上下文、待计算的物品,通过模型计算出用户点击该物品的概率,将待排序物品全部计算出预估点击率,再由高至低排序输出。
CTR预估模型经过多年发展,已经由最初的LR,升级至FM,现在又发展到了DNN模型,总的来说,这一路发展都是基于一个思路,我们希望减少人工组合特征,增加模型的通用型,从特征泛化走向模型泛化,研究如何让模型的泛化能力更强。
最开始使用LR,模型本身不具备泛化能力,我们结合业务的理解,通过大量复杂的特征工程使输入LR的特征本身具备了泛化能力。随后出现FM,相比于LR每个特征多出了一个?维隐含向量,通过对隐含向量相互求内积,我们使特征在模型内实现了两两组合,由此我们的模型具备了初步的泛化能力,经过训练样本的训练收敛后模型也能推测出从未共同出现的特征间的关系。而后我们开始使用DNN来解决点击率预估问题,同样地,为了使模型能快速训练出组合交叉特征的关系,在多层全连接网络外额外增加了一个交叉网络,cross network以巧妙的设计将特征组合延伸到了多阶,并且计算复杂度呈线性增长,在实践中,我们只需要在已经完成的DNN模型直接添加cross network即可得到更好的效果,输入层可以不做任何的特征工程,模型可以在cross network内部计算出特征间的组合关系。
然而,cross network虽然能在线性复杂度下获得高阶特征交叉,其模型设计仍有值得改进的地方,由于采用直接矩阵乘积,即元素级别**(bit-wise)的乘积,在计算过程模型是无法区分向量元素是否属于同一个特征embedding的,这样会使计算出现一些无效的特征交叉,如何优化模型结构使模型能在高阶交叉时按照field在不同域间计算组合特征(vector-wise)**也是当前的前沿研究,去年微软提出的xDeepFM⁽³⁾即实现了这个目标,感兴趣的同学可以参考这篇论文,体会其中的思路。
参考文献:
[1]https://arxiv.org/pdf/1606.07792.pdf
[2]https://arxiv.org/pdf/1708.05123.pdf
[3]https://arxiv.org/pdf/1803.05170.pdf