深入浅出推荐系统(八):排序:目标引领方向

如果非要在推荐系统里找出机器学习最能大展拳脚的领域,那一定是排序部分。同属于推荐系统的召回和重排序,其算法基本上都可以用规则或者策略的方式平替,虽然效果不一定好,但可以支撑业务的正常运转。然而对于排序这一部分,可以说就是天然为了模型而生的,只有模型化的排序,才可能为广告系统和排序系统带来大的收益。

由于排序模型在推荐和广告领域有着举足轻重的地位。本章里,我们不谈具体排序方法,先从整体对排序模型进行概要了解。

排序模型的重要性

为什么排序如此重要?在广告系统中,早期排序是完全面向点击率的。按点击付费的广告,哪怕提升百分之一的点击率,都会带来大量真金白银。一次用户请求中带过来的广告位,通常只有一个(最多三个),为有限的资源位筛选出最可能带来点击的广告,是广告系统的重中之重。因此,早期广告领域的模型工程师,基本都在孜孜不倦地研究如何在排序系统中不断提升点击率。而推荐系统其实是对广告系统的沿袭,虽然推荐系统返回结果要远多于广告系统(通常有十几到几十条条),但头几条内容的作用仍然举足轻重。尤其是对新用户来说,能否吸引用户持续消费,成败可谓在此一举。

我们在最早的文章里,介绍过推荐系统线上推荐的流程:召回阶段会将全库数据精简到几十到几百个,再由排序模型进行排序,接着会根据业务逻辑重排序,最终将截断的结果呈现给用户。如果召回阶段返回了几百上千个物品,而排序性能不足以在短时间内完成,那么中间还会插入粗排模型,一般粗排模型可以看作是精排模型的精简版,或使用更少的特征,或使用更浅的网络,总之,保证系统在极短时间内能快速排完并截断,然后将结果送给精排模型。
后面的几章,笔者会介绍若干工业实践中常用的排序模型。如无特殊说明,我们所指的排序,都是指精排。

排序模型的目标

点击率排序

明确排序模型的目标之前,我们先了解下排序模型属于哪种机器学习任务。通常来说,有标签指导的主流机器学习模型大致分为两类:分类任务和回归任务(提一句,近些年兴起的强化学习并不在其中,算是第三类)。其中,分类任务是针对离散值,预测样本属于哪个或哪几个标签,常见场景如图片分类、商品类别识别、文章情感识别等;而回归任务则是针对连续值,预测样本的输出值,常见场景如房价预测、票房预测、外卖时间预估等。

那么排序模型属于哪种任务呢?既然是模型用于排序,那自然需要排序标准。业界最为常用的标准便是点击率(CTR),因此通常称排序模型为CTR模型。CTR模型以当前用户对于当前物品点击和未点击来设计目标,因此,排序模型便可看作是二元分类模型。在早期,逻辑回归模型(Logistics Regression,LR)被应用于来训练点击率指标----逻辑回归虽名为回归,其实属于分类任务。它在训练时使用二元分类目标,预测时则输出点击的概率,从而根据概率来排序项目。

多目标排序

广告的收益取决于点击和单次广告出价。因此点击率高,就意味着收益的水涨船高。但对于推荐系统来说,仅考虑点击率,则会带来较多问题。比如发布者使用美女图,或UC震惊体来诱导点击,等。一般情况下,推荐系统希望在提升用户点击率的基础上,同时提高用户的关注、点赞、评论等交互行为,从而维护良好的社区氛围。即使对于广告,只关注点击,而不关心转化,则给平台带来收益的同时,伤害的是广告主的利益。因此,多目标学习(Multi-task)这种“既要又要”的诉求,会大量存在于广告和推荐系里。

广告领域里,重排阶段广告最终排序的公式是: e c p m = p c t r k ∗ b i d ecpm = pctr^k * bid ecpm=pctrkbid,其中,pctr是预估CTR,由精排模型给出,bid是广告主出价。这个公式可以看作多目标任务的简单实现。它同时考虑了广告质量(CTR)和价格(bid)。公式中,k是价格挤压因子,通过对k的调节,增大或缩小排序公式中CTR部分的重要度。当k趋近于无穷时,相当于只根据点击率来排序;k为0时,相当于只根据bid来排序。根据不同时期业务需求,通过k来调整广告的排序目标:对广告质量有较高要求时,则增大CTR的比重;月底或季度底,需要对广告预算冲消费时,则减小CTR的比重。

