多模态推荐在网易云音乐社区的创新实践

大数据智能说 2024-09-21 03:32:33

导读 本文将介绍云音乐社区推荐系统中多模态内容理解的应用实践,将详细阐述多模态内容理解在音频和图文内容上的应用,包括使用 Music Clip 和 Audio MAE 进行音频表征学习,以及通过 Flava 架构进行图文内容特征融合。文章强调了多模态内容理解在新内容和新用户优化上的重要性。

主要内容包括以下几大部分:

1. 云音乐社区业务简介

2. 多模态内容理解

3. 冷启动应用实践

4. 展望

5. 问答环节

分享嘉宾|罗如意 网易云音乐 资深算法工程师

编辑整理|王红雨

内容校对|李瑶

出品社区|DataFun

01

云音乐社区业务简介

音乐社区的核心目标就是做“更音乐”的社区,整个主题都是在围绕音乐做社区。

云音乐社区业务主要包括四种类型:

“评论”,即单曲下面的歌曲评论的推荐,是纯文本形式。“瞬间”,和评论类似,唯一的区别是它是图文形式的内容。“动态”,即用户和艺人发布的动态。“乐迷团”,是艺人和粉丝之间的互动。

动态和乐迷团分发的内容都是以图文为主。在动态 tab 下面,分发的内容可能会包括:用户的优质评论、瞬间,还有乐迷团的一些内容。

云音乐社区的目标是希望在社区里面的用户规模和用户的互动,或者说规模和留存之间同步增长。

整体可以分为三个部分,就是社区的用户、创作者和内容这三个之间互相影响的循环。要做大规模,最核心的就是希望内容新的不断、老的常有,用户新的多来、老的不走。

想做好这个流程,或者是互动,内容是必不可少的,希望不断有新的内容进来,并且还有一些好的优质的内容。

02

多模态内容理解

接下来介绍多模态内容理解在新内容和新用户上的优化。

1. 音频内容理解

首先来介绍一下音频内容理解。音乐最大的需求场景就是用户的听歌场景,所以对于歌曲的表征是非常重要的。

在社区里,用得比较多的就是 Music Clip 和 Audio MAE。

MusicCLIP 和 image clip 基本结构是一致的,差异是他们输入的信息和模态的编码器。例如,文本特征音乐输入的是歌曲的曲风、歌曲名、人名等各类的文本标签,还会使用多语言的 BERT。因为歌曲会涉及到各种语言的信息。

音频的编码,先把音频转化成频谱图,然后把频谱图输入到 CNN+transformer 这样的结构中得到音频的表征。最后通过类似 clip 的对比学习的方式去学到音频的表征,在可视化出来在曲风上,我们可以发现相同曲风的歌曲,它们的表征是聚合在一起的。

Audio MAE 的过程为,首先把一个音频的特征先转化成频谱图,然后把这张频谱图做一些 patch,之后会做一些 mask(如图中黑色部分),然后放到 encoder 和 decoder 编码和解码器当中,通过 MSE 的方式去恢复原来的音频图像。

2. 图文内容理解

在云音乐社区中,分发内容最多的就是图文了,所以图文内容的理解对于我们的推荐场景来说非常重要。

整体架构是 FLAVA 架构,对于图片的编码和文本的编码,都是通过 ViT 的形式去抽取。抽取完之后,将它们的特征合并起来,再经过 ViT 去做特征融合。

但是我们在做标签提取或者向量表示的时候,没有直接用原始的 FLAVA 架构的 encoder 和 decoder,而是把图像的 clip 模型里面的文本编码器和图像编码器替换成了 FLAVA 里面的文本编码器和图像编码器。

在训练的时候,也有一些 trick。

在图文表示上面,有一些图片和文本是不对应的。例如,有些艺人、有些用户发表了一些图片,还有一些文字,这些文字并不是在描述这些图片,称作是没有对齐的状态。为了在打标签或者是向量表征上效果更好,会把 image 的 encoder 固定住,让 text 的 encoder 去参与训练,整体效果会更好一些。

现在我们也开始尝试类似于 Qwen-VL 这种大语言模型来抽取特征。大语言模型既可以输入图片,也可以输入文本,但是它很神奇的地方就是还可以输入 prompt 指令。如图中右侧所示,在传统的多模态理解中,无论是做标签还是向量表示,本质上会基于场景去获取一些数据,然后拿不同的数据去训练一版模型。如果利用 prompt,那么调用不同的 prompt 就相当于获得了不同的数据。

目前,这一领域还在实践。并且尝试不同的 prompt,例如文本解释型的 prompt,让大模型解释一下当前的文本和图像具体介绍什么东西,得到了 response 的文本,但是我们没有直接去用文本,而是用模型最后一层的隐藏层去做一些分类或者是向量表示。

其次,也可以针对一些业务目标,例如,想要提升的互动或者留存,不同的 prompt 就能完成不同数据的收集。

