>综合>狗狗>

酷狗和全民k歌哪个唱歌比较好?全民K歌推荐系统架构及粗排设计

时间:2024-03-18 09:40:16/人气:478 ℃

分享嘉宾:kevinshuang、fivenwu

编辑整理:张振、于洋

出品平台:DataFunTalk

导读:腾讯音乐娱乐集团 ( TME ) 目前有四大移动音乐产品:QQ音乐、酷狗音乐、酷我音乐和全民K歌,总月活超8亿。其中,全民K歌与其他三款产品有明显的差异,具体表现如下:以唱为核心,在唱歌的功能上又衍生出了一些音乐娱乐的功能及玩法,目前有超过1.5亿的月活。推荐在全民K歌各个场景中起着重要作用,极大地影响着平台的内容分发状况及生产者与消费者的关系。本文将主要介绍全民K歌的推荐系统架构及粗排设计,具体从以下几方面展开:

01

业务背景

全民K歌涉及多样化的推荐场景,涵盖内容、直播、歌房、用户等多种形态。

具体的推荐功能如上图所示,主要包括以下几类:

① 基于内容的推荐,包括优质UGC推荐、关注流推荐、同城社交推荐等功能模块。

② 除了内容推荐外,我们也会负责一些其他类型的推荐,包括直播推荐、点歌推荐、歌房推荐和点评推荐,都是在K歌生态下独有的推荐。

02

推荐系统架构及挑战

我们的推荐系统主要分为四个部分,包括召回层、粗排层、精排层及重排层。

1. 召回层

召回层的作用主要是从海量的item中筛选小量级的用户可能感兴趣的内容。在这个模块中最重要、大家了解最多的肯定就是召回模块本身。

一般来说,我们线上的召回方法会分为索引类的召回、泛社交的召回以及模型的召回。

除了召回模块之外,我们在召回层认为另外一个比较重要的是内容的比例筛选,因为我们整体的内容发表量比较大,每天可能有500万的作品在平台内发表,如何从中筛选出合适的内容,需要基于音视频的理解,以及基于我们自己的流量策略来综合发现。

2. 粗排层

粗排层到精排层相当于是一个承上启下的作用,它会把我们召回到的一些万量级的作品进一步筛选到千量级,既要考虑打分的性能问题,又要考虑排序粗排精准度的问题。一般来说,粗排模型会用一些模型蒸馏的方法,包括特征蒸馏或者基于模型本身的结构蒸馏,以及把这些不同的蒸馏方法组合起来等等。在粗排层,除了做粗排的打分外,我们还会重点做生态的控制,特别在一些内容推荐场景或者直播推荐场景中,我们会注重这里面的内容生态,包括时效性,内容的调性,多样性等等。

3. 精排层

粗排层之后就来到了精排层,精排层主要根据千量级的作品进一步的进行精排打分来筛选到百量级的作品。在精排层,我们主要注意以下几方面:

4. 重排层

从精排层排序出百量级的作品后,就会进入到重排层。重排层会基于业务规则进行进一步的干预,比如同一首歌曲的视频不能连续出现,同一个创作者的视频不能连续出现等等。除了基于规则性的限制外,我们也会考虑使用模型化的方法做多样性的打散,并且在第4部分,我们也会具体介绍DPP算法的原理和思想。除了模型方法之外,我们也在考虑通过list wise的方法做内容的重排。

03

粗排模块算法设计

1. 粗排模块定位和方案路线

粗排模型和精排模型不同,它可能既需要解决模型预测的准确性,又需要解决模型预测的效率。接下来,为大家介绍我们整个推荐系统如何在线上真实运转。

粗排模块主要包含两部分:

第一部分是粗排的排序部分,这一部分主要就是为了解决一个大规模item的预排序问题。

第二个部分是多样性控制部分,作为一个UGC平台,我们需要考量内容在整个内容生态中的分发状况,以及均衡的考量生产者跟消费者之间的关系。我们是通过多样性调节算法来间接实现这个目的的。

让我们再回顾下前面所提到的整个召回系统架构,我们可以看到它其实是一个典型的节点架构,从内容发现到召回,到粗排到精排,然后重排,最后把合适的内容推荐给用户。由于我们是一个比较大的UGC生产平台,从一个UGC平台的角度来考虑,我们倾向于分发较为新的作品,因为新的作品的分发会为那些活跃的创作者带来一定的流量激励,使得生产端跟消费端产生联动,促进了一种正向的循环。

