专栏首页QQ大数据团队的专栏神盾推荐系统的超大规模参数学习探究

神盾推荐系统的超大规模参数学习探究

前言

本文介绍我们在推荐系统领域的大规模参数学习研究. 问题的起源是探究给每一个用户学习一个 ID 层级的表征, 而在千万量级的业务上, 学习如此特征将会牵涉到超十亿规模的参数学习. 对此我们根据推荐算法的特点, 实现了一个无需使用参数服务器, 在普通 Spark 能够运行的支持大规模参数学习的 FM 算法, 我们称之为 Elastic Factorization Machines (EFM). 从理论上, EFM 算法能够支持千亿规模的参数训练. 在实践中, 限于资源我们实现了一个十亿级的 EFM 算法, 并在线上对比 FM 取得 PV 点击率 5.0% 的提升.

效果说明

[ QQ 动漫某场景的三天 PV 点击率对比 ]

用户 ID 层级的表征学习

推荐系统中, 用户的表征是一个非常重要的课题, 表征的粒度通常影响推荐算法的个性化程度. 当我们只能用性别的男/女来表征用户的时候, 算法能够给出的只是分群热度推荐. 而当我们能够刻画用户在每一个物品分类的兴趣的时候, 算法的便能够给不同的兴趣群体给出不一样的推荐. 越精细的用户表征, 推荐系统的个性化程度越高.

[ 越精细的用户表征, 推荐系统就越个性化 ]

最精细的用户表征, 是用户 ID. 对每一个用户学习用户兴趣, 能够做到真正的千人千面. 但在实现上, 学习用户 ID 层级的表征通常会遇到计算量的问题, 这里主要的原因是用户 ID 层级特征量级与用户量直接相关, 以千万级用户的业务为例, 如果使用 FM 算法学习用户 ID 特征, 对每一个用户学习维度为 100 维的隐向量, 则整体参数量将会增加到 10亿级. 而如果这个业务的物品更新不快, 物品数能控制在数万规模, 则即便是用 “用户对物品兴趣” 这个用户表征也只需要训练百万级别的参数.

[ 各级别用户表征的特征量级对比 ]

无参数服务器实现大规模参数学习

业界在大规模参数学习的解决方案是使用参数服务器. 背后的核心是分布式训练. 而市面上各个参数服务器在并行策略上也有不一样的划分, 包括下面两种情况:

• 数据并行

o 这种方法是把模型分发到每一个节点做训练, 但如果模型参数量本来就非常大, 将无法支持.

• 数据并行 + 模型按需并行

o 这种方法的初衷是考虑到并不是每一个训练数据块都需要所有的参数, 因此可以统计当前训练数据所需的参数, 并只向参数服务器请求这些参数. 但因为训练数据是随机分布的, 因而可能一个参数会被多个数据块请求, 这会导致较大的网络开销.

而当我们需要给每一个用户 ID 训练表征的时候, 同一个用户 ID 的参数, 应当仅被这个用户创造的样本所需要, 这个参数对应的梯度也只能从这些样本产生. 这意味着我们只需要让训练数据和模型同时做划分(分桶), 就能够让每个用户 ID 参数仅被一个数据块请求. 在这个思想下, 用户 ID 层级的参数可以分布式存储, 从而也不需要一个单点的参数服务器, 可以在普通的 Spark 上实现.

[ 不同类型的大规模参数训练方案对比 ]

整体的实现步骤如下, 用户 ID 层级的参数和训练数据都按照用户 ID 哈希分桶, 每一个参数块都被分发到对应的数据块上做训练. 与此同时其他特征也会被分发到每一个训练数据块上. 因为除开用户 ID 层级参数外, 其他参数(例如 Item ID)量级能够控制在百万以内, 从而可以分发到各个子结点的内存中. 从参数和训练数据中我们可以算得每一个参数的梯度, 而用户 ID 层级参数的梯度也只由这个训练数据块中产生, 从而可以做一个一一对应的分发把梯度推送到对应的参数块. 而其他参数因为量级较小, 可以做一个递归合并然后在内存更新.

[ 无参数服务器实现大规模参数训练方案 ]

实现细节

规模上限

这个实现从理论上能够支持任意量级的用户 ID 层级训练. 但受限于业务资源, 我们最高只测试过十亿级别的模型训练.

算法选择

按理只要是梯度下降法的优化算法都能够利用类似的方法去实现. 这里我们实现了 SGD 和 ADAM 两种方法, 发现 ADAM 算法作为一个自适应学习率的方法, 效果更好. 这两个算法的具体原理, 可以参见文献1.

Spark 大规模参数学习的工程实现

