一、问题背景:冷启动建模的必要性和重要性
作为一个内容平台,云音乐每天都会有大量的新内容上线,虽然相较于短视频等其它平台,云音乐平台的新内容数量相对较少,但实际数量可能远远超出大家的想象。同时,音乐内容与短视频、新闻、商品推荐又有着显著的不同,音乐的生命周期跨度极长,通常会以年为单位,有些歌曲可能在沉寂几个月、几年之后爆发,经典歌曲甚至可能经过十几年仍然有着极强的生命力。因此,对于音乐平台的推荐系统来说,发掘冷门、长尾的优质内容,并把它们推荐给合适的用户,相比其他类目的推荐显得更加重要。
冷门、长尾的 item(歌曲)由于缺乏用户交互数据,对于主要依赖行为数据的推荐系统来说,想要做到精准分发是非常困难的。理想情况是允许拿出一小部分流量做探索分发,在探索中积累数据。但是,线上的流量又十分珍贵,探索往往容易破坏用户体验。而推荐作为直接对业务指标负责的角色,不允许我们为这些长尾 item 做过多不确定的探索。因此,我们需要做到从一开始就能较为精准地找到 item 潜在的目标用户,也就是零交互记录 item 冷启动。
二、技术方案:特征选取、模型建模
接下来分享云音乐采用的技术方案。
核心问题在于:如何找到冷启动 Item 的潜在目标用户。我们将问题拆解成两个部分:
冷启动 Item在没有用户点击播放的情况下,还有哪些有效的信息可以作为特征帮助我们进行分发?这里我们使用了音乐的多模态特征。
如何利用这些特征来做好冷启动分发建模?针对这一点,我们将分享两个主要的建模方案:
- I2I建模:自引导对比学习增强冷启算法。
- U2I建模:多模态 DSSM 用户兴趣边界建模。
歌曲本身是一种多模态信息,除了语种、曲风这些标签信息之外,歌曲的音频、文本(包含歌名与歌词)包含了大量的信息,理解好这些信息,并发掘它们与用户行为之间的关联性,是做好冷启动的关键。目前,云音乐平台采用了 CLIP 框架来实现多模态特征表达。对于音频特征,我们首先使用一些音频信号处理的方法,将其进行视频领域的变换,然后使用序列模型如 Transformer 模型进行特征提取和建模,最终得到一个音频向量。对于文本特征,使用 BERT 模型进行特征提取。最后,使用 CLIP 自监督的预训练框架,将这些特征进行序列化,最终得到歌曲的多模态表征。
对于多模态建模,业界有两种做法。一种是将多模态特征放到业务的推荐模型中进行端到端的一阶段训练,但这种方法的成本较高。因此,我们选择了两阶段的建模。首先进行预训练建模,然后将这些特征输入到下游业务的召回模型或精排模型中进行使用。
如何将一首没有用户交互行为的歌曲分发给用户呢?我们采用的是间接建模方案:把歌曲到用户(I2U)问题转化为歌曲-相似歌曲-用户(I2I2U)问题,即先找到与这首冷启动歌曲相似的歌曲,然后这些相似的歌曲与用户有一些历史交互记录,例如收藏等比较强的信号,可以找到一批目标用户。然后将这首冷启动歌曲分发给这些目标用户。
具体的做法如下,首先第一步是监督学习的任务。在歌曲特征方面,除了刚才提到的多模态信息外,还包括歌曲的标签信息,如语种、曲风等,以此来帮助我们进行个性化建模。我们将所有特征聚合到一起,输入到一个 encoder 中,最终输出歌曲向量,每个歌曲向量的相似度可以通过向量内积来表示。学习的目标是基于行为计算出的 I2I 的相似度,即协作过滤的相似度,我们在协同过滤数据的基础上加了一层后验校验,即基于 I2I 推荐后,用户反馈效果较好的一对 item 对作为学习的正样本,以确保学习目标的准确度。负样本采用全局随机采样构建。损失函数采用 BPR loss。这是推荐系统中非常标准的 CB2CF 的做法,即基于歌曲的内容、标签信息去学习歌曲在用户行为特征上的相似度。
第二步迭代,在上述做法的基础上引入了对比学习的方法。之所以要引入对比学习,是因为这一套流程学习的仍然是 CF 数据,需要基于用户的交互行为进行学习,会出现“热门物品学得多,冷门物品学得少”的问题,导致存在偏差。虽然我们的目标是希望从歌曲的多模态内容到歌曲的行为相似性进行学习,但实际训练中发现仍然存在热门和冷门的偏差问题。
因此我们引入了一套对比学习算法,旨在增强冷门 Item 的学习能力。首先,我们需要有一个 Item 的表征,这个表征是通过之前多模态 encoder 学习得到的。然后,对这个表征进行两个随机变换,这是 CV 中一些常见的做法,在特征上做随机的 mask 或者加噪。由同一个 Item 产生的两个经过随机变化的表征被认为是相似的,由不同Item 产生的两个表征被认为是不相似的,这样的对比学习机制是对冷启动学习的数据增强,通过这样的方式生成对比学习知识库样本对。
在特征增强的基础上,我们还引入了关联分组机制。
关联分组机制:首先计算 item 每一对特征之间的相关性,即维护一个相关性矩阵,且该矩阵会随着模型训练更新。然后依据特征间的相关性将 item 的特征分为 2 组,具体做法是,随机选择一个特征,然后将与该特征最相关的那一半特征放入一组,将剩下的放入另一组。最后分别对每组特征进行随机变换,从而形成对比学习的样本对。这样,一个 batch 内 N 个 item 将生成 2N 个 view,来自同一 item 的一对 view 作为对比学习的正样本,来自不同item的一对 view 作为对比学习的负样本。对比学习的 loss 采用 infoNCE,并与前面监督学习部分的 BPR loss 叠加作为最终 loss。
线上部署和推理流程:离线训练完毕后,对所有存量歌曲的向量构建向量索引。对一个新的冷启动 Item,通过模型推理得到其向量,然后从向量索引内检索与之最相似的一些 item,这些 item 是过去一些存量 item,因此存在一批与它们有历史交互行为的用户(如播放、收藏行为等),将这个需要冷启动的 Item 分发给这批用户,完成对该 Item 的冷启动。
我们对该冷启动算法进行了评估,包括离线和线下指标的评估,取得了非常好的效果,如上图所示,冷启动模型计算得到的歌曲表征对不同曲风的歌曲可实现优秀的聚类效果。部分成果已有公开论文发表(Bootstrapping Contrastive Learning Enhanced Music Cold-Start Matching)。在线上,该冷启动算法在找到更多的潜在目标用户(+38%)的同时,还实现了冷启动item 的收藏率(+1.95%)、完播率(+1.42%)等业务指标的提升。
在此基础上我们又思考:
- 在上述 I2I2U 的方案中,未使用任何用户侧特征。
- 如何引入用户特征帮助 Item 冷启动?
U2I 冷启动方案采用多模态 DSSM 建模方法。该模型由一个 ItemTower 和一个 UserTower 组成。我们将之前歌曲的多模态特征继承到 ItemTower 中,用户塔创建了一个常规的用户塔。我们对用户序列进行了多模态的学习建模,模型训练基于全量的item 空间,无论是冷门还是热门歌曲,都会作为样本去训练模型。推理时,只对圈选好的新歌或冷门歌曲池进行推理。这样的做法与之前一些双塔方案类似:对于热门的item,构建一个塔,对于新的或冷门的 item,构建另一个塔来处理。然而,我们更独立地处理了常规的 item 和冷启动的 item。我们为常规的 item 使用常规的召回模型,而对于冷门的 item,则使用专门构建的 DSSM 模型。
由于冷启动的 DSSM 模型只用于对冷门或新歌曲进行推理,我们发现对用户的 BIAS 进行建模非常重要,因为我们不能保证所有用户都喜欢冷门或新的 Item。候选集本身是一个非常大的池子,我们需要对用户 Item 进行建模,因为某些用户可能偏爱热门Item,而推荐池中可能缺少他喜欢的 Item。因此,在传统方法的基础上,我们建立了一种称为“兴趣边界”的塔来对用户的偏好进行建模。利用兴趣边界将正负样本分开,训练时,使用兴趣边界分数划分每个用户的正负样本;推理时,比较物品得分和用户兴趣边界得分来决定是否推荐该物品。训练时,我们使用兴趣边界向量和用户兴趣向量进行内积计算来得到边界的表征向量。在上图 loss 基础上,使用传统二分类的交叉熵做建模。负样本会将用户兴趣边界抬高,而正样本会将用户兴趣边界压低,最终,训练后会达到一个平衡状态,用户的兴趣边界将正负样本分开。在线上应用时,我们根据用户的兴趣边界来决定是否将冷门或长尾的 Item 推荐给该用户。
三、总结
最后做一个总结。云音乐推荐的多模态冷启建模主要工作包括:
- 特征方面,采用了 CLIP 预训练框架下对多模态进行建模。
- 建模方案上采用了两种建模方案,I2I2U 间接建模和冷启动多模态 DSSM 直接建模。
- Loss & 学习目标上,Item 侧引入了 BPR & 对比学习,User 侧兴趣边界增强冷门 Item 学习和用户学习。
未来优化主要有两个方向,一是使用内容和行为特征多模态融合建模,另一个是召回和排序全链路优化。
四、问答环节
Q1:音乐冷启动的核心指标是什么?
A1:我们会关注多方面的指标,其中比较重要的是收藏率和完播率,收藏率=收藏 PV/播放 PV,完播率=完整播放的 PV/播放 PV。
Q2:多模态特征是端到端训练还是预训练出的?第二步对比视图生成时,输入 x 具体是什么特征?
A2:我们目前采用的方案是基于 CLIP 框架进行预训练,并使用预训练得到的多模态特征来为下游的召回和排序业务提供支持。这是一个两阶段的预训练过程,而非端到端的训练。虽然从理论上讲,端到端的训练可能会更好,但与之相对,对机器的要求和成本也会更高。因此,我们选择进行预训练,这也是基于成本方面的考虑。
x表示歌曲的原始特征,包含歌曲的音频、文本多模态特征以及语种曲风等标签类特征。这些特征经过分组和 2 个不同的随机变换 F’a 和 F’’a 得到 x’ 和 x’’。f 是 encoder,也是模型的主干结构,g 加在 encoder 输出之后的一个 head,仅用在对比学习部分。
Q3:对比学习训练时两组增强的塔的 embedding 层和 DNN 都是共享的吗?为什么对比学习对于内容冷启动有效,是会专门针对非冷启动内容做负采样吗?
A3:模型始终只有一个 encoder,也就是一个塔,因此并没有参数是否共享的问题。
至于说为什么会对冷门的 item 有帮助,我是这么理解的,因为并不是对冷门 item 去做额外的一些负采样之类的工作。其实如果只是单纯的在监督学习这个基础上去学习歌曲的 embedding 表征,可能会导致偏差,因为学习的是 CF 的数据,还是会出现热门歌曲学得多的问题,最终 embedding 向量也是有偏差的。通过引入对比学习机制,在最终的 loss 引入对比学习的 loss,它是对学习 CF 数据的纠偏过程。因此,通过对比学习的方式,是改善向量本身空间分布,并没有去对冷门的 item 去做额外的处理。
Q4:兴趣边界那里是多目标建模吗?看起来又不太像,可以介绍一下 ⍺ 和 p 这两个量吗?
A4:多模态 DSSM 建模中包含一个 ItemTower 和一个 UserTower,然后在UserTower 的基础上,我们去对 user 特征额外建模了一个塔称之为兴趣边界塔。这三个塔分别输出一个向量,在训练时,我们会对 item 向量和 user 向量进行内积,得到 item 得分,然后将 user 向量和 user 的兴趣边界向量进行内积,表示用户的兴趣边界得分。参数⍺ 是一个常规的样本加权参数,用于平衡正负样本对loss的贡献比例。p是item最终得分,计算方式为…将 item 向量和 user 向量的内积得分减去 user 向量和 user 兴趣边界向量的内积得分,并通过 sigmoid 函数计算得到的最终得分。在计算过程中,正样本会把 item 和 user 的内积的分数拉高,把 user 和 user 兴趣边界的内积得分降低,负样本反之。理想情况下,user 和 user 兴趣边界的内积得分可以划分正负样本。在线上推荐阶段,我们使用兴趣边界作为参考值,将得分更高的 item 推荐给用户,而得分较低的 item 不予推荐。如果一个用户只对热门 item 感兴趣,那么理想情况下,这个用户的边界分,也就是他的 user 向量与他的兴趣边界向量的内积会非常高,甚至高于所有的冷启动 item 得分,因此不会向该用户推荐一些冷启动的 item。
Q5: 用户塔(userTower)和兴趣边界塔在结构上有什么区别,看起来输入似乎是一样的?
A5:二者输入确实是一样的,结构也是类似的,只是参数不共享。最大的区别仅体现在 loss 的计算上。用户塔的输出用于与 item 塔的输出做内积计算,得到的是 item 得分。兴趣边界塔的输出与用户塔的输出做内积计算,得到的是边界分,训练时二者相减后参与二分类 loss 的计算,推理时比较二者的大小来决定是否将这个 item 推给用户。