我们以三个月内的站内发布作品为例,三个月内的站内发布作品大概会到十的九次方量级,然后我们通过一些内容挖掘跟优质内容发现的方式,从中找到更为优质的一部分内容,这部分内容仍然有十的七次方量级,相当于从百万量级的作品库做兴趣的召回。这是一个非常大的候选集场景,从优质内容的发现到召回,是整个UGC平台和推荐系统的连接,背后承载着我们对整个UGC的分发、内容生态的理解。这一部分我们会在第三个环节去做进一步详细的介绍。召回可以看到有十的七次方的候选集召回,通常完成召回过程之后仍然有十的五次方候选集,而精排通常只能去处理一个千级别的规模,所以我们看到这中间存在一个比较大的漏斗,很多时候会成为我们在效果或者一些收益上的瓶颈。这时,粗排模块的重要性就体现出来了。粗排模块的一个重要的作用就是防止召回到精排之间的漏斗过大,导致过多的信息损失。

大家可能比较了解的是,召回跟精排召回更像是一个集合,选择的过程更侧重于选择效率最高的方法,至于topk中item之间的先后顺序,其实不是最关心的因素;而精排环节相对来说它更强调次序,也就是说item A跟item B的先后顺序是非常敏感和关键的。

粗排夹在召回跟精排之间,它的定位是什么?相比于召回,粗排更强调排序性,也就是更强调topk内部的排序关系;相对于精排,粗排更强调性能,因为精排通常有非常复杂的网络结构,非常大的参数量,这也意味着它在实际应用的过程中比较难去处理一个较大规模量级的候选集的打分,这时粗排就必须要解决这个问题,所以它在性能上会相较于精排有更多的要求。现在主流的粗排方案有两条路线,这两条路线是基于两个出发点来思考的:

第一条路线是把粗排当成是召回的一种延伸,它的技术选型会像是一种集合,选择的方案和目标是选出效率最高的子集。常用的方式,简单的可以通过实时的serving或者一些实时的指标对召回排序的结果做一个选择。总体来说,这条技术路线最大的优点是算力消耗非常小、性能非常好,但是它的缺点是本身的表达能力是有限的,可以明显预估到它的天花板。

第二条路线是从精排的角度,把粗排当成是精排的迁移或压缩,也就是说这是一条排序的路线,它的建模目标是预估值。这种方法的好处是它的表达能力很强,因为通常会用到一些比较复杂的网络结构,而且它跟精排的联动性是更好的,可以让粗排跟精排的目标保持某种程度上的一致性。同时,它的缺点也凸显出来了,就是我们用到了复杂的方法,算力的消耗一定也会相应的提升。因此,需要着重解决的是如何在有限的算力下尽可能地突破表达能力上限。在这种路线下,我们通常会在架构选择上选择双塔结构模型,右下图所示。

接下来,介绍下粗排双塔模型实战相关细节。

2. 粗排双塔模型实践

我们通过把user和item的feature进行结构解耦与分开建模,然后完成整个架构的设计,在模型训练完毕之后,我们会通过user serving实时的产出user embedding,再通过索引服务把该用户所有的候选集合的ID给取出来,最后在user embedding跟item embedding之间做內积的运算,得到一个粗排的预估值,作为整个粗排阶段的排序依据。

这么做的优势是user/item 结构是解耦的,内积计算的算力消耗小。

同时,它的缺点也非常的明显:

如果我们选择了这种技术方案,我们可以保障它的性能,但是我们需要进一步的考虑如何避免这种简易的结构所带来的效果上的损失。在这种情况下,我们通常会使用一些模型蒸馏的方式。

模型蒸馏有两个关键词,第一个是它本质上是一种迁移学习,也就是transfer learning,第二个是transfer的方式是通过所谓的label,区别于我们平时理解的样本label离散值,变为了0到1之间的一个连续值。左下角是一个常见的蒸馏模型架构图,这个里面会有涉及到两个模型,第一个模型叫做教师模型,叫做teacher,第二个模型是学生模型,叫做student。这两个模型的总体思路是teacher模型是一个非常大、非常复杂、学习到的东西非常多的模型,teacher模型会把学习到的知识传导给student模型,受限于某些原因,该模型没有办法做得很复杂,或者它的规模必须限制在一定范围内的子模型。

具体流程如下:

针对上述流程里涉及到了几个概念,有如下的进一步解释:

整个模型蒸馏的收益表现如下:

引入soft labels的概念,不再是原本的非零即一状况,需要考虑正样本有多正和负样本有多负。这看起来类似把分类问题转换成回归问题,但实质并不是。如果构建样本时,用回归的方式构建,通常会基于作品的完播率或规则组合等,人工敲定样本的回归值,这种方式过于主观,没有一个非常合理或可矫正的指标进行后续比对;而模型蒸馏的soft labels是基于teacher 模型,即由teacher 模型对真实样本进行充分训练后给出,包含更多的隐含信息且不受人为主观因素影响。