通过测试发现,直接使用原始的不经过微调的 Qwen-VL 表示出来,相比于其他的传统的图像和文本编码器,增益不是很明显,但是如果把 Qwen-VL 在我们的业务数据上去做一些微调,效果则更优。

03

冷启动应用实践

再来看看多模态如何应用在冷启动上。

1. 内容冷启

内容冷启需要内容的转化漏斗。正常的推荐系统,可能有召回、粗排、精排,再到后面的重排。内容能不能冷启出来,其在召回的时候精排以及粗排每个阶段都有可能会出问题。

召回就是希望池子里面有新内容,所以首先介绍的一个优化工作是 CB2CF。

整体的模型结构看起来比较简单,底层的输入特征就是原始的图文信息,例如,标签之类的特征、文本的 bert 特征,或者是文本和图像的 clip 以及融合的特征。

Concat 以后,经过 SENet 做一些简单的特征筛选,会拿 MLP 去生成内容的向量,得到的内容向量会对齐我们的线上 DSSM 双塔的 ItemTower。

ItemTower 是一个特征抽取器,权重并不会改变。通过 MSE 的 loss 去对齐内容的表征;得到内容表征之后单独去做一路I2I 的召回。整体指标上,互动率、人均曝光都有显著提升。此外,例如新内容的召回透出率和新内容的曝光占比也有明显的提升。

当我们已经保证了新内容能够有召回,是不是就可以了呢?精排还不一定能排上去。所以在精排这个阶段,内容率值特征的重要性是非常高的。但是,对于一些新内容或者是曝光量不足的内容,它的率值特征要么没有,要么不准。所以,为了弥补率值特征的问题,我们还是用了类似前面的结构把原始的特征以及多模态的信息 Concat 出来,经过网络最终去拟合,就得到率值的特征。当然这里在特征筛选或样本筛选的时候也需要考虑曝光量不足的问题。

得到的这个率值特征,线上就是将曝光量不足的内容替换掉,可以拿预估的率值去替换掉真实的率值。这样,在新内容的曝光上也有比较明显的提升。

2. 用户冷启

在云音乐场景,听歌是最主要的需求。听歌的场景下,要做用户冷启基本上都会去使用用户的一些听歌行为,或者是听歌的一些兴趣。

简单说,社区如果要做用户冷启,对于一个社区用户来说,他需要找到一些其他的社区用户,并且这些社区用户是有听歌行为的。只要找到这些种子用户 u2u 之后,我们拿这些社区用户的互动序列作为当前用户分发的内容就可以了。

关于用户表征,我们最开始是先做了一版基于行为的 Light GCN 去聚合,得到了一个用户表征。这个用户表征的社区整体覆盖能达到 82%,互动率提升 11.2%+。但是发现对小众歌曲偏好的用户效果并不好。主要是因为在 Light GCN,这种基于协同过滤的方式得到的用户表征,对于那些小众歌曲的表征或者是只喜欢小众歌曲的用户表征效果不是很好,所以应基于内容的表征来进一步做 u2u。

因此我们使用 Music Clip 和 Audio MAE 这两种不同的方式来得到歌曲的 embedding。然后通过池化的方式得到 user embedding,测试发现 Music Clip 的效果更好。原因在于,Music Clip 是将音频和曲风、艺人等各种标签去做映射,相比于 Audio MAE,其粒度更粗,更加可以量化,相当于是一些更泛化的特征。通过 Music Clip 这样的方式得到的用户表征,去做 u2u 效果较好。社区主要看重的一个目标是互动,互动率也有明显的提升。

第二类用户冷启是基于多模态的品类标签统计了新老用户的兴趣差异。

如图所示,横坐标是不同的品类标签,纵坐标表示新老用户兴趣标签的差异。这个差异指的是率值上的兴趣的 diff 差异。新老用户既然有差异,我们很容易想到,基于 POSO 的思路,在精排里面加入分人群的模块,核心思想是把分人群的特征,例如,新老用户的特征经过门控网络,得到当前这个用户群体的兴趣偏置,可以认为不同的用户可能会有不同的门控输出的偏置。然后,把这种门控偏置乘到原始的,例如,deep FM 里面的 DNN 的输出上。这样,就可以实现不同的用户学到的是不同的兴趣。

这里涉及到一个问题,如何去找到最优的分人群的方案?

如前所述,我们统计的是新用户和老用户,他们的兴趣是有差异的。新用户和老用户如何定义呢?例如,第一次来到社区的人可以认为是新用户,一个月内只来过一两次的也可以定义为新用户。对于不同的业务,对新用户的定义可能是不一样的,甚至会有非常多的定义方式。

为了找到最优的分人群方案,我们以性别特征作为先验信息。我们很明确地知道性别特征,男性和女性在社区里面的兴趣偏好是不一样的,并且已知他们的兴趣的激活值分布。如图所示,女性和男性有非常显著的差异,一个集中在左边,一个集中在右边,那么基于这样的先验信息去穷举所有的用户分群特征,就选择那个差异最大的。