为了训练亿万级别的模型参数, 我们做了大量的优化工作. 其中部分经验来自于作者曾经在图计算上的实践经验, 例如在多次迭代之后应当实现使用 checkpoint 功能进行 RDD 断链保证系统鲁棒性.

线上模型实现

线上服务在实现上与传统的 FM 算法相似, 除了用户 ID 层级外的模型参数都可以存储在共享内存中. 而每一个用户的 ID 层级特征可以写在 K-V 系统中, 为一个用户提供服务的时候只需要请求一次就能够得到对应的参数值. 从而对比起传统的 FM 算法, EFM 算法只额外多一次 K-V 系统请求的开销.

异步更新问题

每天例行模型训练完成之后, EFM 算法在同步模型参数到线上的时候将会遇到异步更新问题. 因为用户 ID 层级特征的参数和其他参数分别存储在不一样的平台, 更新耗时有较大差异, 从而导致在更新途中有些用户的特征将完全无法和其他特征的隐向量有匹配.

为了解决这个问题, 我们引入增量学习技术, 每天例行训练使用前一天的历史参数做热启动, 使得新一天的模型参数与前一天模型的参数在一个类似的向量空间中. 这样当其他特征更新了, 线上使用的旧模型将仍可以与其他特征有相似度匹配.

[ 两类参数的异步更新会导致部分用户的参数无法与其他特征匹配 ]

总结与展望

本文实现了一个支持亿级参数训练的算法, Elastic Factorization Machines (EFM) 算法. 而我们认为可以在 EFM 算法的基础上做更多的事情, 这里列举我们考虑到的点.

• 向量召回

o 可以分别学习出用户和物品的 Embedding, 做向量相似度的召回.

• Model Ensemble:

o 可以在用户 Embedding 的基础上, 用 DNN 做进一步的学习, 增加非线性表达.

参考文献

[1] https://zhuanlan.zhihu.com/p/22252270

本文分享自微信公众号 - 腾讯QQ大数据(qq_bigdata),作者:黄俊,林钊航

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Clickhouse在大数据分析平台-留存分析上的应用

    导语 | 本文实践了对于千万级别的用户,操作总数达万级别,每日几十亿操作流水的留存分析工具秒级别查询的数据构建方案。同时,除了留存分析,对于用户群分析,事件分...

    腾讯QQ大数据
  • Quicksilver快数据处理系统

    | 导语 Quicksilver为神盾推出的一款推荐场景下数据快速处理系统,旨在解决数据如何在分钟级、秒级更新并对接线上。 背景 随着神盾推荐业务场景的不断深...

    腾讯QQ大数据
  • 产品指标体系如何搭建

    做了几个产品的数据工作,对指标体系概念以及规划方法有一定的积累,总结出来作为知识储备。

    腾讯QQ大数据
  • JAVA程序第四期

    小朱在晚间黄金时间准时播报,另外,公众号又来了几位新的管理,所以以后每天的作者和风格可能会有不同哦,先期待一下吧!

    聚沙成塔
  • Python入门学习(六)

    上面函数中, 需要两个参数分别是 x, y. 这两个参数都是必选参数, 缺一不可. pow函数中 x 为底数, y 为指数, 现在我想让指数默认为 2

    py3study
  • 最小化安装Centos6.0之rpm安装LAMP环境

    安装apache httpd-2.2.15-5.el6.centos.i686.rpm   F 提示: error: Failed dependencie...

    苦咖啡
  • #PY小贴士# 函数的默认参数不会每次都新建?

    这里的原因在于,函数的参数默认值,是在一开始定义(也就是 def)的时候所决定的,并不是到执行时才创建。我换一个例子,就看得更明白了:

    Crossin先生
  • 如何获取PHP命令行参数

    使用 PHP 开发的同学多少都会接触过 CLI 命令行。经常会有一些定时任务或者一些脚本直接使用命令行处理会更加的方便,有些时候我们会需要像网页的 GET 、 ...

    硬核项目经理
  • 斗鱼最后的独立财报

    8月10日,斗鱼发布了2020年第二季度财报。虎牙紧跟着在8月11日发布了自己的2020 Q2财报。在腾讯撮合斗鱼虎牙合并有实质性进展的前提下,这可能也是斗鱼和...

    刘旷
  • 今日头条屏幕适配方案终极版正式发布!前言方案对比AndroidAutoSize总结

    我在前面两篇文章中详细介绍了 今日头条适配方案 和 SmallestWidth 限定符适配方案 的原理,并验证了它们的可行性,以及总结了它们各自的优缺点,可以说...

    用户2965681

扫码关注云+社区

领取腾讯云代金券