具体的,来看看我们如何做粗排模块的蒸馏,主要是分为两个大的方向:

基于以上描述可知,粗排模块可以通过蒸馏的方式,补足双塔模型在结构和特征上的缺陷。接下来的问题就是如何找到一个合适的teacher模型?精排模型通常是一个被充分训练的、参数量很大、表达能力很强的模型,如果通过蒸馏精排模型获取粗排模型,那么目标的一致性和学习能力的上限都符合我们预期的。具体操作方式如上图右侧所示:

3. 线上的粗排双塔模型

实践中,粗排模型训练时,依赖的精排输出结果来自上报精排日志。如果在离线重新对样本进行预估再输出,其实是对线下资源的浪费,所以通常在线上精排预估时,就把一些结果作为日志进行上报。粗排模型异步训练,产出模型提供给Serving。

Serving环节主要包括异步Serving和User Serving两部分,具体功能如下:

4. 粗排的线上收益

整个粗排模块上线后,我们关注的两类指标:互动类指标和播放类指标,都有非常明显的正向提升,具体的指标提升幅度可以参考上图的在线实验结果。

一般,粗排模块的表现和实际场景有较大的相关性:在候选集非常大的推荐场景下,粗排到精排间的漏斗有好几个量级,这时粗排模块会带来非常显著的收益;在候选集比较小的推荐场景下,从召回到精排间的漏斗不是很大,这时粗排的收益可能就比较有限。

进而,考虑做进一步优化。

5. 还有哪些需要考虑?

首先,上述粗排蒸馏过程本质上是pointwise,但通过上报精排日志可以拿到精排模型给出的完整再推荐列表,用pairwise学习精排排出来的序,可以进一步逼近精排结果,能更多的提取精排传递出的信息。

其次,前面虽然不断地用teacher模型和student模型描述整个过程,但实际效果上student模型不一定低于teacher模型。换一个角度,student模型其实是基于teacher模型做进一步训练,所以student模型的表征能力有可能超过teacher模型。事实上,如何让student模型通过反复的蒸馏,效果超过teacher模型,在模型蒸馏领域也有许多相关方法。

最后,粗排到底是召回的延伸,还是精排的压缩跟前置?虽然召回和精排都是一个检索的过程,但二者实际侧重点还有一些不同,比如,召回在多样性上有更多的考量,精排更强调排序次序的精准性,而粗排处于这两个环节之间,如何利用粗排模块更好地平衡召回和精排?通常而言,会考虑设计多样性调节算法解决这一问题。

04

多样性调节算法设计

1. 推荐多样性的意义

多样性的概念在推荐系统里常被提到,在不同视角下,推荐多样性对应着不同的问题。

2. 多样性控制的方案路线

在具体实现上,多样性有三个主流的技术方案:规则打散、embedding打散和DPP,下面会详细介绍:

通常,从平台生态控制的角度,类似DPP的控制算法需要贯穿整个推荐链路。在粗排和精排之后,都需要DPP环节,后续会介绍DPP算法的具体实现。

3. DPP 技术细节

DPP算法的具体实现比较复杂,这里主要介绍两个关键点:

①基于多样性和相关性构建矩阵L,该矩阵的行列式等价于最终要度量的目标。如何去定义相关性和多样性?

基于上述定义的相关性和多样性就可以构建矩阵L:用户与itemi的相关性 ( 偏好程度 )、用户与itemj的相关性 ( 偏好程度 )、itemi与itemj的多样性三者乘积。通过最大化矩阵L,就可以实现相关性和多样性的联合度量。

②如何优化求矩阵L行列式的复杂度,该行列式的原始计算复杂度是三阶,线上难以支撑这样的运算性能消耗,可以通过贪婪算法把计算复杂度进一步降低至一阶。

由此,行列式的求解过程由三阶降低到一阶,满足了线上的性能,上图最下方给出的paper就是相关方向的论述。

4. 线上收益

在线上做多样性的相关实验,我们较关注的系统和数据两部分,都有明显收益:

5. 关于DPP还能做更多的是什么?

针对上述基于多样性和相关性构建矩阵L的过程,有两方面可以做进一步优化:

综上可知,DPP不只是一个多样性或相关性的度量,它本身是一种调控方式,具体调控的量和业务场景相关,具有非常大的挖掘空间。

今天的分享就到这里,谢谢大家。

首页/电脑版/地图
© 2024 CwBaiKe.Com All Rights Reserved.