上面这种方式其实就是多目标调和的方式,但它只是最简单的一种思路。实际上,如何更合理、更深度地融合多目标,是工业界,也是学术界对于排序研究的一个主流方向。其思路可大体分为两类:线上多目标融合和线下的多任务学习。

  • 线上多目标融合:
    线上多目标融合是把融合的时机放在模型预测之后。线下先按照目标各自训练模型,线上每个模型分别预测打分,乘以各自权重,继而进行加和或乘积汇总。通常采用如下公式:

    y = ∑ i = 1 k b i ∗ ( a i + y i ) y = ∏ i = 1 k ( a i + y i ) b i \begin{align} y = \sum_{i = 1}^{k}{b_i * (a_i + y_i)} \\ y = \prod_{i=1}^{k}{(a_i+y_i)^{b_i}} \end{align} y=i=1kbi(ai+yi)y=i=1k(ai+yi)bi
    两个公式分别代表通过加法或乘法方式进行融合。其中 a i a_i ai控制值域的中心点偏移, b i b_i bi则是对目标值进行缩放,在加法融合中, b i b_i bi表示目标得分的占比。可以根据不同目标在当前业务中的重要程度,给子目标设置不同权重。

    多目标融合在业界有很多案例:如快手的多目标排序 [ 1 ] ^{[1]} [1],京东的多目标模型排序 [ 2 ] ^{[2]} [2]等。实践中,固然存在人工设计目标权重的场景,但现今的大部分目标融合权重,多使用模型来训练,即超参数搜索,典型算法如交叉熵算法(Cross-Entropy Method,CEM)、进化策略(Evolutionary Strategy,ES)、贝叶斯优化(Bayes Optimization)等。

  • 线下多任务学习:

  1. 常见的简单方法,是按照用户不同行为对样本进行赋权(如购买权重要大于点击)。模型在更新参数时,梯度乘以权重,增大了高权重样本的影响力,直观上讲,对于权重大的样本,预测错误会带来更大损失,从而在不损害或较小损害某个目标(如点击率)的基础上,更大程度地优化关注目标(如转化率);这种思路适用于大部分模型,如LR、GBDT、深度学习等。在这里插入图片描述
  2. 随着深度学习在推荐系统中的发展,一种模型设计中颇为经典的多目标任务的思路,被应用于多任务学习中。它类似于我们在之前的博客《深入浅出推荐系统(四):召回:向量化的潮流》所介绍的DSSM,即双塔模型。对于不同的目标,同样构建不同的塔。与DSSM不同的是,多目标任务在底层可以共享参数(即多塔共用同样的基建),如下图所示。其好处在于可以在学习不同目标时,通过共享参数进行知识迁移,利用其他目标学习到的知识,帮助自己进行知识学习。在这里插入图片描述
  3. Google在2018年发布的研究中[1],提出了MMoE架构,是多目标排序模型的另一个经典模型。模型认为多个模型共享底层基建存在一定问题:因为多个目标可能是不相关的(比如收藏和回复),那么学习到的知识可能不具备可共享性。该模型思路是:每个目标在底层分别独立训练模型(Expert),在顶层给每个塔设置一个Gate,同时将Expert输出给Gate,Gate输出每个Expert被选择的概率(每个Gate的权重和为1,实际表达的是对不同Expert的动态赋权),然后将三个Expert的输出加权求和,输出给不同的目标塔。该模型其实可以类比前面所说的策略的思路,本质上是对不同任务设置不同权重(通过gate),但该权重是通过模型训练出来的,而非手动设置的。在这里插入图片描述
    额外提一句,虽然Google的这个研究是基于深度学习网络来进行的,但实际上这个思路本身可以适用于其他模型。每个目标独立训练的部分其实可以使用不同的非深度模型来实现。
  4. 最新的研究还有如阿里的ESMM,将CTR与CVR(转化率)的预估置于同一个模型,使用两个塔,分别得到pCTR(预估点击率)和pCVR(预估转化率),再将两者相乘,就得到了pCTCVR(曝光转化率),转化的正样本同时来训练两个塔的网络,而点击的正样本则只更新点击的网络。

