11 | 召回层:如何快速又准确地筛选掉不相关物品?
11 | 召回层:如何快速又准确地筛选掉不相关物品?
讲述:王喆
时长11:40大小10.66M
召回层和排序层的功能特点
如何理解“单策略召回”方法?
如何理解“多路召回”方法
基于 Embedding 的召回方法
小结
课后思考
赞 29
提建议
精选留言(47)
- 邓生2020-11-26关于使用embedding进行召回,其实我搞不懂为什么是用户和物品的embedding计算相似度,不应该是物品跟物品进行相似度计算,用户跟用户之间进行相似度计算吗?为什么物品和人之间可以直接进行embedding相似度计算,这在逻辑上想不通。
作者回复: 因为这里user的embedding是通过把历史观看物品进行average得到的,所以他们在一个向量空间内,可以直接进行相似度计算。
共 6 条评论50 - Geek_63ee392020-10-28请教老师一个问题,文中提到: “多路召回中使用的“兴趣标签”“热门度”“流行趋势”“物品属性”等信息都可以作为 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
32 - gallup2020-11-12请问老师,多路召回中,topk除了根据经验值确定,业界通用的是怎么确定k得大小呢
作者回复: 在系统延迟允许的情况下,其实k取的越大越好。 一般来说,如果最后的推荐结果需要n条,k取5-10n是比较合适的。
共 2 条评论26 - 萬里長空2020-10-29老师,关于EGES的训练,试了下,由于电商领域商品维度非常大,即使hash后也很大,这导致训练非常慢,这个一般怎么解决啊?
作者回复: 非常好的业界实践的问题。其实方法无非是我们提到过的几种。 1、把商品embedding进行预训练,再跟其他side information特征一起输入EGES。 2、像你说的hash方法 3、商品的聚类后输入,比如非常类似的商品,可以用一个商品id替代,当作一个商品来处理。这个方法airbnb embedding的论文讲的非常好。
23 - Jerome2020-11-17请问下老师,在生成用户embedding的过程中我看你的逻辑是将该用户所有观看电影的embedding通过拉链进行叠加后最终生成,请问这种方法有什么根据吗或者说是原理呢,还是说这个是基于经验呢?
作者回复: 这是最常用最简单的user embedding生成方法。之前我们说过embedding之间是可以进行运算的。所以用用户喜欢的物品的embedding平均去代表这个用户是非常直观且实用的。
共 4 条评论13 - Geek_seven2021-08-14请问老师,在业界中,通常的做法是会将embedding召回替换掉多路召回,还是会将embedding召回作为多路召回中一路召回呢?谢谢~
作者回复: 后者
共 2 条评论13 - 王宁2020-11-10老师,你好,我看了您推荐给其他同学的阿里的EGES算法的论文,那个论文里面的EGES模型图的最底层是Sparse feature,论文中是说这一层是比较倾向于用one- hot编码的,不管side information的one-hot编码,一般item的数量会很多很多,对item本身的向量表示直接用one-hot的话,那embedding matrix是不是会很大,这样是合适的吗?我不确定自己是不是看懂了,希望老师可以帮我解答一下,谢谢老师!
作者回复: 是的,one-hot特征肯定会让embedding matrix很大,但就是这样使用的,因为我们就是想求解每一个维度上对应item的embedding。 这也就是为什么说embedding层是神经网络中最耗时的部分的原因。
10 - Geek_e0d66a2020-10-29请问老师,如果基于兴趣标签做召回,同一个物品,有多个标签,而用户也计算了出了多个兴趣标签,那么怎么做用户的多兴趣标签与物品的最优匹配呢?还有物品的标签有多层,那么怎么利用上一层的标签呢?
作者回复: 这是个好问题。简单的做法是把兴趣标签转换成multihot向量,然后就可以计算出用户和物品的相似度了。 复杂一点也可以计算每个兴趣标签的tfidf,为标签分配权重后,再转换成multihot向量。 如果标签有多层,也不妨碍把多层标签全部放到multihot向量中,高层标签的权重可以适当降低。这也是思路之一。 希望你自己也能有类似的思考。
共 5 条评论10 - Geek_63ee392020-10-29课后思考1: 1. 在类SimilarMovieProcess中实例化一个线程池ThreadPoolExecutor作为静态成员变量 2. 方法multipleRetrievalCandidates中的候选集candidateMap使用ConcurrentHashMap替代HashMap 3. 风格类型、高分评价、最新上映三种召回的过程使用线程池实例(共三个线程)去执行 4. 判断三个线程执行完后返回结果 不知道这种方式有没有不足?展开
作者回复: 基本就是这样的思路,生产环境中要做好线程池的维护和一些参数的调优。 可以的话欢迎提交多线程版本的pull request到SparrowRecsys项目
9 - 大钰儿2020-11-02如果新item特别多(每秒可能几十到上百)对item展示的实时性要求较高(小于五分钟就需要曝光)这些item的embedding该如何更新呢?
作者回复: 这还是冷启动问题,我之前有过类似的回复,可以参考。 另外其实我不建议如此多的新item还采用embedding的方案,没有必要,可以考虑在重排层加入这些新鲜的item。用一些基本的特征参与重排,简单模型虽然传统,但在特殊的场景下也经常采用。
7 - 那时刻2020-10-29请问老师,多路召回中使用的“兴趣标签”“热门度”“流行趋势”“物品属性”等信息都可以作为 Embedding 方法中的附加信息,这些附加信息可以设置各自权重么?
作者回复: 一般是把他们作为特征输入模型参与训练,让模型去决定他们的权重。模型的输出就是embedding向量。
5 - Van2021-08-24老师您好。基于您讲的Embedding的召回方法 我又做了一些额外的研究,看到业界目前有两类方法: 1. i2i召回 比如用咱们前面讲item2vec得到item的embedding然后去做召回 2. u2i召回 用咱们后面讲的比如双塔模型同时得到user和item的embdding然后直接做内积找近似 想知道这两种方法哪种更好一些(个人猜测u2i)?最近我们组想要做这个 不知道老师您更建议从哪个模型开始着手(e.g. youtube的DNN)? (我知道一定是因数据和公司情况而异的 但想从老师的经验出发了解一下如果想做召回 从哪个模型开始 是比较好的)谢谢老师!展开
作者回复: 他们本质上其实没有太大区别,u2i召回可以认为是i2i召回的一个聚合,因为user emb往往是通过TA交互的items生成的。一般来说肯定是u2i的召回效果会好一些。
4 - Four y2020-10-29老师,我看到您的实现中召回层在对所有的电影做了相似度计算后进行了排序,再选出Topk给排序层. 这里为什么是这样操作呢?我想,对于召回层我们不可以直接对结果进行Topk算法吗? 如果是用排序的话,那么主要的计算量不就在第三步而不是第二步了吗?
作者回复: 哈哈,非常好的点,TopK显然是时间复杂度更优的选择。可以提交一个pull request到项目中吗?集体的力量显然比我大多了。
共 2 条评论4 - 陈威洋2020-12-14老师,您好!我是推荐系统小白,请问作为推荐系统工程师,要认真做好AB测试吗?
作者回复: 要的,这是工作中非常重要的组成部分,后续有专门讲AB测试的课程,推荐继续学习。
共 2 条评论3 - 小匚2020-11-04老师这种Embedding特征的方法是不是叫表征学习了?也可以用深度学习的模型来输出这个Embedding
作者回复: 是这样。理论上可以用任何深度学习模型来生成,只要输出是一个向量。
3 - 郭翊麟2021-05-07王老师您好 阅读这一节的源码是发现 您在文中写的 etrievalCandidatesByEmbedding(User user) 方法 并没有找到 取而代之的是 retrievalCandidatesByEmbedding(Movie movie, int size) 按我理解 一个是针对 user Embedding计算 movie的相似度 一个是针对 当前movie Embedding 计算与movie的相似度 替换对象的原因是工程上的考虑 还是单纯的 用user Embedding效果不好呢? 感谢老师的解答啦!!!
作者回复: 哦,这两种方法其实都可以,不要过多解读。这只是一份示例代码,具体的效果大家要自己去验证去探索。
2 - Ethan2020-12-07请问老师,系列中哪些部分是排序层?以及召回和排序两步如何打通?没有看到相关内容,有点迷糊
作者回复: 建议先往下学,把所有代码都熟悉了,会更好的熟悉项目的整体架构。之后有问题还可以留言提问。
2 - 浣熊当家2020-10-28还是得麻烦问一下老师,文中的三段代码可以在Maven项目的哪个模块下找到? 我没找到有关于retriveval相关名字的模块
作者回复: 要善用IDE的搜索功能,我在项目中函数名跟文中的都是一致的,不可能找不到。
共 3 条评论2 - ulysses2021-09-12老师你好,请问一下你这个算法召回的模型的结果应该没有应用在这个线上的project吧?因为我并没有找到调用SimilarMovieProcess 这个class 的方法。可以解释一下吗?
作者回复: 线上用哪种召回方法自己尝试就可以了。目前的整个流程只是为给出一个示例
共 2 条评论1 - icode2021-02-26老师,在此之前的课程获取embedding是通过序列化的item或者随机游走的item来生成训练样本 从而获取item对应的embedding,我理解这都是item单侧的生成embedding方式,所以最终生成的embedding通过计算余弦距离等方式来计算item之间的相似度;在本节课中讲解的是召回层,那么需要考虑到user和item的对应的embedding的相似性,请问采用何种方式训练可以让user侧的embedding和item侧的embedding有可比性呢? 有什么paper推荐呢?谢谢老师解答展开
作者回复: 如果还没学习到推荐模型篇的话,建议再往后学习。有大量模型是同时生成item和user embedding的,特别典型的是双塔模型。
1