Spotify AI 技术(1)使用 TensorFlow 和 TF-Agents

介绍

        我们的许多音乐推荐问题都涉及为用户提供有序的项目集,以满足用户在那个时间点的收听偏好和意图。我们根据以前与应用程序的交互来提供当前的推荐,抽象地说,由于我们不断向用户推荐内容,因此我们面临着一个连续的决策过程。

        强化学习 (RL) 是一种成熟的顺序决策工具,可用于解决顺序推荐问题。我们决定探索如何使用 RL 为用户打造聆听体验。在我们开始训练代理之前,我们需要选择一个 RL 库,使我们能够轻松地构建原型、测试和部署我们的解决方案。

        在 Spotify,我们将 TensorFlow 和扩展的 TensorFlow 生态系统(TFX、TensorFlow Serving 等)作为我们生产机器学习堆栈的一部分。我们很早就决定将 TensorFlow Agents 用作我们的首选 RL 库,因为我们知道将我们的实验与我们的生产系统集成会大大提高我们的效率。

笔记

TFX

     当您准备好将模型从研究状态切换到生产状态时,可以使用 TFX 创建和管理生产流水线。

TensorFlow Serving

        TensorFlow Serving 是一种灵活的高性能机器服务系统 专为生产环境设计的学习模型。TensorFlow Serving 使 轻松部署新算法和实验,同时保持相同的服务器 架构和 API 的 API 中。TensorFlow Serving 提供开箱即用的集成 使用 TensorFlow 模型,但可以轻松扩展以服务于其他类型的 模型和数据。

        我们需要的一个缺失的技术是离线 Spotify 环境,我们可以在在线测试之前使用它来离线原型、分析、探索和训练代理。TF-Agents 库的灵活性,加上 TensorFlow 及其生态系统的更广泛优势,使我们能够干净利落地设计出一个强大且可扩展的离线 Spotify 模拟器。

        我们的模拟器设计基于 TF-Agents Environment 基元,并使用这个模拟器我们开发、训练和评估了物品推荐、原版 RL 代理(PPG、DQN)和改进的深度 Q 网络(我们称之为动作头 DQN(AH-DQN))的顺序模型,它解决了我们的 RL 公式的大状态和动作空间所带来的特定挑战。

        通过实时实验,我们能够证明我们的线下效果估计值与线上结果密切相关。这为 Spotify 的大规模实验和强化学习应用打开了大门,这得益于 TensorFlow 和 TF-Agents 解锁的技术基础。

        在本文中,我们将提供有关 RL 问题的更多详细信息,以及我们如何使用 TF-Agent 端到端地启用这项工作。

RL 循环和模拟用户

        在 RL 中,代理与环境持续交互。在给定的时间步长,Agent 使用来自环境的观察值,并使用此观察值在时间 t 生成给定其策略的作。然后,环境处理作并发出奖励和下一个观察值(请注意,虽然通常可以互换使用,但 State 是作后总结环境所需的完整信息,而 Observation 是实际暴露给 Agent 的此信息部分)。

        在我们的例子中,从环境发出的奖励是用户对代理作驱动的音乐推荐的响应。在没有模拟器的情况下,我们需要将真实用户暴露给 Agent 以观察奖励。我们采用基于模型的 RL 方法来避免让未经训练的 Agent 与真实用户交互(在训练过程中可能会损害用户满意度)。

        在这种基于模型的 RL 公式中,Agent 不会针对真实用户进行在线训练。相反,它使用用户模型来预测对通过 Agent作派生的跟踪列表的响应。使用此模型,我们以最大化(模拟的)用户满意度指标的方式优化作。在训练阶段,环境使用此用户模型返回预测的用户对 Agent 建议的作的响应。

        我们使用 Keras 来设计和训练我们的用户模型。然后,模拟器解压缩序列化的用户模型,并用于计算代理训练和评估期间的奖励。

笔记

         Keras 是一个高级神经网络 API,最初由 François Chollet 创建,并于2017年合并到 TensorFlow 中。Keras 的设计理念是简单、快速实验和模块化,使深度学习模型的构建变得轻松而愉快。Keras 提供了用户友好的接口,可以在 TensorFlow、Theano 和 Microsoft Cognitive Toolkit (CNTK) 等深度学习后端上运行。

模拟器设计

        抽象地说,我们需要构建的内容很明确。我们需要一种方法来模拟 Agent 的用户监听会话。给定一个模拟用户和一些内容,实例化一个侦听会话,并让 Agent 在该会话中驱动推荐。允许模拟用户对这些建议 “做出反应”,并让 Agent 根据此结果调整其策略,以推动一些预期的累积奖励。

        TensorFlow Agents 环境设计指导我们开发系统的模块化组件,每个组件负责整个模拟的不同部分。

