推荐系统 [八] 算法实践总结 V2:排序学习框架 (特征提取标签获取方式) 以及京东推荐算法精排技术实战
0.前言
「排序学习(Learning to Rank,LTR)」,也称「机器排序学习(Machine-learned Ranking,MLR)」 ,就是使用机器学习的技术解决排序问题。自从机器学习的思想逐步渗透到信息检索等领域之后,如何利用机器学习来提升信息检索的性能水平变成了近些年来非常热门的研究话题,因此产生了各类基于机器学习的排序算法,也带来了搜索引擎技术的成熟和发展,如今,Learning to Rank 已经成为搜索、推荐和广告领域非常重要的技术手段。
本文我们首先介绍排序学习的三种主要类别,然后详细介绍推荐领域最常用的两种高层排序学习算法框架:BPR 和 LambdaMART。因为排序学习的算法和实践大都来源于信息检索,一些理论也必须从信息检索的领域说起,所以本文也会涉及一些的信息检索、搜索方面的理论知识,但重点依然会放在推荐领域排序学习的应用思路。
0.1 排序学习
传统的排序方法可粗略分为基于相似度和基于重要性进行排序两大类,早期基于相关度的模型,通常利用 query 和 doc 之间的词共现特性(如布尔模型)、VSM(如 TF-IDF、LSI)、概率排序思想(如 BM25、LMIR)等方式。基于重要性的模型,利用的是 doc 本身的重要性,如 PageRank、TrustRank 等。在之前《基于内容的推荐算法》和《文本内容分析算法》两篇文章中,稍有涉及其中的知识点。
传统的检索模型所考虑的因素并不多,主要是利用词频、逆文档频率和文档长度、文档重要度这几个因子来人工拟合排序公式,且其中大多数模型都包含参数,也就需要通过不断的实验确定最佳的参数组合,以此来形成相关性打分。这种方式非常简单高效,但是也同时存在很多问题
很难融合多种信息
手动调参工作量太大,如果模型参数很多,手动调参的可用性非常低
可能会过拟合
LTR 则是基于特征,通过机器学习算法训练来学习到最佳的拟合公式,相比传统的排序方法,优势有很多:
可以根据反馈自动学习并调整参数
可以融合多方面的排序影响因素
避免过拟合(通过正则项)
实现个性化需求(推荐)
多种召回策略的融合排序推荐(推荐)
多目标学习(推荐)
1.排序学习框架
排序学习是一个典型的有监督机器学习过程,我们分别简单来看一下排序学习在搜索以及推荐领域中的框架和基本流程。
1.1 基本流程
在信息检索中,对每一个给定的查询-文档对,抽取特征,通过日志挖掘或者人工标注的方法获得真实数据标注。然后通过排序模型,使得输入能够和实际的数据相似。
排序学习在现代推荐架构中处于非常关键的环节,它可以完成不同召回策略的统一排序,也可将离线、近线、在线的推荐结果根据根据用户所处的场景进行整合和实时调整,完成打分重排并推荐给用户。
无论是搜索还是推荐,排序学习模型的特征提取以及训练数据的获取是非常重要的两个过程,与常见的机器学习任务相比,也有很多特殊的地方,下面我们简单介绍这两个过程中可能需要考虑的问题。
1.2 特征提取
在排序学习模型中,文档都是转化成特征向量来表征的,这便涉及一系列文本特征提取的工作,我们这里简单介绍一些可能用到的特征提取方法以及常用的特征类型。
文档的特征通常可以从传统排序模型获得一些相关特征或者相关度打分值,所以可分为两种类型:
一是文档本身的特征,比如 Pagerank 值、内容丰富度、spam 值、number of slash、url length、inlink number、outlink number、siterank,用户停留时间、CTR、二跳率等。
二是 Query-Doc 的特征:文档对应查询的相关度、每个域的 tf、idf 值,bool model,vsm,bm25,language model 相关度等。
也可以对文档分域,如对于一个网页文本,特征所在的文档区域可以包括 body 域,anchor 域,title 域,url 域,whole document 域等。
通过各个域和各种特征,我们可以组合出很多特征,当然有些特征是正相关有些是负相关,这需要我们通过学习过程去选取优化。
1.3 标签获取
特征可以通过各种方式进行提取,但是 Label 的获取就不是那么容易了。目前主要的方式是人工标注或者日志提取,需注意的是,标注的类型与算法选择以及损失函数都有很大关系。
1.3.1「人工标注」
人工标注比较灵活,但是若需要大量的训练数据,人工标注就不太现实了,人工标注主要有以下几种标注类型:
**「单点标注」**单点标注只关注单点,不考虑相互联系,单点标注又分三种不同的标注方式:优缺点 优点:标注的量少,为 O(n) 缺点:难标,不好统一
对于每个查询文档直接打上绝对标签,即相关度得分
二元标注相关和不相关
五级标注按照相关度划分五级(同 NDCG 指标):即“最相关”、“相关”、“中性”、“不相关”、最不相关”,通常在模型训练时会用数字来表示,如 1~5
**「两两标注」**优缺点 优点:标注起来比较方便 缺点:标注量大,应该有
对于一个查询 Query,标注文档 d1 比文档 d2 是否更加相关,即
**「列表标注」**优缺点 优点:相对于上面两种,标注的效果会很好 缺点:工作量巨大,人工几乎无法完成(整体的文档数量太大)
对于一个查询 Query,将人工理想的排序全部标好
1.3.2「日志抽取」
当搜索引擎搭建起来之后,就可以通过用户点击记录来获取训练数据。对应查询返回的搜索结果,用户会点击其中的某些网页,我们可以假设用户优先点击的是和查询更相关的网页,尽管很多时候这种假设并不成立,但实际经验表明这种获取训练数据的方法是可行的。
比如,搜索结果 A、B、C 分别位于第 1、2、3 位,B 比 A 位置低,但却得到了更多的点击,那么 B 的相关性可能好于 A。「这种点击数据隐含了 Query 到文档的相关性好坏。所以一般会使用点击倒置的高低位结果作为训练数据」。
但是日志抽取也存在问题:
用户总是习惯于从上到下浏览搜索结果
用户点击有比较大的噪声
一般头查询(head query)才存在用户点击
1.4 排序学习设计方法
排序学习的模型通常分为「单点法(Pointwise Approach)」、**配对法(Pairwise Approach)「和」列表法(Listwise Approach)**三大类,三种方法并不是特定的算法,而是排序学习模型的设计思路,主要区别体现在损失函数(Loss Function)、以及相应的标签标注方式和优化方法的不同。
三种方法从 ML 角度的总览:
更多内容参考:推荐系统四:精排-详解排序算法LTR (Learning to Rank): poitwise, pairwise, listwise相关评价指标,超详细知识指南。
2.京东推荐算法精排技术实践
前言:京东主站推荐的主要业务场景覆盖 APP 中用户购买前、购买中和购买后的全流程,日均千万级 DAU。不同业务场景下用户需求不同,我们相应的优化目标也不同。首页 feeds 和“我的京东”就是典型的购买前的场景,我们主要去优化点击以及浏览深度;购物车和商品详情页是购买中的场景,主要优化点击率以及转化率;而订单页就是用户购买后的主要场景,会重点优化跨品点击和转化。
2.1 业务 &场景
召回主要是包括主流的 i2i 和 u2i 召回,它的排序是数十亿到万的量级;粗排采用双塔模型,主要兼顾精准性和系统延时,排序量是从万到千的量级;在精排阶段,我们会使用更复杂的特征和模型结构,保证结果的精准性,它的排序量级是从千到百;重排模块则更多从整个序列的角度考虑问题,同时兼顾多样性、新颖性,量级是从百到十
精排模块的挑战主要有三个:
多目标:推荐系统通常有多个业务目标需要同时优化,包括点击率、转化率、GMV、浏览深度和品类丰富度等。
用户表达:用户的偏好是多样性的,精准表征用户当前的意图是比较有挑战的。
商品表达:商品信息包括品牌、品类等属性,也包括用户行为的反馈信息,还有商品的主图和标题等。如何利用不同模态的数据也是目前比热门的问题。
我们采用了多目标学习、用户行为序列建模和多模态特征等业界主流方法来优化这三个问题,并针对电商推荐的特性进行了一定改进和创新。
2.2 多目标优化
推荐是一个多目标优化问题,实际上在线上我们有大约七到八个目标需要优化。为了简化呈现,这里就以点击和转化为例。上图右侧是传统的多目标优化模型。最底层是模型的输入特征,中间是多目标模型,之后连接了一个 combination 层将不同的目标预测值结合到一起,最后使用其进行排序。
推荐领域多目标学习的主要问题有:
知识冲突,效果较好的 MMoE/PLE 等模型,主要通过更灵活的参数共享机制,为不同学习目标提供可选的稀疏结构来缓解知识冲突;
融合参数的优化,融合参数主要是用来组合不同目标的输出用于排序,常用做法是通过离线 grid search 或者在线自动调参来搜索一组固定参数。
在多目标融合排序上,我们认为固定参数有一定的问题。用户在不同场景有不同的诉求,如有明确的购物意图或者仅仅是闲逛,固定的融合参数就无法使模型整体效果达到最优。因此我们提出了一个个性化多目标融合的方法,可以根据用户状态自动输出不同目标的融合权重。
上图右侧是我们整体的模型架构,主网络是一个传统的 MMoE 结构;我们额外加入了一个融合网络,通过一个 Gate 结构学习如何组合不同目标。融合网络的输入是与主网络相同的底层特征,输出的是多目标融合参数向量,其最终会与主网络不同目标的预测值进行点积,作为最终的排序值。
融合网络的损失函数与主网络类似,主网络主要通过优化不同学习目标的参数来优化整体损失函数,而融合网络主要学习如何组合不同目标来使得模型在整体损失方向上达到最优。在模型训练上,我们采用了交替训练的方法。每 10 个 batch 训练一次融合网络,而每个 batch 都会去训练主网络。除此之外,我们还采用了梯度阻断的技术,融合网络的梯度不反传回底层的用户行为序列建模和 embedding layer,从而保证主网络的训练不受融合网络训练的影响。
通过加入融合网络的方法,我们希望模型在用户有明确的购物欲望的时候,模型可以给转化的输出更多的权重,而当用户没有明确的购物欲望的时候,模型可以给点击更大的权重。为了验证这个问题,我们进行了多组实验。
首先通过分析融合网络的均值和标准差,我们发现模型端到端学习出的权重值与我们离线通过参数搜索得到的最优值比较接近,结果较为合理;
此外融合网络的输出具有样本级别差异,到达了个性化效果。然后我们对比了闲逛和购买场景的输出差异,在点击 session 下,点击融合权重平均是 0.92,订单 session 中对应的权重下降为 0.89;
而在订单 session 中,订单的融合权重对比点击 session 会有比较大的提升。最终线上的效果也证明了模型可以精准识别用户属于偏买还是偏逛的类型,转化率有了大幅提升。
除了首页之外,我们还将该方法应用到直播和购物车等不同排序模型上,其转化率都得到了明显提升,证明了方法的有效性和通用性。
2.3 用户行为序列建模
接下来介绍用户行为序列建模的工作。整个用户行为序列建模的目的是想从用户的原始行为序列中学习用户的偏好,这是个性化推荐中最重要的一个技术分支。它的整体技术框架如上图所示,模型的输入是用户原始点击或者下单行为的序列,之后通过一个 User Interest 模型来输出表征用户偏好的稠密向量。User Interest 模型可以是 pooling-based 也可以是 model-based,一般与排序任务一起端到端训练。
用户行为序列建模的挑战主要由以下几点:
用户的行为以及兴趣是多种多样的,我们需要从用户的原始行为序列中将不同的兴趣提取出来;
用户的行为是随着时间不断变化的,比如在一个月前用户感兴趣的商品现在就失去兴趣了,即具有衰变性和演变性;
数据具有噪音,因为不像 NLP 领域,文字的排列会受基本语法的约束,用户的行为本身并没有约束,导致序列中可能会包含噪音行为,即没有特别关联性的行为。比如昨天我还在浏览手机这一品类,今天我突然就去浏览水果。
模型应用在线上服务时存在比较明显的性能问题,我们需要优化预测的时延。
用户行为序列建模在最近几年发展较快。
第一个主要工作就是 YoutubeDNN 的 Pooling Basded 的方法,主要问题是信息丢失严重,兴趣表征与待排商品也没有任何相关性。为了解决这些问题,基于 attention 的模型(如 DIN)被提出,它可以从用户行为序列中挑选出与待排商品比较相关的行为特征,主要问题是无法建模衰变性或者演变性,不同时间或者次序的行为表征的兴趣没有差异性。
第二基于 RNN-based 的模型解决了这一问题,但是这类模型受顺序推理的限制,无法建模较长的序列。在工业界 RNN-based 的序列模型通常只能对大约 50 个行为进行建模。
第三目前业界应用最广泛的是基于 Transformer 的方法,它对用户行为序列的表征能力更强,且在一定程度上可以无视序列的长度。此外,虽然模型结构比 RNN 更复杂,但是由于模型自身已于并行的特点,它在工程上更好被优化。
我们的行为序列建模模块主要以 Transformer 为基础,并针对电商领域用户行为的特性进行了相应优化。整体框架如上图右侧所示,采用一个 encoder-decoder 的结构来对用户兴趣进行表征和提取。用户的偏好是多样性的,如何建模不同时期的偏好以及相应的演变是一个非常有挑战的工作。原始 NLP Transformer 采用 position encoding 来补偿模型所丢失的位置信息。借鉴这一想法,我们在相同位置进行了时序编码,除了位置信息(position encoding),还增加了时间差(recency encoding)的编码信息,并通过直接相加来融合。Position 和 recency embedding 与排序模型一起,端到端学习用户行为次序和时间对兴趣强弱的影响。
模型中 encoder 模块主要负责对用户偏好进行表达,与原始 Transformer 类似,采用一个两层的 self-attention + ffn 的网络结构。相同的商品在不同的用户行为序列中代表的兴趣有所不同,我们需要借助用户历史中其他行为来表征每个行为背后的精准意图。与原始 Transformer 不同的是,我们借鉴特征交叉的思想,同时保留了一阶和二阶兴趣表征向量。在 decoder 端,我们使用 multi-head target attention,从 encoder 输出的一阶和二阶向量中提取出与待排商品相关的一阶和二阶偏好。
在工程上,由于模型计算复杂性的大幅提升,线上延时增加了约 40 毫秒,无法满足上线要求。为了解决这个问题,我们通过合并计算和并行推理来优化线上延时。
在离线训练时每个 batch 的样本属于不同的用户,那么我们需要对 batch 中每个的行为序列进行独立的 encoder 推理,其时间复杂度是立方级的;
但是在线上推理时,同一用户一次请求,一个 batch 内的 encoder 推理结果相同,那么我们只要计算一次即可,时间复杂度就可以降低为平方级。
此外,通过调整计算图的执行顺序使得多个图可以同时去推理。最终从线上效果来看,tp99 累计可以下降至 33 毫秒,使得模型满足全量上线要求。
最后,我们对模型进行了离线分析,希望研究时序编码是否在端到端学习中学习到足够的信息。从业务上来讲,我们认为用户越近期的行为对当前的用户偏好影响越大。从上图右侧的结果展示了模型的多个 head 学习的信息。我们可以看到行为次序越靠后,纵坐标表示的 attention 值会有某种比较明显的倾向性,表明模型确实学习到了兴趣的演变特性。模型上线后,推荐结果的精准性、丰富性和新颖性均得到大幅提升。在首页 feed 流,人均点击提升了 3.5%,这也是我们使用深度模型后单次优化得到的最大提升。
2.4 精细行为建模
现在介绍一下我们在精细行为建模方向的工作。用户的行为中往往包含较多的噪声,包括一些误点击操作,需要从充满噪声的序列中识别用户的真实意图,因此我们提出了基于精细行为的兴趣建模来优化这一问题。
精细行为是用户点击后在商品详情页的统计量和子行为信息,包括停留时长、操作次数、查看主图、浏览评论等。
整体方案以前面提到的改进的 Transformer 为基础,通过精细行为来建模用户点击后的真正意图和兴趣强弱。如上图所示,我们通过一个 MLP 将精细行为映射到一个定长的向量上,之后在通过 bitwise-add 的方式与时空编码信息结合。停留时长和操作数等统计信息会进行离散化,并通过端到端学习。查看主图、浏览评论等精细行为直接学习 ID 表征,并通过 sum-pooling 聚合。
最后我们分析了精细统计属性对兴趣提取的影响,与之前的模型结论类似,我们也能观察到停留时长和 attention 之间存在某种趋势,停留越久 attention 值就越大。最终效果,在首页 feeds 流,人均点击提升 2%,转化也提升了 1.7%。
2.5 多模态特征
影响用户点击决策的因素除了商品基本属性,还受商品的主图和标题的影响。
推荐系统存在冷启动问题,比如一些新品是缺乏用户反馈的,它们的特征 embedding 处于欠拟合状态。为了解决这个问题,我们引入了多模态特征。多模态特征可以带来一定的信息增益,商品的主图和标题中非结构化的视觉和语义信息可以比较好地表征商品的状态。
多模态特征对缓解冷启动问题效果较好,因为这一类特征不需要用户的反馈,它的特征覆盖率在我们的业务场景下较高。
模型整体框架是通过预训练模型+微调分别得到图像和文本向量,并基于 Transformer 进行视觉和语义偏好的建模。由于预训练模型采用的是 resnet101,它的训练数据分布和电商领域的图片分布有较大的差异,所以我们使用了电商主图的产品词分类数据对模型进行微调,使得模型能够学习到电商商品的特征。最终,我们把商品主图输入至图像模型,将最后一层 64 维向量作为图像 embedding,应用于排序模型。
在进行多模态的偏好建模过程中,有两个主要问题需要解决。
首先,图像 embedding 和其他端到端训练的 embedding 来自于不同模型,这使得它们处于不同的特征空间。
为了对齐向量空间,我们加入了一个 transfer layer,采用了一个 multi-gate multi-expert 的结构,以商品的品类作为 gate 的输入,选取不同的映射 expert,将图像特征与其他端到端的特征进行对齐。
最终,我们会将转变后的图像 embedding 和 sku embedding 拼接到一起,并通过上文提到的 Transformer 进行统一编码。
最后我们对图像预训练向量的质量进行了分析,具体做法是筛选一部分商品,观察他们向量的相似度。通过上图可以看到,感官上相近商品的相似度比较高,而当色差较大时相似度也会有相应的降低。如果是差异较大的商品,图像相似度也比较小。在线上效果方面,我们将该方法应用到了首页 feeds 和首页核心频道,效果比较显著,人均点击分别提升 2.6%和 5%。
3.项目答疑
Q1:多目标融合模型中实际在线上会有多少个目标?每个目标的量级不一样,如何保证模型不受某一个目标主导?
A:在首页,我们有 6 个目标。业务上,通常会有主要的优化目标,重要性不同;技术上,也会对不同目标进行相应的加权操作,使得他们的量级处于一个相对平衡的状态。
Q2:线上会同时使用多目标模型的多路输出吗?
A:会的。个性化多目标模型中就是把多个目标的输出融合后作为排序依据的。
Q3:能不能再详细介绍一下多模态向量表征中图像 embedding 的微调方法?
A:首先,我们的训练数据是商品的主图,对应的标签是产品词的分类。在京东的业务场景下,产品词大概有十万个类别。我们会把数据输入到预训练的模型中,冻结住除了最后一个分类层外的所有网络参数,只微调分类层。最后我们会将分类层输出的 64 维向量取出,作为商品的图像 embedding。
Q4:多模态融合模型有考虑去做联合训练吗?
A:这是技术选型的问题,因为联合训练通常来说会是单独使用图像的模型去做联合训练,或者单独使用文本模型去做联合训练。但实际上我们要在线上使用的话,图像、文本以及其他一些模型输出的 embedding 都会被使用,这就涉及到了三到四种不同模型的联合训练。这种做法优化起来十分困难,对于线上服务以及后续迭代都会有很大的影响。所以,实际上我们不会去采用多模态联合训练的方式。
Q5:可以再详细介绍一下多目标融合模型中的损失函数的优化方式和设计思路吗?
A:多目标融合模型的主网络和融合网络分别对应着两个损失函数和两个优化器。我们会分别训练这两部分网络,其中主网络输出的是多目标的预测值,比如点击率和转化率;另一个网络输出的是多目标预测值的融合权重,比如点击率的权重和转化率的权重。最终,模型使用点积的方式将多个目标的输出融合为一个预测值。在优化思路上,我们希望主网络优化各个目标的参数来达到最优;融合网络不影响主网络的更新,它学习如何组合主网络不同目标的预测值,来使得最终的排序能在优化方向上最优。
版权声明: 本文为 InfoQ 作者【汀丶】的原创文章。
原文链接:【http://xie.infoq.cn/article/06c3e7f2a9b25c6e8b9240f1c】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论