排序模型的任务

有了目标,则可以据此构建损失函数,损失函数度量的是预测值与真实值之间的差异,通过最小化差异,来训练构建的模型,从而得到模型的未知参数。回归问题的损失函数多采用均方误差,分类问题的损失函数多采用交叉熵(Cross-Entroy Loss Function)。
排序模型属于二分类问题,因此一般都使用交叉熵损失函数。该损失函数假设样本符合伯努利分布(0-1分布),然后求满足该分布的似然函数,最终得到相关公式如下:
l o g P ( y ∣ x ) = l o g ( y ^ y . ( 1 − y ^ 1 − y ) = y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) log P(y|x) = log(\hat{y}^y.(1-\hat{y}^{1-y})=ylog \hat{y} + (1-y)log(1-\hat{y}) logP(yx)=log(y^y.(1y^1y)=ylogy^+(1y)log(1y^)
其中,y为真实值(点击为1,未点击为0); y ^ \hat{y} y^为预测值,我们希望该函数越大越好(越大意味着预测值越逼近真实值,即y为1的时候, y ^ \hat{y} y^越接近1,logP(y|x)越大,反之亦然)。但损失函数是希望其越小越好,因此对上述公式取相反数,作为损失函数。令单样本的损失函数为 − l o g P ( y ∣ x ) -logP(y|x) logP(yx),则N个样本的总的损失函数就为:
L = − ∑ i = 1 N ( y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ) L = -\sum_{i=1}^{N}{(ylog \hat{y} + (1-y)log(1-\hat{y}))} L=i=1N(ylogy^+(1y)log(1y^))

有了损失函数,就可以基于这个损失函数来构建训练任务,通过梯度下降法来不断地更新模型参数,从而不断缩小损失函数,当损失函数缩小到一定程度,或迭代到指定次数,则训练完成。无论是逻辑回归还是神经网络,都可以基于这样的方法进行训练。

排序模型常见方法

工业界早期的点击率排序模型,基本都是逻辑回归(Logistics Regression,LR)。由于LR模型较为简单,因此提升模型性能的方法主要靠特征挖掘(事实上,现在有一些公司的排序模型还在使用逻辑回归,因为它真的很有用)。但逻辑回归也有一大缺点:它无法捕获特征之间的交互关系。由此衍生了FM、FFM模型,他们可以自动化地对特征进行二阶交叉组合。

之后又出现了以GBDT为代表的树模型,树模型能够对特征进行自动组合,可以进一步提升模型效果,并由此衍生了GBDT+LR的组合模型,GBDT用来产生组合特征,LR则用来做权重训练。
如今,随着深度学习的流行,从最初的Wide+Deep模型开始,此后的主流精排模型基本都是由深度学习来主导。

尽管如今的排序模型基本离不开DNN,但基础的经典模型依然存在借鉴意义。更好地理解些模型的变迁历史,比较这些模型的优劣,理解模型的演进思路,也会更好地理解推荐系统,并从全局角度来思考未来的方向。后续的几章里,我们会对这些模型一一进行详细的介绍。

参考文献
[1] 多目标排序在快手短视频推荐中的实践,郑东,
https://mp.weixin.qq.com/s/mxlecZpxXEoOe21UY_UCXQ
[2] 京东李欣如:从单目标排序到多目标模型,显著提升多业务效果,李欣如
https://zhuanlan.zhihu.com/p/428725155

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: USB是一种常见的设备连接接口,广泛应用于各种电子产品。USB系统开发基于ARM Cortex-M3处理器,具有深入浅出的特点。 首先,ARM Cortex-M3是一种高性能,低功耗的处理器架构,特别适用于嵌入式系统和物联网设备。它具有较小的指令集,并且能够以较高的速度执行指令,从而确保了USB系统的高效性能。 在USB系统开发,我们首先需要了解USB的工作原理和协议。USB分为主机和设备,主机负责控制和管理设备,设备负责提供相应的功能。在ARM Cortex-M3处理器上,我们可以通过编程来实现主机和设备的功能,包括控制传输、断传输和批量传输等。 其次,USB系统开发需要熟悉USB的架构和规范。USB标准定义了USB设备的各种特性和功能,包括USB传输速率、插座类型、端点数量等。在ARM Cortex-M3处理器上,我们可以通过配置寄存器和使用相关的库函数来实现这些特性。 最后,USB系统开发还需要进行驱动程序的编写和调试。驱动程序是连接设备和操作系统之间的桥梁,通过驱动程序可以实现设备的控制和数据传输。在ARM Cortex-M3处理器上,我们可以使用相关的开发工具来编写USB驱动程序,并通过调试和测试确保其正确性和稳定性。 总之,深入浅出的USB系统开发基于ARM Cortex-M3是一项涉及USB协议、硬件配置和驱动程序开发的复杂任务。通过详细了解USB的工作原理和规范,并利用ARM Cortex-M3处理器的高性能和低功耗特点,可以开发出稳定可靠的USB系统。 ### 回答2: USB系统开发是指在ARM Cortex-M3架构下,开发USB接口及相关功能的系统。USB(Universal Serial Bus)是一种通用的外部接口标准,用于连接计算机和外部设备,实现数据传输和设备控制。 在进行USB系统开发时,需要了解USB接口的硬件设计和软件开发两个方面。硬件设计主要包括电路设计、信号传输和连接接口等。ARM Cortex-M3芯片内置了USB控制器,可以与外部设备进行通信。开发者需要根据系统需求,设计USB接口电路,并将其集成到硬件平台。 软件开发方面,首先需要了解USB协议标准。USB协议包括设备描述符、配置描述符、端点描述符等,开发者需要根据协议标准来编写相应的代码。其次,需要实现USB的通信功能,包括数据传输和设备控制。这通常需要使用USB设备驱动程序和USB协议栈来完成,以便与计算机进行通信和数据交换。 在ARM Cortex-M3架构下进行USB系统开发,需要使用适当的开发工具和环境。ARM提供了一套完善的开发套件,包括开发板、调试器和IDE等。开发者可以利用这些工具,进行USB系统开发和调试工作。 总之,深入浅出地开发USB系统需要掌握USB接口的硬件设计和软件开发两个方面,并使用相应的开发工具和环境。这样可以实现ARM Cortex-M3芯片与外部设备之间的USB通信和数据传输。 ### 回答3: USB系统开发是指在ARM Cortex-M3处理器上开发和实现USB功能的过程。USB(通用串行总线)是一种常用的外部设备连接接口,它允许将计算机与各种外设连接起来,如键盘、鼠标、打印机等。 在USB系统开发,首先需要了解USB协议和USB架构。USB协议定义了USB设备与主机之间的通信规则,包括数据传输、速度控制、设备描述等。USB架构包括USB主机、USB设备和USB总线,主机负责控制和管理设备,设备提供特定的功能,总线则提供物理连接。 在ARM Cortex-M3处理器上进行USB系统开发时,需要使用适当的开发工具和软件,如Keil MDK、IAR Embedded Workbench等。首先,要配置处理器的引脚和时钟,以使其能够与USB模块进行通信。然后,需要编写相应的驱动程序来控制USB模块,实现USB的各种功能,如数据传输、断处理等。 在开发USB系统时,还需要注意以下几点: 1. 确保USB硬件的正确连接和配置,包括连接USB模块的引脚和外部电源。 2. 根据具体需求选择适当的USB模式,如设备模式、主机模式或OTG模式。 3. 编写USB驱动程序,包括初始化USB模块、处理USB断、处理设备插拔等。 4. 实现USB协议的各种功能,如设备描述符、配置描述符、端点描述符等。 5. 进行USB设备的功能测试和调试,确保其正常工作。 USB系统开发基于ARM Cortex-M3是一项具有挑战性的任务,需要熟悉USB协议和架构,具备良好的编程能力和调试技巧。通过深入学习和实践,可以掌握USB系统开发的基本原理和方法,为实际应用提供可靠的USB功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值