在我们的代码库中,我们定义了一个环境抽象,它要求为每个具体实例定义以下内容:

class AbstractEnvironment(ABC):_user_model: AbstractUserModel = None_track_sampler: AbstractTrackSampler = None_episode_tracker: EpisodeTracker = None_episode_sampler: AbstractEpisodeSampler = None@abstractmethoddef reset(self) -> List[float]:pass@abstractmethoddef step(self, action: float) -> (List[float], float, bool):passdef observation_space(self) -> Dict:pass@abstractmethoddef action_space(self) -> Dict:pass
设置

        在代理训练开始时,我们需要实例化一个模拟环境,该环境包含假设用户的表示以及我们希望向他们推荐的内容。我们基于真实和假设的 Spotify 收听体验来实例化。定义这些实例化的关键信息通过 传递到环境。如前所述,我们还需要为模拟器提供经过训练的用户模型,在本例中为 。_episode_sampler_user_model

动作和观察

        就像任何代理环境一样,我们的模拟器要求我们指定 和 。在我们的例子中,作可能是连续的或离散的,这取决于我们的 Agent 选择以及我们打算如何将 Agent 的动作转化为实际建议。我们通常建议从潜在项目池中提取的有序项目列表。直接制定这个动作空间会导致它在组合上变得复杂。我们还假设用户将与多个项目交互,因此之前在此领域依赖于单选假设的工作不适用。action_specobservation_spec

        在没有由项目集合组成的离散作空间的情况下,我们需要为模拟器提供一种方法,用于将 Agent 的作转换为实际的推荐。此 logic 包含在 via 中。剧集采样器建议的 “示例播放模式” 包含有关可以呈现给模拟用户的项目的信息。Track Sampler 使用这些和代理的作,并返回实际的项目推荐。_track_sampler

 

终止和重置

        我们还需要处理剧集终止动态。在我们的模拟器中,重置规则由模型生成器设置,并基于对与特定音乐聆听体验相关的交互数据的实证调查。作为假设,我们可以确定 92% 的监听会话在 6 次连续的轨道跳跃后终止,我们将构建我们的模拟终止逻辑来匹配。它还要求我们在模拟器中设计抽象,允许我们检查是否应该在每个步骤后终止该剧集。

重置剧集后,模拟器将对新的假设用户侦听会话对进行采样,并开始下一集。

剧集步骤

        与标准 TF 代理环境一样,我们需要为模拟定义步骤动力学。我们有可选的模拟动力学,我们需要确保在每一步都强制执行。例如,我们可能希望同一商品不能多次推荐。如果 Agent 的作指示对之前推荐的项目的推荐,我们需要构建功能,以根据此作选择下一个最佳项目。

我们还需要在每个步骤中根据需要调用上面提到的终止(和其他支持函数)。

剧集存储和重播

        到目前为止,提到的功能共同创建了一个非常复杂的仿真设置。虽然 TF 代理重放缓冲区为我们提供了存储用于代理训练和评估的剧集所需的功能,但我们很快意识到需要能够存储更多剧集数据以进行调试,以及特定于我们的模拟的更详细的评估,这与标准 Agent 性能测量不同。

        因此,我们允许包含一个扩展版,它将存储有关用户模型预测的其他信息、记录采样用户/内容对的信息等。_episode_tracker

创建 TF-Agent 环境

        我们的环境抽象为我们提供了一个与标准 TF-Agents Environment 类匹配的模板。在我们实际创建具体的 TF-Agents 环境实例之前,需要解决环境的一些输入。这分三个步骤进行。

首先,我们定义一个符合我们抽象的特定仿真环境。例如:

