作者:Heorhii Skovorodnikov

深入研究TikTok令人惊叹的实时推荐系统的内部工作原理,了解是什么使它成为该领域最好的产品之一。

为什么TikTok的feed如此让人上瘾?秘诀在于他们的推荐引擎,这正是使TikTok成为最大的社交媒体平台之一的原因。

似乎feed可以读取你的思想,让你在应用程序中停留更长时间。最近,TikTok决定让每个人都知道一个秘密,并在一篇题为 “Monolith:带有无碰撞嵌入表的实时推荐系统[https://arxiv.org/pdf/2209.07663.pdf]” 的论文中发布了它的模型Monolith。

在线推荐系统是一种算法,用于根据用户的兴趣和喜好向用户提供个性化的建议。这些系统通常被在线零售商和媒体公司用于向用户推荐产品或内容。

在这篇文章中,我们将深入研究TikTok令人惊叹的推荐系统的内部工作原理,并了解是什么,让它成为该领域最好的系统之一.

目前的设计存在什么问题?

构建可扩展的实时推荐系统对于许多企业在其产品或网站中构建良好的体验至关重要。然而,目前的深度学习框架(TensorFlow或PyTorch)不能很好地用于实时生产场景。这是因为:

  • 在依赖动态稀疏特征的推荐系统中,基于静态参数和密集计算的模型更新并不适合较好的推荐性能。
  • 常见的方法是将批量训练阶段和服务阶段(在用户与产品交互期间)完全分开设计,防止模型与客户反馈实时交互。

TikTok的团队通过3个步骤解释了他们的解决方案:

  • 他们制作了一个无碰撞的嵌入表,同时通过添加可exponable embedding 和 frequency filtering(频率过滤)来进一步优化它,以减少其内存消耗,让其高效,并适合分发到用户;
  • 他们提供了一个可用于生产环境的,且具有高容错性在线训练架构;
  • 他们通过实验证明,系统的可靠性可以与实时学习来互相平衡;

听起来有点吓人吗? 不要担心,我们将通过对每个组件的拆解分析,在本文结束时,你将有信心地理解,为什么你可以在应用程序中浪费大量时间。准备好了吗? 我们要发车啦。

Embeddings and Hash maps

TikTok的研究人员观察到,对于推荐系统来说,数据大多是categorical(分散) 和sparse(稀疏)的

这意味着,如果我们使用像单词嵌入这样的ML方法嵌入数据,我们将无法通过推荐数据提供的独特特性数量来实现,相比之下,由于词汇量有限,语言模型可以做到这一点。

根据YouTube和Instagram推荐系统的实际经验,哈希技巧被认为是大规模推荐系统的最佳方法。让我们深入研究《Monolith》中所使用的细节。

那么HashMap呢?

哈希映射是一种数据结构,它允许通过一个特殊的哈希函数将数据片段快速映射到一个值。

哈希映射速度很快,被大型平台用于高效编码数据,那么单体应用如何使其更好呢? 哈希映射有一个固有的权衡,这个数据结构的原始设计称为碰撞(collision)。

当两个或多个数据通过哈希函数映射到相同的输出值时,就会发生冲突。当使用哈希函数索引数据时,这可能会导致问题,因为多个数据块将被映射到相同的位置。TikTok的团队开发了一个 cuckoo hashmap,来解决这个问题。

在 cuckoo hashmap 中,就像在标准hash map中一样,每个数据都被分配一个唯一的键,并且键被哈希以确定它在数组中的位置。如果该位置已经被另一段数据占据,则现有数据将被“踢出”(类似于现实生活中杜鹃对巢中蛋的行为),并且必须使用第二个哈希函数在数组中找到一个新的位置。这个过程将继续,直到所有数据都成功插入数组,或者直到达到最大迭代次数为止。上面给出了一个例子。这里两个哈希表T0和T1用于存储哈希数据。值A被散列并插入到T0中,但是由于B已经占据了这个位置,然后将其逐出,并试图将其插入到T1中,这个过程将重复,直到插入所有值或重新散列以避免循环插入。这个过程可以避免碰撞,对生产模型的性能有重要影响。

为了完成他们的embedding系统设计,研究人员添加了一些附加功能来进一步优化过程,特别是减少哈希所需要的内存需求:

  • 用于过滤hashmap中的id的概率过滤器。由于一个重要的观察是,在来自TikTok id的数据中,id是长尾分布的,热门id可能出现数百万次,而不受欢迎的id出现不超过10次,因此可以合理地假设它们不会影响最终的模型质量,因此可以清除。

  • 一个ID存在计时器,控制旧ID和过期ID的删除。这可能是由于用户不再活跃,或短视频过时。为这些id存储嵌入不能以任何方式帮助模型,因此清除内存是明智的。

在线训练

现在,由于我们已经了解了数据在模型中是如何表示的,我们需要了解如何训练和更新数据。Monolith在线训练的系统架构的总体示意图如下:

它看起来很复杂,但实际上,它都围绕着一个非常简单的过程,这个过程是更大架构的基础,推动了整个训练系统架构的核心。

TensorFlow的分布式Worker-ParameterServer(或简称PS)模型是以分布式方式训练机器学习模型的一种方式,其中多台机器(或一台机器上的进程)一起工作来训练模型,如下图所示:

在这个模型中,有两种类型的进程:工作进程和参数服务器进程。

  • 工作进程负责执行训练模型所需的计算,例如计算梯度或更新模型参数。
  • 参数服务器负责存储模型的当前状态,例如模型权重或偏差。

训练分为批量训练和在线训练两个阶段:

  • 批量训练阶段。 该阶段的工作原理如下:在每个训练步骤中,训练工作者从存储中读取一个小批量的训练样例,向PS请求参数,计算向前和向后传递,最后将更新后的参数推入训练PS。当需要修改模型架构并重新训练模型时,批量训练对于训练历史数据非常有用;

  • 在线训练阶段。 模型部署到在线服务后,训练不会停止,而是进入在线训练阶段。训练工作者不再从存储中读取小批量示例,而是实时地使用实时数据并更新训练PS,训练PS定期将其参数同步到服务PS,这将立即在用户端生效。

Streaming引擎

为了确保Monolith能够在批量训练和在线训练之间无缝切换,它使用了一个Streaming引擎组件:

为了收集实时用户反馈,研究团队使用Kafka队列,其中一个队列记录用户操作(点击,点赞等),另一个队列记录来自模型服务器的功能。然后使用Apache Flink joiner连接两个,这些打包的数据被转换成训练数据,然后由另一个Kafka队列读取,这些训练示例用于批处理训练和在线训练:

  • 在批量训练过程中,Kafka队列中的数据被转储到Hadoop分布式文件存储(HDFS)中,在积累了一定数量的训练数据后,再发送给训练工作者

    -在线训练的过程更简单:数据直接从Kafka队列中读取

训练操作完成后,PS收集参数,并根据选定的同步计划更新服务PS,而服务PS又更新用户端的模型。

在线 Joiner

Joiner 过程实际上有点复杂,我们应该注意一些事情:

内存缓存和KV(Key-Value)存储,是两个有助于稳定用户操作和来自服务器的功能之间的延迟的组件,这是因为它们都到达,而不考虑彼此的到达时间,因此需要缓存来正确地配对它们。但是如果用户需要很长时间才能完成一个操作呢? 那么缓存就不是一个好主意,因此一些值存储在磁盘上,以便再次配对。当用户操作日志到达时,它首先查找内存中的缓存,然后查找键值存储,以防缺少缓存。

还要注意最后一步,即 负例采样(Negative Sampling)。因为在训练过程中有积极和消极的例子。在推荐系统中,正例是用户喜欢或表现出兴趣的项目,而负例是用户不喜欢或表现出兴趣的项目。但是它们的数量可能是不平衡的,因此纠正数据集中的这种偏差是很重要的。

就是这样。你已经了解了Monolith中的所有组件。现在是最后一个部分,研究人员证明了在线学习的有效性。

实时学习

在这里,团队还比较了模型,在不同同步时间间隔下的性能,以验证其性能:

正如我们在上面看到的,在线训练,对于具有动态反馈的推荐系统拥有更好的性能,是至关重要的。

写在最后

感谢阅读我对TikTok实时推荐系统工作原理的深入研究。

我希望你觉得有趣,并学到了一点新的东西。

原文https://www.shaped.ai/blog/the-secret-sauce-of-tik-toks-recommendations

论文:Monolith:带有无碰撞嵌入表的实时推荐系统,https://arxiv.org/pdf/2209.07663.pdf

TikTok 推荐引擎强大的秘密的更多相关文章

  1. AI时代:推荐引擎正在塑造人类

    We shape our tools and afterwards our tools shape us. ------Marshall McLuhan 麦克卢汉说:"我们塑造了工具,反过来 ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维

    关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...

  3. 机器学习 101 Mahout 简介 建立一个推荐引擎 使用 Mahout 实现集群 使用 Mahout 实现内容分类 结束语 下载资源

      机器学习 101 Mahout 简介 建立一个推荐引擎 使用 Mahout 实现集群 使用 Mahout 实现内容分类 结束语 下载资源 相关主题   在信息时代,公司和个人的成功越来越依赖于迅速 ...

  4. 从源代码剖析Mahout推荐引擎

    转载自:http://blog.fens.me/mahout-recommend-engine/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pi ...

  5. 基于Azure构建PredictionIO和Spark的推荐引擎服务

    基于Azure构建PredictionIO和Spark的推荐引擎服务 1. 在Azure构建Ubuntu 16.04虚拟机 假设前提条件您已有 Azure 帐号,登陆 Azure https://po ...

  6. [转] 基于 Apache Mahout 构建社会化推荐引擎

    来源:http://www.ibm.com/developerworks/cn/java/j-lo-mahout/index.html 推荐引擎简介 推荐引擎利用特殊的信息过滤(IF,Informat ...

  7. 基于Spark ALS构建商品推荐引擎

    基于Spark ALS构建商品推荐引擎   一般来讲,推荐引擎试图对用户与某类物品之间的联系建模,其想法是预测人们可能喜好的物品并通过探索物品之间的联系来辅助这个过程,让用户能更快速.更准确的获得所需 ...

  8. JVM调优(这里主要是针对优化基于分布式Mahout的推荐引擎)

    优化推荐系统的JVM关键参数 -Xmx 设定Java允许使用的最大堆空间.例如-Xmx512m表示堆空间上限为512MB -server 现代JVM有两个重要标志:-client和-server,分别 ...

  9. 基于lucene实现自己的推荐引擎

    基于lucene实现自己的推荐引擎 推荐常用算法之-基于内容的推荐 推荐算法

  10. 转】从源代码剖析Mahout推荐引擎

    原博文出自于: http://blog.fens.me/mahout-recommend-engine/ 感谢! 从源代码剖析Mahout推荐引擎 Hadoop家族系列文章,主要介绍Hadoop家族产 ...

随机推荐

  1. 【每日一题】【链表or双指针循环条件】2022年2月26日-NC96 判断一个链表是否为回文结构

    描述给定一个链表,请判断该链表是否为回文结构.回文是指该字符串正序逆序完全一致. 思路: public boolean isPail (ListNode head) { ListNode node = ...

  2. dotnet new cli 以及Abp-cli命令的简单使用

    1:要求 首先dotnet new  需要 .NET Core 3.1 SDK 以及更高版本 dotnet new - 根据指定的模板,创建新的项目.配置文件或解决方案 2:变化 从 .NET 7 S ...

  3. python安装清华源

    pip install pip -Upip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple# "pi ...

  4. Spring 6 源码编译和高效阅读源码技巧分享

    一. 前言 Spring Boot 3 RELEASE版本于 2022年11月24日 正式发布,相信已经有不少同学开始准备新版本的学习了,不过目前还不建议在实际项目中做升级,毕竟还有很多框架和中间件没 ...

  5. MySQL存储 pymysql模块

    目录 pymysql模块 基本使用 cursor=pymysql.cursors.DictCursor 获取数据 fetchall 移动光标 scroll 增删改二次确认 commit autocom ...

  6. VS2019发布至远程IIS部署流程

    服务器部署 传统的开发将项目发布至本地桌面之后,复制至站点目录或通过FTP上传站点目录,有点小麻烦,通过开发工具VS2019本身集成的功能,可以一步到发布到远程IIS站点. 条件: VS系列发工具,例 ...

  7. Vm无法连接到虚拟机,请确保您有权限运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录,未能将管道连接到虚拟机:所有的管道范例都在使用中解决方法

    可能是杀掉进程导致 解决办法: 1.首先杀掉所有VM打头的任务. 2.删掉所有lck文件 3.VM文件夹内有一串很长的数字命名的文件夹或文件,删掉 4.发现被VMware-vmx.exe占用 5.打开 ...

  8. java中的杨辉三角

    本文主要介绍如何打印杨辉三角(直角三角形),如下图所示: 规律如下: 第一行全为1,对角线元素全为1,设i表示行标,j表示列标. arr[i][0] = 1; arr[i][i] = 1; 当i &g ...

  9. 5、基于EasyExcel的导入导出

    一.Apach POI处理Excel的方式: 传统Excel操作或者解析都是利用Apach POI进行操作,POI中处理Excel有以下几种方式: 1.HSSFWorkbook: HSSFWorkbo ...

  10. 网络监测工具之Zabbix的搭建与测试方法(一)

    简介 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案,它能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...