当前这个模型还是一个 Deep FM 的 DNN 的单目标模型,在互动和时长上都有了显著的提升。

第二步,对模型做了一些升级,例如,从前面的单目标变成了多目标。

简单介绍一下这个模型的结构,底层是一些多模态的特征,有用户的基础特征、item 的基础特征、用户和 item 的交叉特征等。

左边是一个内容双塔,这个内容双塔的 item 塔是图文信息多模态的特征,user 塔的输入是用户的基础特征,最终会经过一个 pair-wise 的 loss 去训练。

右边是一个经典的 MMOE 结构,输入就是下面所有可拿到的特征拼接上左边内容双塔得到的 user 塔,拼接到一起后经过 MMOE 结构,会有先验的特征,经过一个门控网络得到一个分人群的先验的、激活的偏置,把这个偏置乘到每个门控输出的最后一层。

这是当前的一个版本。在早期的版本中,右边是 MMOE,左边是双塔。左边这个双塔之所以要把 user embedding 加过来,是因为这个场景里面不适合使用 user ID,所以没有 user embedding 的丰富信息,所以最开始 user 和 item embedding 得到的一个双塔,是对新用户在特征层面的补充。最开始,右边 item 塔的特征输入的是 user feature,item 塔最早用的是 item feature。

当时已经推全,但经过更细的分析。为什么加一个 user embedding 效果就直接提升了呢?离线统计了最近七天每天的 user embedding 的分布,这个分布主要是在不同活跃度上的人群上的分布。可以发现,当人群分化效果比较差的时候,线上和离线的 AUC 都是更差的。当分化的效果更好时,例如,每个活跃度的用户分化的都比较好,离线和线上的指标都是涨的。那么,为什么指标不能稳定地一直涨呢?所以就做了当前的这个版本的迭代,主要是引入了多模态的信息去做 Item 塔的输入,并且把门控机制也加入到了内容双塔里的 user 塔里面。这样得到了一个持续的稳定的用户分化的效果。最终,在互动和时长上提升都非常显著。

04

展望

最后从技术和业务两个层面来探讨一下大模型趋势下如何做好社区推荐。

1. 技术层面

技术层面主要包括赋能和重构两部分。

赋能,如前所述,可以拿大模型去做标签表征,但具体是否有效还需要探索;另外就是特征生成,无中生有地生成一些额外的信息,例如,我们现在这些系统里面已经有了很多结构化的信息,那能不能把那些非结构化的,或者是半结构化的,以及结构化的信息都杂糅在一起,去生成一些额外的信息。

重构,现在 meta 那边已经提出了基于 transformer 架构的生成式的推荐模型,然后再召回和精排,都取得了不错的效果,并且都证明了 Scaling Law 在推荐模型里面也是符合的。

2. 业务层面

业务层面主要分内容和玩法。

内容方面,我们的社区中有各种各样的内容。例如,我们可以用纯 AI 的方式去生成图文或者音视频等丰富的内容以吸引更多的用户,或者可以满足更多用户的兴趣。并且辅助用户的发布,例如,对用户发布的一些内容进行润色、美颜、特效等处理。

玩法方面,我们可以在社区里面加入一些交互式的推荐或者是一些人设问答等等。

以上就是本次分享的内容,谢谢大家。

05

问答环节

Q1:关于精排特征的重要性,以及召回透出率。

A1:通常一个推荐链路会包括召回、粗排、精排。透出率指的是召回阶段的内容能给到精排的比例,例如,新内容有了召回,但是不一定能精排,就是不一定能出现在精排这个阶段给他打分,所以主要是看粗排能给他打出来多少。

关于精排特征重要性的评估,我们会拿一个已经训练好的模型,随机去shuffle 掉一些特征,然后去做推理,看 shuffle 前后 AUC 的 diff,diff 越大,说明这个特征就越重要。

Q2:冷启动 2 pair loss 中的 pair 是点击曝光吗?

A2:这个 pair不是点击曝光,是在训练的时候有一个 batch,这个是 batch 层面的 pair-wise 没有做全局上的。全局上的样本做起来非常麻烦。

Q3:多模态双塔让 user 里面学习到了多模态的信息和直接用多模态序列有对比过吗?

A3:没有比过。因为我们这边并不想去用用户的兴趣来表征这个用户的 embedding,我们想有更多的增益的信息,想用这种多模态的形式去得到。因为用户的兴趣,在特征里面是有用户序列的。用户行为序列就已经表示了用户的一个兴趣了,就没有必要再去用用户的行为序列去得到用户的表征。

Q4:实验切流应该多少?这个实验人数一般是多少?

A4:我们一般是 5% 或者 10%,慢慢地放。

以上就是本次分享的内容,谢谢大家。

0 阅读:3

大数据智能说

简介:感谢大家的关注