深度学习推荐系统实战
王喆
Roku 推荐系统架构负责人,前 hulu 高级研究员,《深度学习推荐系统》作者
33298 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
深度学习推荐系统实战
15
15
1.0x
00:00/00:00
登录|注册

11 | 召回层:如何快速又准确地筛选掉不相关物品?

提升计算Embedding相似度的速度
实现多线程版本的多路召回策略
例子:基于Embedding的电影召回方法
优势:融合多种策略、连续性评分、简单的在线服务计算
利用物品和用户Embedding相似性来构建召回层
例子:电影推荐中的多路召回策略
采用不同的策略、特征或简单模型分别召回一部分候选集,然后混合在一起供后续排序模型使用
例子:电影推荐中的单策略召回
制定一条规则或利用简单模型快速召回可能的相关物品
缩小候选集
快速、准确地过滤出相关物品
思考
基于Embedding的召回
多路召回
单策略召回
功能特点
推荐系统召回层

该思维导图由 AI 生成,仅供参考

你好,我是王喆。今天,我们来一起学习推荐系统中非常重要的一个模块,召回层。
为了弄清楚召回层是什么,我们先试着解决一下这个问题:如果你是一名快手的推荐工程师,你的任务是从 500 万个候选短视频中,为一名用户推荐 10 个他最感兴趣的。你会怎么做?
我想最直接最暴力的做法,就是对这 500 万个短视频挨个打分、排序,取出得分最高的 10 个推荐给用户。如果这个打分的算法非常靠谱的话,我们肯定能够选出用户最感兴趣的 Top 10 视频。但这个过程会涉及一个非常棘手的工程问题:如果利用比较复杂的推荐模型,特别是深度学习推荐模型,对 500 万个短视频打分,这个过程是非常消耗计算资源的。
而且你要知道,这还只是计算了一个用户的推荐结果,在工业级的线上服务中,每秒可是有几十万甚至上百万的用户同时请求服务器,逐个候选视频打分产生的计算量,是任何集群都承受不了的。
在推荐物品候选集规模非常大的时候,我们该如何快速又准确地筛选掉不相关物品,从而节约排序时所消耗的计算资源呢?这其实就是推荐系统召回层要解决的问题。今天,我就从三个召回层技术方案入手,带你一起来解决这个问题。

召回层和排序层的功能特点

在前面的课程中我提到过学习推荐系统的一个主要原则,那就是“深入细节,不忘整体”。对于召回层,我们也应该清楚它在推荐系统架构中的位置。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

