RecSys‘24 | Spotify:基于Prompt的生成式音乐推荐

1.前言

音乐推荐系统通常是基于用户听歌历史, 通过"猜你喜欢"哪些歌曲来为用户提供个性化音乐推荐的, 但是, LLM赋能的对话式推荐给用户提供了另一种音乐推荐范式, 用户可以口语化的询问推荐系统, “可以推荐一些经典摇滚风格的歌曲吗?”。作者将这种基于提示词的音乐推荐问题看成是生成式检索问题Generative Retrieval problem(简称GR)。

对于这种基于提示词的音乐推荐, 最直接的方式是完全基于next token prediction来生成待推荐歌曲的歌手与歌名(或标题),如"齐柏林飞艇 - Stairway to Heaven", 再从歌曲索引中基于歌手&歌名信息查找相应歌曲, 整体流程如下图所示:

但是, 这种方式存在着一些缺点:

  • 严重依赖于文本token而不是歌曲item本身: 歌名相似的两首歌曲的流派风格可能完全不同

  • 需要单独的实体解析去得到对应的歌曲ID: 即使给了正确的歌手&歌名, 但一首歌经常有很多版本(如live,翻唱等), 要得到对应的歌曲ID也需要费一些工夫

  • 解码步数与歌手歌名的长度呈线性关系: 有些"歌手+歌名"长度会很长, 导致推理速度很慢

为此, 作者提出了Text2Tracks的框架, 如下图所示:

其中, 为ID策略, 用于将每首歌曲映射成String形式的标识符, 再作为语言模型输入的一部分, 这是论文最核心的内容。下面做详细Text2Track

2. 方法

2.1 ID策略

作者给出了3种类型的ID策略, 如下图所示:

2.1.1 基于内容的ID策略

基于内容的ID策略是把歌曲的一些元信息(文本)用分隔符"_"拼接起来, 如"周杰伦_夜曲"这种以"歌手_歌名"的方式。这种方式的优点是预训练语言模型中关于这些元信息的知识(权重)可以被充分利用起来, 也不需要额外将这些元信息文本加入到LLM的词表中。

2.1.2 基于整数的ID策略
1) 三种整数ID策略

基于整数的ID策略是使用随机整数来表示歌曲或用于表示歌曲的元信息, 具体地, 作者给了3种策略:

  • track-int: 每首歌随机分配一个整数ID, 其实就是平常推荐系统里的ItemId, 如周杰伦的《夜曲》可以表示成"10001", 这种策略下的这些整数ID是不会加入到LLM的词表中的, 因为这些ItemID并不具备可扩展性。

  • artist-int-track-seq: 由于歌曲的元信息本身是层次结构的, 因此可以为每种元信息内容都按顺序分配一个整数,再用分隔符"_“拼接起来, 如周杰伦的《夜曲》可以表示成“1001_1001”,《晴天》可以表示成"1001_1002”, 前面是给歌手分配的整数, 后面是给歌名分配的整数。同样的, 这些给歌曲元信息分配的整数也不会加入到词表中。

  • artist-iid-track-seq: 这个策略与artist-int-track-seq的区别在于, 给头部(如论文这里是top5W)歌手所分配的整数会被加入到词表, 这样, 周杰伦的《夜曲》可以表示成“<1001>_1”, 这里的<1001>表示它是被加入到词表中, 而其它部分与前面策略没有差异。

2) 深入理解策略细节

论文没有对给歌曲元信息分配整数的细节描述不多, 但实际上这里策略是使用了Sequential Indexing方法, 还挺多细节的:

In practice, following [45] we start the counts for artists and tracks within that artist from 1000 to avoid problems with unique tokens and mixing the representations of tracks that would become subsets of other track ids.

笔者结合文献按自己的理解梳理下流程, 如有不同看法, 欢迎留言交流:

  • 按训练集的顺序遍历样本每个样本()的每首歌曲

  • 得到歌曲的歌手, 查看该歌手是否已经有分配过整数, 如无, 则从1001开始, 按自增的方式顺序分配整数

  • 得到歌曲的歌名, 查看该歌曲是否已经有分配过整数, 如无, 同样也是从1001开始, 按自增的方式顺序分配整数

这里验证集和测试集并不参与顺序分配整数。以歌手为例, 系统给每个歌手所分配置的整数可能如下图所示, 其中方框表示前面出现并已经分配过的整数, 歌名的整数分配逻辑也是类似:

