作者:左冯翊
一、我的项目背景
云音乐依靠音乐主站业务,衍生了不少翻新业务,如直播、播客和云村等。不论是音乐、直播还是播客等业务,都面临着如下两个冷启动的问题:
- 如何为新用户(或不沉闷用户)散发内容
- 如何将新内容(或冷门内容)分发给用户
每个业务都积淀了一些解决冷启动的办法,比拟常见的一种办法是引入用户在其余场景的行为数据,比方在直播冷启中,咱们会引入用户在音乐上的行为,如用户对歌曲的红心、珍藏、评论和分享等。
随着业务的一直倒退,越来越多的场景心愿能有一种 成果比拟好 、 开发成本低 、 通用性比拟强 的计划实用于解决云音乐各业务晚期和中期的冷启动。
咱们调研了冷启动的多种解决方案,如跨域举荐、新老用户分层、元学习和关系链传递等。最初发现基于关系链的传递比拟适宜做成一种通用的根底计划,而且不少互联网产品(如微信视频号、拼多多等)也将其作为一种重要的冷启动办法。
然而云音乐没有显性的好友关系链,应该怎么做呢?隐性关系链就在这样的背景下诞生了。
那怎么构建用户的隐性关系链呢?
云音乐以内容(如歌曲、播客、直播和视频等)为外围,通过内容连贯人与人,用户基于内容进行评论、分享和点赞等产生了一系列行为。那么,咱们能够通过综合应用用户在云音乐各外围业务场景的行为数据,来学习用户的向量示意,而后基于向量的类似度,来刻画用户的隐性关系强弱。
基于以上背景,本我的项目的次要指标是通过交融用户在云音乐的全生态行为数据,来学习用户的向量示意,从而构建用户的隐性关系链。基于隐性关系链,实现不同的上游举荐工作,如用户冷启、内容冷启、类似召回和种子用户 Lookalike 等。
二、我的项目挑战
我的项目遇到的挑战次要有:
第一、数据规模大
数据规模大次要体现在 3 个方面,业务多:云音乐的业务蕴含音乐、搜寻、直播等 10+ 业务;场景多:每个业务都有多个场景,如首页、评论页等 20+ 场景;行为多:用户的行为有点击、播放、关注等 20+ 行为。
针对这个问题,咱们对各业务数据状况做了一个摸底,这些用户行为数据的总量是很大的。综合思考模型训练效率和用户趣味的时效性等,咱们也没有必要应用全量的数据。因而,咱们对业务数据做了两方面的解决:
- 应用业务的外围数据。比方在音乐这个业务,咱们应用用户红心、珍藏、评论和分享
- 对数据多了一些荡涤、限度和过滤等,无效缩小了数据量级
通过以上的一些解决,咱们失去了一份品质比拟高的用户行为数据。
第二、如何建模
用户的隐性关系链,不是一个具体的业务场景,不足明确的 label,也不足明确的优化指标,因而咱们不能间接应用业务中的排序模型进行建模。另外,用户的行为高度异构,由用户和内容(指歌曲、直播、播客等)形成的图就是异构的,并且不仅蕴含异构的节点(用户和多种内容),而且蕴含异构的边(用户和内容的多种交互行为,比方点击、播放等)。
针对如何建模这个问题,咱们将在第三局部进行重点介绍。
第三、如何评估
后面说到,咱们不能间接应用排序模型,也就意味着咱们不能间接应用 auc 等排序指标。通过剖析和调研,咱们综合应用以下几种办法进行评估:
- 定性评估
- case 剖析。这种办法通过剖析用户行为序列的交加个数或者 Jaccard 系数等,来判断关系链是否靠谱。这种办法比拟直观,也具备肯定的可解释性。但其实也存在一个问题:如果模型断定两个用户的类似度是 0.8,他们的行为序列重合度是否就很高?不肯定。比方,用户 A 对歌曲 S1 和 歌曲 S2 有红心行为,而用户 B 对歌曲 S3 和 S4 有红心行为,且这几首歌曲是比拟相干的歌曲(比方这几首歌曲经常出现在很多其余用户的行为序列中,或者来源于同一个艺人等),只管他们的行为没有交加,咱们也能够认为这两个用户的趣味是有相似之处的。
- 可视化剖析。咱们失去了用户的向量示意之后,能够通过 TensorFlow 的 Embedding Projector 等工具对 Embedding 进行可视化,而后察看具备雷同标签的用户是否聚到了一起,标签重合较少的用户是否是离开。
- 定量评估
- 上线试验。通过 u2u、u2u2i 等形式进行召回上线,依据线上收益进行评估。这种形式比拟间接,置信度比拟高,但试验老本也较高,应该先进行离线评估再确定是否上线试验。
- 离线评测。把用户向量当成特色,输出到排序模型中,评估离线 AUC 或者 loss 等指标的收益;或者离线生成 u2i 的举荐列表,而后评估召回的准确率和召回率等。这两种离线评测形式绝对上线成本低一些,尽管不是间接对 u2u 进行评估,但也是一种可行的办法。
第四、如何对外提供服务
用户的隐性关系链,是一个根底建设,为了不便各业务场景能疾速接入,咱们须要做成一个在线服务,其中就波及到一个问题:亿级别用户向量如何进行毫秒级类似检索?
云音乐参考业界的一些向量检索引擎框架(如 Faiss、milvus 和 Proxima 等),自研了 Nsearch,实现了大规模向量的高性能类似检索,反对高并发低延时、算法简单动静扩大和增量导入等。
另外,为了反对不同业务场景定制需要的能力,咱们也设计了一套比拟好的服务架构,面向业务提供对立接口,反对疾速接入、迭代的能力。
对于提供对外服务这个问题,咱们将在第四局部重点介绍。
三、技术演进
为了构建用户的隐性关系链,首先咱们须要生成用户的向量表征。为此,咱们调研和实现了多种算法,在多个业务场景上进行了良好的实际,也进行了许多无益的尝试。
如图所示,咱们将调研过程按技术深度和建模形式分为 5 个阶段:
第 1 个阶段是摸索阶段,咱们调研了 SimHash 算法。SimHash 算法其实是用于计算文本间的类似度,在咱们这里,就是把用户的行为序列看成一段文本。
第 2 个阶段是起步阶段,咱们调研了 item2vec 模型。item2vec 来源于 word2vec,它的基本原理是最大化呈现在中心词左近的那些上下文词的共现概率。
第 3 个阶段是摸索阶段。咱们在 item2vec 下面做了一些优化,比方将全局负采样改为束缚负采样,将 user_id 作为 global context,这些优化能够进一步加强向量的表征能力。
第 4 个阶段是倒退阶段。咱们调研了异构图模型 metapath2vec,它能够对多种实体关系进行建模,泛化性比拟强。
第 5 个阶段是翻新阶段。原始的 metapath2vec 没有增加 side information,泛化性能还不够强,因而咱们正在做一些改良与优化。
上面,咱们次要介绍下 SimHash、Item2vec 和 MetaPath2vec。
SimHash
SimHash 算法用于计算文本间的类似度,它是 Google 用于海量文本去重的一种算法,也是一种 部分敏感哈希(Locality Sensitive Hashing)算法:两个字符串具备肯定的相似性,在 hash 之后,仍能保留这种相似性。
SimHash 的基本原理是将原始的文本映射为 n 位的二进制数串,而后通过比拟二进制数串的汉明间隔(Hamming distance)来度量原始内容的相似性。它的根本步骤如下:
- 关键词抽取。将 Doc 进行分词,去掉停用词,而后为每个词赋予一个权重(比方该词的呈现次数或者 TF-IDF 值等)。
- Hash。通过 hash 算法把每个词映射成 hash 值(二进制串)。
- 加权。依照词的权重计算词的二进制串的加权,1 的地位乘以权重,0 的地位乘以权重并取负。
- 合并。把各个词算进去的加权序列值累加,变成一个序列串。
- 降维。把合并失去的序列串转换成 01 串,即为最终的 SimHash 值。转换规则:如果该位的值大于 0,则取 1,小于 0,则取 0.
如图,是一个简略的示例:
因而,通过 SimHash 算法解决后,一个文本字符串就变成了只有 0 和 1 的数字串,而后再通过汉明间隔来判断两个文本的类似度,个别认为汉明间隔小于 3 的两个文本是类似的。
那么,咱们如何用 SimHash 来构建用户的隐性关系链?事实上,咱们通过一些规定来聚合每个用户在各业务场景的行为序列,以此失去每个用户的 id 序列,把每个 id 当成词,而后赋予每个 id 权重,便能够根据 SimHash 的算法流程失去每个用户的 SimHash 签名(只有 0 和 1 的数字串)。
看起来,咱们的问题曾经解决了。然而,在理论利用过程中,咱们要检索一个用户与哪些用户是比拟类似的,如果和全库的数据做比拟,那效率是很低的。这里,咱们为每个用户生成了 64 位的 01 串,那么能够将构建隐性关系链这个问题形象为:
假如有 10 亿个不反复的 64 位的 01 串,给定一个 64 位的 01 串,如何疾速从这 10 亿个串中找出与给定串的汉明间隔小于等于 3(比拟类似)的字符串。
如何实现高效的检索呢?咱们能够将 64 位的 01 串,分为 4 个 16 位的段,依据抽屉原理,如果两个字符串是类似的(汉明间隔在 3 以内),那么它们必有一个段是相等的。
基于上述思维,咱们能够这样设计检索流程:
-
入库:遍历全量的 SimHash 指纹,对于每一个 SimHash 指纹,执行如下步骤:
1)将 64 位的 SimHash 指纹拆分成 4 个 16 位的段
2)将每个段通过 kv 数据库或者倒排索引存储,比方段 1 存储到库 1,段 2 存储到库 2,让 key 为 16 位的 01 串,value 为 key 相等时的指纹汇合 - 检索:对于须要检索的 SimHash 指纹,执行如下步骤:
1)将 SimHash 指纹拆成 4 个 16 位的段
2)别离将每一个段去对应的数据库进行等值查问,依据下面的抽屉原理,查问到的即是疑似类似的指纹
3)把待检索的指纹和疑似类似的指纹进行汉明间隔的比拟,即可判断是否类似
整体流程能够示意成上面的图:
假如全库有 2^30(约 10 亿)条数据,假如数据均匀分布,则每个 16 位 (16 个 01 数字随机组成的组合有 2^16 个) 倒排返回的最大数量为 2^30/2^16=16384 个候选后果,4 个 16 位,则总共候选有 4*16384=65536。因而,通过下面的入库检索流程,原来须要约 10 亿次比拟,当初最多只须要 65536 次即可失去后果,大大晋升了检索效率。
SimHash 是咱们调研的第一种算法,它简略、疾速、不必训练,但毛病也比拟显著:
- SimHash 后果具备肯定的随机性,两个随机序列的汉明间隔存在肯定的概率比拟靠近,须要通过 ensemble 升高这个概率,老本比拟高
- SimHash 对用户类似度的表征比拟粗粒度(计算汉明间隔,而汉明间隔是一个整数)
- SimHash 不能学习用户行为上下文序列的关系,不能对 i2i、u2i 等进行建模
Item2Vec
微软于 2016 年发表了一篇论文,Item2Vec:Neural Item Embedding for Collaborative Filtering。作者受 NLP 使用 embedding 算法学习 word 的 latent representation 的启发,参照了 google 的 word2vec 办法,把 item2vec 利用到举荐场景的 i2i 类似度计算中。它的次要思维是:把 item 看做 word2vec 中的 word,把用户的行为序列看做一个 sentence,item 间的共现为正样本,并依照 item 的频率散布进行负采样。
这篇论文是微软将 word2vec 利用于举荐畛域的一篇实用性很强的文章。item2vec 办法简略易用,极大地拓展了 word2vec 的利用范畴:从 NLP 畛域间接拓展到举荐、广告、搜寻等任何能够生成 sequence 的畛域。
Item2Vec 的负采样存在一个问题:负样本过于简略。比方,用户听了一首粤语歌,应用全局负采样,可能是一首英文歌,而这样会削弱向量的表征能力。为此,咱们能够进行 束缚负采样,从而进步向量的表征能力。如图:
留神到,Item2Vec 生成的是 item 的向量,那么怎么失去 user 的向量呢?事实上,在生成 item 向量之后,咱们能够依据用户历史上与 item 的交互行为,计算 mean pooling 获取用户的向量表白。有了用户的向量表白之后,咱们就能够利用 高维向量检索引擎(如云音乐自研的 nsearch、Facebook 的 Faiss 等)进行类似向量的疾速检索。
除了通过下面的形式间接失去用户向量,咱们还能够参考 Doc2Vec,当咱们通过 user 与 item 的交互历史构建出训练的序列时,能够 将 user id 作为 global context 退出到训练中,同时学习出 user 和 item 的向量。
MetaPath2Vec
Item2Vec 是解决同构网络的办法,理论在应用的时候咱们是分业务独自建模再交融的,而 MetaPath2Vec 是
YuXiao Dong 等于 2017 年提出的一种用于学习 异构信息网络(Heterogeneous Information Network, HIN)节点示意的模型。
在论文中,异构网络被定义为图 G=(V,E,T),其中 V 示意节点汇合,E 示意边的汇合,T 示意节点类型和边类型的汇合。对于每个节点 v、每条边 e 都有对应的映射函数,f(v): V -> T_V,g(e): E -> T_E,T_V 和 T_E 别离示意节点和边的类型,同时 |T_V| + |T_E| > 2,即图节点类型和边类型的类别总量大于 2。
MetaPath2Vec 可用于学习蕴含不同节点类型、不同边类型的图节点的低维示意。MetaPath2Vec 的核心思想次要有两点:
- 元门路
- 异构 Skip-Gram
上面,咱们以用户 - 歌曲 - 艺人的网络进行阐明。如图所示,该网络有三种类型的节点,不同类型的节点以不同的色彩辨别。
首先,咱们看看什么是元门路。元门路是在图中选取的由节点类型形成的组合门路,具备肯定的业务含意。比方
「用户 - 歌曲 - 用户」,它示意两个用户对某首歌曲有独特行为。咱们通常将元门路设计成一种对称的模式,这样能够反复循环进行屡次随机游走。比方基于「用户 - 歌曲 - 用户」的元门路能够采样出「用户 1 - 歌曲 1 - 用户 2 - 歌曲 2 - 用户 3”的序列。
与个别的随机游走相比,基于元门路的随机游走有以下长处:
- 防止游走偏差于呈现频率高的节点类型
- 防止游走偏差于绝对集中的节点(即度数高的节点)
- 可能捕捉不同节点类型之间的分割,从而能够将不同类型节点的语义关系交融到异构 Skip-Gram 模型中
接下来,咱们看看异构 Skip-Gram,它的优化指标是 最大化节点和其异构上下文的共现概率。
异构 Skip-Gram 的指标函数如下,和一般 Skip-Gram 模型的次要区别在于两头多了个求和符号,别离对节点与其异构街坊的关系进行建模。
四、服务部署
有了用户的向量表征之后,咱们就能够构建隐性关系链服务了。服务的整体架构如图所示,至底向上顺次是算法层、向量引擎层和服务层。
在算法层,咱们通过 simHash、item2vec 和 metapath2vec 等模型学习用户的向量示意,在这个过程中,同时也会产出内容的向量示意,即 Embedding。
在向量引擎层,咱们把用户和内容的 Embedding 导入到向量引擎进行索引构建。这里的向量引擎,用的是云音乐自研的 nsearch,实现了高维向量类似检索、高并发低延时等查问需要。
在服务层,采纳的是云音乐自研的服务框架 rtrs,实现了动静公布、多级缓存和异步解决等工程需要。当申请来了之后,框架会对协定参数进行解析,召回模块会去配置核心加载相应的业务配置,而后执行该场景的业务召回。
通过以上这套框架,咱们能够反对多种隐性关系链的召回形式,包含 u2u、u2i 和 i2i 等,另外,每种召回形式可能反对不同业务场景定制需要的能力。
五、我的项目成绩
隐性关系链从业务中来,最终也应该回到业务中去,服务业务,为业务发明价值。
第一,隐性关系链从无到有,提供了隐性关系服务的能力。在这个过程中,咱们除了构建用户的隐性关系,也构建了内容和艺人等的隐性关系链。如图所示,展现了艺人的隐性关系链。
第二,目前隐性关系链为音乐、播客和动静等 9 个业务的 13 个利用场景提供了隐性关系服务,获得了良好的成果。其中,在陌生人一起听这个场景,成果晋升显著(人均连线时长 +9.4%)。
第三,目前隐性关系服务,高峰期 QPS 在 5000 以上,均匀时耗在 10 毫秒。
六、总结与瞻望
隐性关系链是一个基建我的项目,尽管不是间接做业务,然而也和做业务必由之路,都须要为业务发明价值。咱们曾经在一些业务场景获得了一些成果,但还有不少中央须要进一步欠缺:
第一,隐性关系链基于神经网络模型,神经网络的黑箱个性使得很多模型不具备可解释性,使得隐性关系链无奈利用在一些须要显性关系的业务,比方在用户举荐场景提供举荐理由。对于这个问题,咱们将引入图数据库辅助建模。
第二,隐性关系链的数据价值还没有失去充沛开掘,比方 KOL 开掘、社群发现等。
第三,模型的泛化能力还不够强,还须要增加更多 side information。
第四,模型还不够鲁棒,模型容易被沉闷用户、热门内容带偏,导致对不沉闷用户、长尾内容的学习不够充沛。对于这个问题,咱们将引入 contrastive learning(比照学习)进行建模。
参考文献
- Charikar, Moses S. (2002), “Similarity estimation techniques from rounding algorithms”, Proceedings of the 34th Annual ACM Symposium on Theory of Computing, p. 380, doi:10.1145/509907.509965, ISBN 978-1581134957.
- Gurmeet Singh, Manku; Jain, Arvind; Das Sarma, Anish (2007), “Detecting near-duplicates for web crawling”, Proceedings of the 16th International Conference on World Wide Web (PDF), p. 141, doi:10.1145/1242572.1242592, ISBN 9781595936547.
- Barkan O, Koenigstein N. Item2vec: neural item embedding for collaborative filtering[C]//2016 IEEE 26th International Workshop on Machine Learning for Signal Processing (MLSP). IEEE, 2016: 1-6.
- Dong Y, Chawla N V, Swami A. metapath2vec: Scalable representation learning for heterogeneous networks[A]. Proceedings of the 23rd ACM SIGKDD international conference on knowledge discovery and data mining[C]. 2017: 135–144.
- Thomas N. Kipf and Max Welling. 2017. Semi-Supervised Classification with Graph Convolutional Networks. In ICLR.
- Xiangnan He, Kuan Deng ,Xiang Wang, Yan Li, Yongdong Zhang, Meng Wang(2020). LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation
本文公布自网易云音乐技术团队,文章未经受权禁止任何模式的转载。咱们长年招收各类技术岗位,如果你筹备换工作,又恰好喜爱云音乐,那就退出咱们 staff.musicrecruit@service.ne…。