class PlaylistEnvironment(AbstractEnvironment):def __init__(self,user_model: AbstractUserModel,track_sampler: AbstractTrackSampler,episode_tracker: EpisodeTracker,episode_sampler: AbstractEpisodeSampler,....):

        接下来,我们使用一个环境构建器类,该类将用户模型、轨道采样器等作为输入,以及一个环境类(如 .构建器将创建此环境的具体实例:PlaylistEnvironment

self.playlist_env: PlaylistEnvironment = environment_ctor(user_model=user_model,track_sampler=track_sampler,episode_tracker=episode_tracker,episode_sampler=self._eps_sampler,)

最后,我们利用一个 conversion 类,它从我们的具体实例构造一个 TF-Agents Environment

class TFAgtPyEnvironment(py_environment.PyEnvironment):def __init__(self, environment: AbstractEnvironment):super().__init__()self.env = environment

然后,这将在我们的 Environment Builder 内部执行:

class EnvironmentBuilder(AbstractEnvironmentBuilder):def __init__(self, ...):...def get_tf_env(self):...tf_env: TFAgtPyEnvironment = TFAgtPyEnvironment(self.playlist_env)return tf_env

然后,生成的 TensorFlow Agents 环境可用于 Agent 训练。

这种模拟器设计使我们能够根据需要轻松创建和管理具有各种不同配置的多个环境。

接下来,我们将讨论如何使用模拟器训练 RL 代理生成播放列表。

用于播放列表生成的自定义代理

        如前所述,强化学习为我们提供了一套自然适应音乐听序性的方法集;使我们能够随着会话的进行而适应用户不断变化的偏好。

        我们可以尝试使用 RL 来解决的一个具体问题是自动音乐播放列表生成问题。给定一组(大量)曲目,我们希望了解如何创建一个最佳播放列表来推荐给用户,以便最大限度地提高满意度指标。我们的用例与标准 slate 推荐任务不同,在标准 slate 推荐任务中,目标通常是在序列中最多选择一个项目。在我们的示例中,我们假设我们有针对 Slate 中多个项目的用户生成的响应,这使得 Slate 推荐系统不直接适用。另一个复杂之处在于,从中得出建议的轨道集在不断变化。

        我们设计了一个能够处理这些约束的 DQN 变体,我们称之为 Action Head DQN (AHDQN)。

        AH-DQN 网络将当前状态和可用作作为输入,以便为输入作生成单个 Q 值。对于输入中的每个可能项,将重复此过程。最后,选择具有最高 Q 值的项并将其添加到盖板中,该过程将继续,直到盖板填满为止。

实验简介

        我们在线下和线上大规模测试了我们的方法,以评估 Agent 为我们的真实推荐系统提供支持的能力。除了测试 Agent 本身之外,我们还热衷于评估模拟器返回的各种策略的离线性能估计与我们的在线结果匹配(或至少在方向上一致)的程度。

 

        请参阅我们的 KDD 论文,了解有关我们基于模型的 RL 方法和代理设计的详细信息。

通过基于仿真的强化学习自动生成音乐播放列表

Federico Tomasi、Joseph Cauteruccio、Surya Kanoria、Kamil Ciosek、Matteo Rinaldi 和 Zhenwen Dai

KDD 2023 年

确认

我们要感谢所有过去和现在为这项工作做出贡献的 Spotify 团队成员。特别要感谢 Mehdi Ben Ayed 在帮助开发 RL 代码库方面所做的早期工作。我们还要感谢 TensorFlow Agents 团队在整个项目中的支持和鼓励(以及使之成为可能的库)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20878.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyExcel实现excel导入(模版上传)

目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…

基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)

文章目录 基于Django快递物流管理可视化分析系统(完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料)一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…

动态规划,复习

一.动态规划 1. 思路&#xff1a;每次递增序列结束都取最优解 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int ans -1,temp 1;for(int i 0;i<nums.size()-1;i){if(nums[i]<nums[i1]) temp;else{ans max(ans,temp);temp 1;}}ans…

【鸿蒙开发】第三十八章 ArkTS代码调试

debug启动调试attach启动调试等待调试使用断点检查变量使用调试器反向调试extension调试worker/taskpool调试Evaluate and logSmart Step Into 1 debug启动调试 如果需要设置断点调试&#xff0c;找到需要暂停的代码片断&#xff0c;点击该代码行的左侧边线&#xff0c;或将光…

个人简历html网页模板,科技感炫酷html简历模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…

Python深度学习环境配置(Pytorch、CUDA、cuDNN),包括Anaconda搭配Pycharm的环境搭建以及基础使用教程(保姆级教程,适合小白、深度学习零基础入门)

全流程导览 一、前言二、基本介绍2.1全过程软件基本介绍2.1.1 Pytorch2.1.2 Anaconda2.1.3 Pycharm2.1.4 显卡GPU及其相关概念2.1.5 CUDA和cuDNN 2.2 各部分相互间的联系和安装逻辑关系 三、Anaconda安装3.1安装Anaconda3.2配置环境变量3.3检验是否安装成功 四、Pycharm安装五、…

案例-18.文件上传-阿里云OSS-集成

一.分析 要想将阿里云oss集成到新增员工的功能中&#xff0c;必须要设计文件上传的接口UploadController。首先前端给接口上传接口需要接收请求的图片&#xff0c;然后接口再将图片上传到阿里云oss中存储起来&#xff0c;接着接口从阿里云oss中获取图片的url并返回给前端&#…

在Unity中用简单工厂模式模拟原神中的元素反应

1. 第一步创建3个脚本Factory&#xff08;反应工厂&#xff09;&#xff0c;Reactions&#xff08;具体反应&#xff09;&#xff0c;FactoryText&#xff08;测试反应的脚本&#xff09; 2.编写工厂脚本 using UnityEngine;// 定义一个元素反应的接口&#xff0c;所有具体的元…

Markdown 常用语法及示例