这里之所以按顺序分配整数, 是因为使用SentencePiece分词后, 诸如"1001"之类的ID将被标记为"100"“1”,而"1002"将被标记为"100"“2”,这样两个连续Item可以共享token “100”, 有助于保留一定的协同信号。

此外, 从1001开始分配整数有两个原因:

  1. Unique tokens problem: SentencePiece分词器不会将小于1000的一些数字分词为多个子token,因此分配了这些小数字的item将彼此完全独立, 会有问题。

  2. Mixing the representations: 在分词之后,较小的整数可能成为更大整数的子集,例如 ID "12"可以是 ID "12""34"的子集,这可能会强制Item之间的错误相关性。

2.1.3 可学习的树结构ID策略
1) 整体思路

树结构是说将歌曲组织成树结构的形式, 比如歌曲和歌曲是相同流派的, 那就可以用<0>开头, 分别使用"<0><1>" 和 "<0><2>"来表示它们, 这种方式可能会出现多首歌曲共用了同一个ID。可学习的树结构ID策略是说这里树结构是不是人为设定的。该ID策略包含两个过程, “生成Embedding"和"离散化建树”。

2) 生成Embedding的方式

论文提供了两种生成Embedding的方式

  • text-based: 将训练集中Item出现过所有Query都Concat起来, 组成一个sentence, 再使用一个sentence encoder model生成Embed

  • cf-based: 将Query视作User, 使用歌曲的共现数据基于协同过滤方式来训练得到Embed

3) 离线化建树的方式

论文提供了两种离线化建树的方式

  • 层次聚类方法: 使用了K-Means算法递归地聚类成Group

  • 稀疏编码: 为每首歌曲学习一个稀疏编码

这里并不是论文的核心, 后面实验发现在音乐场景用处不大, 就不过多介绍。

2.2 Text2Tracks:语言模型Backbone

关于语言模型Backbone, 作者参考Differentiable Search Index(简称DSI)方法实现。DSI的整体框架如下图所示:

具体地, 这里Text2Tracks使用可微的大型预训练seq2seq transformer模型做微调, 将所有关于训练集(视作语料库)的信息编码在模型的参数中。在推理时,训练好的模型输入一个文本查询输出一首歌曲(视作docid), 并使用束搜索生成一系列可能相关的歌曲列表。实际使用时, 作者使用Flan-T5作为backbone, 下面详细介绍训练过程。

2.2.1 训练微调

在微调时, 作者将训练集的每条数据的首歌曲处理成条训练样本实例, 这里表示前面对歌曲使用的ID策略处理。对于有多轮会话的数据集, 则将对话话语连接成一个查询。

另一种数据集的处理是作listwise处理(论文称为 list targets方法), 即将训练集一条数据的多首歌曲使用一些特殊token concat起来。但实际上作者后面实验发现这个方法在音乐场景效果很差。

2.2.2 数据增强

作者提供了两种数据增强的思路:

  • Synthetic Queries: 音乐场景里有很多歌单, 这些歌单本身是有一些歌单描述的, 比如《华语励志 | 拼搏百日的高燃战歌》。作者从这些歌单描述里, 随机选取2~4个非停用词来构造出一个query。这种方式通过歌曲不同的术语描述一定程度上缓解了词汇差距。

  • Indexing Step: 作者将样本实例歌曲的一些元数据(如歌手和歌名), 将其与前面ID策略处理后的结果concat起来, 即, 从而生成一些额外的训练实例。

2.2.3 推理

在推理阶段, 使用beam search生成多样性的歌曲ID列表, 这里为了减少同质化内容的输出, 会使用同质化超参增加同质化惩罚, 迫使生成多样性的歌曲ID列表。

此外, 为了减少LLM幻觉生成非法的歌曲ID, 推理时还可以使用约束解码(constrained decoding)技术, 不过后面实验部分作者提到, 有没使用约束解码, 实验结果并没有显著差异。

3. 实验部分

3.1 不同ID策略效果对比

作者实验了不同的ID策略, 最后的结论是额外增加了5W歌手到词表的"artist-iid-track-seq"方法最有效。这种方法在推理时, 使用两阶段检索, 先预测artist, 再预测track。

3.2 Text2Tracks的效果

在多个测试数据集上显著好于其它基线方法

3.3 同质化超参影响

分析了beam search时, 同质化超参惩罚项的效果分析

3.4 消融实验

实验了在音乐场景, 这几个措施(constrained decoding, list target, indexing step, synthetic queries)并没有带来实质性的提升, 这些方法无法有效适用于生成式的音乐推荐。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值