推荐系统中的召回层是如何快速又准确地筛选掉不相关物品的?本文介绍了推荐系统中召回层的重要性以及其功能特点。召回层通过快速、准确地过滤出相关物品,缩小候选集,为排序层提供精准的推荐列表排序。文章从单策略召回方法入手,介绍了通过制定一条规则或利用简单模型来快速召回可能的相关物品。虽然单策略召回简单直观且计算速度快,但其局限性在于难以满足用户多元的兴趣需求。文章还提到了召回层和排序层的功能特点,以及召回层设计中需要平衡计算速度和召回率的矛盾。文章还介绍了多路召回策略和基于Embedding的召回方法。多路召回策略通过采用不同的策略、特征或简单模型,分别召回一部分候选集,然后混合候选集供后续排序模型使用,权衡了计算速度和召回率。而基于Embedding的召回方法利用物品和用户Embedding相似性来构建召回层,融合了多种策略,具有连续性评分和简单的在线服务计算。整体而言,本文通过介绍召回层的功能特点和不同的召回方法,帮助读者了解了推荐系统中召回层的重要性和工作原理。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深度学习推荐系统实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(47)

  • 最新
  • 精选
  • 邓生
    关于使用embedding进行召回,其实我搞不懂为什么是用户和物品的embedding计算相似度,不应该是物品跟物品进行相似度计算,用户跟用户之间进行相似度计算吗?为什么物品和人之间可以直接进行embedding相似度计算,这在逻辑上想不通。

    作者回复: 因为这里user的embedding是通过把历史观看物品进行average得到的,所以他们在一个向量空间内,可以直接进行相似度计算。

    2020-11-26
    6
    57
  • Geek_63ee39
    请教老师一个问题,文中提到: “多路召回中使用的“兴趣标签”“热门度”“流行趋势”“物品属性”等信息都可以作为 Embedding 方法中的附加信息(Side information),融合进最终的 Embedding 向量中” 我想有两种实现方式: 1. 对于用户高评分(大于3.5)的电影序列,通过item2vec得到每个物品的embedding向量(假设长度为10),并在向量第11位添加物品的兴趣标签,第12位添加物品热门度,依次类推。 2. 不采用item2vec,而是其他某种方式将物品所有维度的信息(包括“兴趣标签”“热门度”“流行趋势”“物品属性”等)统一地进行embedding。 对于第一种方式,每一个维度的附加信息权重相同,这是否合理?另外对于电影类型这种类别型特征,采用multi-hot编码附加到embedding向量后面,是否合理。 对于第二种方式,我还不知道怎样实现。 请问老师,实际生产中较好的实现方式是怎样的呢?

    作者回复: 生产环境中一般不使用第一种方法。第二种方法可以参考阿里的EGES,大致的思路是把这些原始特征作为输入向量,用隐层的输出作为物品的embedding。 有兴趣的话可以阅读下面的论文原文。 https://github.com/wzhe06/Reco-papers/blob/master/Embedding/%5BAlibaba%20Embedding%5D%20Billion-scale%20Commodity%20Embedding%20for%20E-commerce%20Recommendation%20in%20Alibaba%20%28Alibaba%202018%29.pdf

    2020-10-28
    34
  • gallup
    请问老师,多路召回中,topk除了根据经验值确定,业界通用的是怎么确定k得大小呢

    作者回复: 在系统延迟允许的情况下,其实k取的越大越好。 一般来说,如果最后的推荐结果需要n条,k取5-10n是比较合适的。

    2020-11-12
    2
    29
  • 萬里長空
    老师,关于EGES的训练,试了下,由于电商领域商品维度非常大,即使hash后也很大,这导致训练非常慢,这个一般怎么解决啊?

    作者回复: 非常好的业界实践的问题。其实方法无非是我们提到过的几种。 1、把商品embedding进行预训练,再跟其他side information特征一起输入EGES。 2、像你说的hash方法 3、商品的聚类后输入,比如非常类似的商品,可以用一个商品id替代,当作一个商品来处理。这个方法airbnb embedding的论文讲的非常好。

    2020-10-29
    23
  • Geek_seven
    请问老师,在业界中,通常的做法是会将embedding召回替换掉多路召回,还是会将embedding召回作为多路召回中一路召回呢?谢谢~

    作者回复: 后者

    2021-08-14
    2
    15
  • Jerome
    请问下老师,在生成用户embedding的过程中我看你的逻辑是将该用户所有观看电影的embedding通过拉链进行叠加后最终生成,请问这种方法有什么根据吗或者说是原理呢,还是说这个是基于经验呢?

    作者回复: 这是最常用最简单的user embedding生成方法。之前我们说过embedding之间是可以进行运算的。所以用用户喜欢的物品的embedding平均去代表这个用户是非常直观且实用的。

    2020-11-17
    4
    14
  • 王宁
    老师,你好,我看了您推荐给其他同学的阿里的EGES算法的论文,那个论文里面的EGES模型图的最底层是Sparse feature,论文中是说这一层是比较倾向于用one- hot编码的,不管side information的one-hot编码,一般item的数量会很多很多,对item本身的向量表示直接用one-hot的话,那embedding matrix是不是会很大,这样是合适的吗?我不确定自己是不是看懂了,希望老师可以帮我解答一下,谢谢老师!

    作者回复: 是的,one-hot特征肯定会让embedding matrix很大,但就是这样使用的,因为我们就是想求解每一个维度上对应item的embedding。 这也就是为什么说embedding层是神经网络中最耗时的部分的原因。

    2020-11-10
    10
  • Geek_e0d66a
    请问老师,如果基于兴趣标签做召回,同一个物品,有多个标签,而用户也计算了出了多个兴趣标签,那么怎么做用户的多兴趣标签与物品的最优匹配呢?还有物品的标签有多层,那么怎么利用上一层的标签呢?

    作者回复: 这是个好问题。简单的做法是把兴趣标签转换成multihot向量,然后就可以计算出用户和物品的相似度了。 复杂一点也可以计算每个兴趣标签的tfidf,为标签分配权重后,再转换成multihot向量。 如果标签有多层,也不妨碍把多层标签全部放到multihot向量中,高层标签的权重可以适当降低。这也是思路之一。 希望你自己也能有类似的思考。

    2020-10-29
    5
    10
  • Geek_63ee39
    课后思考1: 1. 在类SimilarMovieProcess中实例化一个线程池ThreadPoolExecutor作为静态成员变量 2. 方法multipleRetrievalCandidates中的候选集candidateMap使用ConcurrentHashMap替代HashMap 3. 风格类型、高分评价、最新上映三种召回的过程使用线程池实例(共三个线程)去执行 4. 判断三个线程执行完后返回结果 不知道这种方式有没有不足?

    作者回复: 基本就是这样的思路,生产环境中要做好线程池的维护和一些参数的调优。 可以的话欢迎提交多线程版本的pull request到SparrowRecsys项目

    2020-10-29
    9
  • 大钰儿
    如果新item特别多(每秒可能几十到上百)对item展示的实时性要求较高(小于五分钟就需要曝光)这些item的embedding该如何更新呢?

    作者回复: 这还是冷启动问题,我之前有过类似的回复,可以参考。 另外其实我不建议如此多的新item还采用embedding的方案,没有必要,可以考虑在重排层加入这些新鲜的item。用一些基本的特征参与重排,简单模型虽然传统,但在特殊的场景下也经常采用。

    2020-11-02
    8
收起评论
显示
设置
留言
47
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部