介绍 Markdown 是一种轻量级标记语言&#xff0c;广泛用于编写文档、README 文件、博客文章等。本文将介绍 Markdown 的一些常用语法&#xff0c;帮助你快速上手。官网地址1 1. 标题 Markdown 使用井号 # 来表示标题&#xff0c;井号的数量决定了标题的级别&#xff0c;最多…

Ubuntu USB耳机找不到设备解决

​ 一. 确定硬件连接 lsusb -t 插拔USB耳机&#xff0c;确定是否有USB识别到 二. 查看输出设备 sudo apt-get install pavucontrol pavucontrol 点击想要使用的输出设备后面的绿色选项 三. 输出设备没有USB耳机时调试 3.1 确认ALSA是否识别设备 列出ALSA播放设备&#…

企业软件合规性管理:构建高效、安全的软件资产生态

引言 在数字化转型的浪潮下&#xff0c;企业的软件使用方式日益多元化&#xff0c;涉及云端、订阅制、永久授权及浮动许可等多种模式。然而&#xff0c;随着软件资产的增多&#xff0c;企业面临着合规性管理的严峻挑战&#xff1a;非法软件使用、许可证管理不当、软件资产闲置…

el-table树状表格,默认展开第一个节点的每一层

效果如图 <template><el-table:data"tableData"style"width: 100%":tree-props"{ children: children, hasChildren: hasChildren }":expand-row-keys"expandRowKeys"row-key"id"expand-change"handleExpan…

C ASCII字符表示

1-1 ASCII字符表示 sprintf(buf, "A5%c%02d", SOFTWARE_VERSRION_1 A - 1, (U16)SOFTWARE_VERSRION_4); 在程序中通常会出现这样的写法&#xff0c;A对应的ASCII字符表示的含义是65&#xff0c;一直往后到95获得的支付是B是66&#xff0c;然后Z对应的是90&#xff…

【iOS】包大小和性能稳定性优化

包大小优化 图片 LSUnusedResources 扫描重复的图片 ImageOptim,压缩图片 压缩文件 优化音视频资源 &#xff0c;使用MP3 代替 WAV ffmpeg -i input.mp3 -b:a 128k output.mp3 视频 H.265&#xff08;HEVC&#xff09; 代替 H.264 ffmpeg ffmpeg -i input.mp4 -vcodec lib…

智能选路+NAT实验

智能选路NAT实验 1.拓扑 2.配置 1.配IP&#xff08;按图配&#xff0c;略&#xff09; 2.配真实DNS服务器 3.虚拟服务器 4.配置DNS透明代理功能 [USG6000V1]dns-transparent-policy [USG6000V1-policy-dns]dns t [USG6000V1-policy-dns]dns transparent-proxy en [USG6000…

【Linux网络-网络基础】TCP/IP五层(或四层)模型+网络传输的基本流程

一、TCP/IP五层&#xff08;或四层&#xff09;模型 TCP/IP 是一组协议的代名词&#xff0c;它还包括许多协议&#xff0c;组成了 TCP/IP 协议簇。 TCP/IP 通讯协议采用了 5 层的层级结构&#xff0c;每一层都呼叫它的下一层所提供的网络来完成自己的需求。 ❍ 物理层&#…

POI优化Excel录入

57000单词原始录入时间258S 核心代码: List<Word> wordBookList ExcelUtil.getReader(file.getInputStream()).readAll(Word.class);if (!CollectionUtil.isEmpty(wordBookList)) {for (Word word : wordBookList) {//逐条向数据库中插入单词wordMapper.insert(word);}…

Solon —— 容器

说明 Solon 的核心概念有 IoC、AOP 和本地事件总线。有人常常有误解以为 IoC 和 AOP 是 Spring 提出的&#xff0c;其实这两种思想在Spring 之前就已经有了&#xff0c;但 Spring 把这两个思想在技术上落地和推广做得很好&#xff0c;让 Ioc 和 AOP 广为人知。 核心概念 IoC…

java每日精进 2.13 MySql迁移人大金仓

1.迁移数据库 1. 数据库创建语句 MySQL&#xff1a; CREATE DATABASE dbname; 人大金仓&#xff08;Kingbase&#xff09;&#xff1a; 在人大金仓中&#xff0c;CREATE DATABASE 的语法通常相同&#xff0c;但可能需要特别注意字符集的指定&#xff08;如果涉及到多语言支持…

《DeepSeek 一站式工作生活 AI 助手》

最近国产AI工具DeepSeek在全球火出圈&#xff0c;登顶多个国家应用商店&#xff0c;下载量一路飙升。这匹AI “黑马” 到底凭什么征服全球用户&#xff1f;让我们全方位解锁DeepSeek——从基础入门到高阶玩法&#xff0c;从实用技巧到隐藏功能。 DeepSeek是一款功能强大的国产A…