深度学习推荐系统实战
王喆
Roku推荐系统架构负责人,前hulu高级研究员,《深度学习推荐系统》作者
立即订阅
5357 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从0开始搭建一个深度学习推荐系统
免费
基础架构篇 (5讲)
01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?
02 | Sparrow RecSys:我们要实现什么样的推荐系统?
03 | 深度学习基础:你打牢深度学习知识的地基了吗?
国庆策划 | 关于深度学习推荐系统,我有这些资料想推荐给你
国庆策划 | 深度学习推荐系统基础,你掌握了多少?
特征工程篇 (6讲)
04 | 特征工程:推荐系统有哪些可供利用的特征?
05 | 特征处理:如何利用Spark解决特征处理问题?
06 | Embedding基础:所有人都在谈的Embedding技术到底是什么?
07 | Embedding进阶:如何利用图结构数据生成Graph Embedding?
08 | Embedding实战:如何使用Spark生成Item2vec和Graph Embedding?
答疑 | 基础架构篇+特征工程篇常见问题解答
线上服务篇 (7讲)
09 | 线上服务:如何在线上提供高并发的推荐服务?
10 | 存储模块:如何用Redis解决推荐系统特征的存储问题?
11 | 召回层:如何快速又准确地筛选掉不相关物品?
12 | 局部敏感哈希:如何在常数时间内搜索Embedding最近邻?
13 | 模型服务:怎样把你的离线模型部署到线上?
14 | 融会贯通:Sparrow RecSys中的电影相似推荐功能是如何实现的?
答疑 | 线上服务篇留言问题详解
推荐模型篇 (12讲)
15 | 协同过滤:最经典的推荐模型,我们应该掌握什么?
16 | 深度学习革命:深度学习推荐模型发展的整体脉络是怎样的?
模型实战准备(一) | TensorFlow入门和环境配置
模型实战准备(二) | 模型特征、训练样本的处理
17 | Embedding+MLP:如何用TensorFlow实现经典的深度学习模型?
18|Wide&Deep:怎样让你的模型既有想象力又有记忆力?
19|NeuralCF:如何用深度学习改造协同过滤?
20 | DeepFM:如何让你的模型更好地处理特征交叉?
21|注意力机制、兴趣演化:推荐系统如何抓住用户的心?
22|强化学习:让推荐系统像智能机器人一样自主学习
特别加餐 | “银弹”不可靠,最优的模型结构该怎么找?
23| 实战:如何用深度学习模型实现Sparrow RecSys的个性化推荐功能?
模型评估篇 (5讲)
24 | 离线评估:常用的推荐系统离线评估方法有哪些?
25 | 评估指标:我们可以用哪些指标来衡量模型的好坏?
特别加餐|TensorFlow的模型离线评估实践怎么做?
26 | 在线测试:如何在推荐服务器内部实现A/B测试?
27 | 评估体系:如何解决A/B测试资源紧张的窘境?
前沿拓展篇 (6讲)
28 | 业界经典:YouTube深度学习推荐系统的经典架构长什么样?
29 | 图神经网络:Pinterest是如何应用图神经网络的?
30 | 流处理平台:Flink是如何快速识别用户兴趣,实现实时推荐的?
31|模型迭代:阿里巴巴是如何迭代更新推荐模型的?
32 | 强化学习案例:美团是如何在推荐系统中落地强化学习的?
33|技术权衡:解决方案这么多,哪个最合适?
结束语 (2讲)
结束语|深度学习时代需要什么样的推荐工程师?
免费
期末考试 | “深度学习推荐系统”100分试卷等你来挑战!
深度学习推荐系统实战
15
15
1.0x
00:00/00:00
登录|注册

12 | 局部敏感哈希:如何在常数时间内搜索Embedding最近邻?

王喆 2020-10-30
你好,我是王喆。
在深度学习推荐系统中,我们经常采用 Embedding 召回这一准确又便捷的方法。但是,在面对百万甚至更高量级的候选集时,线性地逐一计算 Embedding 间的相似度,往往会造成极大的服务延迟。
这个时候,我们要解决的问题就是,如何快速找到与一个 Embedding 最相似的 Embedding?这直接决定了召回层的执行速度,进而会影响推荐服务器的响应延迟。
今天,我们就一起来学习一下业界解决近似 Embedding 搜索的主要方法,局部敏感哈希。

推荐系统中的“快速”Embedding 最近邻搜索问题

在深度学习推荐系统中,我们经常会使用 Embedding 方法对物品和用户进行向量化。在训练物品和用户的 Embedding 向量时,如果二者的 Embedding 在同一个向量空间内(如图 1),我们就可以通过内积、余弦、欧式距离等相似度计算方法,来计算它们之间的相似度,从而通过用户 - 物品相似度进行个性化推荐,或者通过物品 - 物品相似度进行相似物品查找。
图1 用户和电影的Embedding向量空间
假设,用户和物品的 Embeding 都在一个 维的 Embedding 空间中,物品总数为 ,那么遍历计算一个用户和所有物品向量相似度的时间复杂度是多少呢?不难算出是 。虽然这一复杂度是线性的,但物品总数 达到百万甚至千万量级时,线性的时间复杂度也是线上服务不能承受的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深度学习推荐系统实战》,如需阅读全部文章,
请订阅文章所属专栏
立即订阅
登录 后留言

精选留言(19)

  • Dikiwi
    b 是 0 到 w 间的一个均匀分布随机变量,避免分桶边界固化。这是什么意思呢?是说可以通过调整b来形成另外一个一个hash函数?

    作者回复: 这是个好问题,推荐其他同学也关注。

    因为如果总是固定边界,很容易让边界两边非常接近的点总是被分到两个桶里。这是我们不想看到的。

    所以随机调整b,生成多个hash函数,并且采用或的方式组合,就可以一定程度避免这些边界点的问题。

    2020-11-01
    14
  • 浣熊当家
    请问老师关于这句话 “在训练物品和用户的 Embedding 向量时,如果二者的 Embedding 在同一个向量空间内”, 我们在之前6-7节embedding的中,讲了怎么把物品序列信息转化为embedding, 想知道,用户的embedding是怎么生成的呢? 然后,物品和用户在同一个向量空间,这个是怎么得到的呢?

    作者回复: 好问题。在咱们的项目里,用户embedding就是通过平均这个用户评论过的高分电影的embedding得到的。
    所以他们肯定是在一个向量空间里。

    只要是利用用户历史的item embedding生成的用户embedding,可以说都是在一个向量空间内,这些生成方式包括但不限于average pooling,sum pooling,attention等等。

    2020-10-31
    4
  • 那时刻
    请问老师局部敏感哈希里的minhash和simhash是否有应用呢?

    作者回复: 这是个好问题,但我觉得自己思考不难得出结论。minhash和simhash主要用在文档去重这样的场景,你觉得能不能把minhash和simhash应用在embedding的分桶过程中?如果可以的话,应用过程是什么呢?

    2020-10-30
    4
  • kaijien
    老师您好,您提到点数越多越应该增加桶的个数,还有Embedding维度越大越应该增加哈希函数并多用且的方式,那从您的经验上:
    1 每个桶维持多少个点比较好?
    2 Embedding一般多少算大?比如768维是否应该用且的方式?应该用多少哈希函数比较好?

    作者回复: 1、每个桶取多少点跟你在线上想寻找top N的规模有关系。比如召回层想召回1000个物品,那么N就是1000,那么桶内点数的规模就维持在1000-5000的级别是比较合适的。当然了点数还跟你想取且还是或,有多少个哈希函数有关系,但基本上需要跟N在一个量级且高于N。

    2、Embedding在实践中其实很少取768那么高的维度,我们训练模型时候的经验是,超过100维后,增加维度的作用就没那么明显了,通常取10-50维就足够了。比如说50维,这其实已经是非常高维的embedding了,我推荐用比较复杂一点的操作,比如取5个哈希函数,同时落在3+个桶里的点作为候选点。

    但还是那句话,要自己观察数据,观察LSH的召回率如何,因为每家的数据都不一样,从别人那得来的经验经常不奏效是很正常的。

    2020-10-31
    4
  • 范闲
    LSH也有自己的问题。数据量太大的时候,hash的个数不好选择,另外存在hash冲突,容易降低召回率。

    同基于树的,基于量化的,基于的图的方法来比,在召回率,速度和内存使用上都不占优势。

    作者回复: 没有magic嘛,各种方法都有优势,适用的数据量也不同。所以facebook在faiss里面其实是融合了多种索引方式,大家有兴趣还是推荐深入去看一下faiss的原理。

    2020-12-02
    2
  • JustBuyIt
    如何精确的控制每个桶内的点的规模是 C?

    作者回复: 很难精确控制每个桶内的规模是C,但能通过控制桶的宽度w,来大概控制桶的规模在C附近。去掉一些噪声点后,如果点的分布比较均匀,那么每个桶的规模就比较稳定。

    2020-11-01
    2
  • Geek_91c50b
    请问,用户的embading和物品embading是通过哪些特征进行处理的,例如性别、年龄?怎样处理成数字的,这一块的代码有在工程里吗?

    作者回复: embedding那几讲跳过了吗?后续推荐模型的课程也会涉及。

    2020-12-02
    1
    1
  • follow-fate
    facebook开源的faiss是不是可以替代LSH了?

    作者回复: 可以。faiss是业界主流解决方案,LSH是它的原理之一,这里LSH主要是为了大家学习原理。

    2020-11-28
    1
    1
  • 想问下老师,关于“在训练物品和用户的向量时,如果二者在同一个向量空间内”,那如果用户的向量空间(比如用户id的embedding向量)和物品的向量不在同一个向量空间该如何处理呢,谢谢老师~

    作者回复: 不在一个向量空间内就没法使用用户和物品之间的LSH的方法,因为他们根本没有近邻关系。

    2020-11-18
    2
    1
  • 马龙流
    Embedding 向量的维度越大,我们越应该增加哈希函数的数量,尽量采用且的方式作为多桶策略;这话怎么理解呢?还有就是faiss这种,里面用到的就是局部哈希原理?

    作者回复: LSH是Faiss index选择的一种,Faiss的详细细节太多,选择也比较多,需要参照开源项目展开学习。

    Embedding向量的维度越大,单个LSH分桶错误的概率就越大,多个分桶联合才更容易找到相似物品。

    2020-11-14
    1
  • haydenlo
    请问对于计算距离,欧几里得距离和余弦距离等应该怎么选择?

    作者回复: 根据你训练embedding时候选择的相似度来确定。

    比如你训练embedding模型时就采用了欧式距离,那么这里就用欧式距离。训练模型时用了内积,这里就用内积。

    2020-11-07
    1
  • 超~~
    你好老师,我clone下来的代码,环境中没有配置scala 时,可以正常启动,但指定scala2. 11后,启动报错Error:scalac: Token not found: /Users/edz/.idea-build/tokens/3200 谷歌也没有找到答案,谢谢

    作者回复: 没有配置scala时能启动是因为online部分不会使用scala代码。

    这个问题确实比较不好复现。不过肯定是scala的问题。我推荐你再安装一遍scala环境,比如换一个2.11的小版本,换一个新的安装路径,看看行不行。

    2020-10-30
    1
    1
  • ALAN
    老师,numhashtable为3,是指使用了3个分桶函数吗?

    作者回复: 是的,所以得到了三个bucketid

    2020-10-30
    1
  • 梁栋💝
    分桶宽度怎么决定的,非常迷惑。
    2021-01-27
  • 梁栋💝
    课后思考:
    1)首先user embedding是基于历史浏览item embedding平均后生成的,这个一般是online实时计算的。
    2)当拿到user embedding后,我们需要离线训练好的LSH model对这个emb向量求出3个分桶。
    3)拿到3个分桶,我们需要召回3个桶内的item embedding到内存,再进行Online计算求最近距离。

    那么难点在于:
    1)冷启动用户没有历史行为,无法用。
    2)LSH model怎么导出到online服务使用。

    作者回复: 过程基本正确。但难点2不太成立,就是把每个item和user emb的桶id存到redis就可以了,或者建立倒排索引,这个过程是比较直接的。

    2021-01-06
    2
  • 杨佳亦
    请问老师,为什么:

    Embedding 向量维度越大,越应增加哈希函数的数量,用“且”分桶;相反,Embedding 向量维度越小,我们越应减少哈希函数的数量,用“或”分桶?

    我的理解是,Embedding维度较大,特征密集不好分,采用多个哈希函数做映射再取交的确可以找到相似的Embedding;Embedding维度较小,特征分散,需要的桶不多,用或可以增加结果数量。

    但是疑虑在于,Embedding大,需要的桶也多,计算量岂不是会变得非常大?

    作者回复: 是这样,Embedding维度大计算量大是肯定的。这本身就是一个tradeoff,有时候,为了线上过程更高效,减少emb的维度也是可以牺牲的选择。一切工程问题都是取舍的问题。

    2020-12-31
  • Alr
    课后思考问题:以item_id作为key, item_id对应的BucketId作为value存储在redis, 再以每个BucketId作为key, item_id作为value存储在redis, 在召回的时候遍历item_id的所有BucketId,获取BucketId对应的item_id就是需要召回的item, 请问老师这个思路对吗

    作者回复: 对的。就是建立倒排索引的思路。

    2020-12-25
    1
  • 。LEAF
    老师好,最后得到 每个电影的 分桶,比如[-2.0], [14.0], [8.0]],相当于再做召回的时候,比如使用“或”策略,就直接再剩余所有电影里找到 在[-2.0], [14.0], [8.0] 3个桶里的电影就可以了吧

    作者回复: 是这样的。

    如果觉得不保险,还可以在临近桶找,这里面还是一个召回率和准确率之间权衡的问题。

    2020-11-19
  • 浣熊当家
    还有个关于局部敏感哈希的问题想问老师, 我的理解是LSH也是通过降维的手段来提高搜索top n个点的时间复杂度的。 那具体的降维是应用了那种算法呢?我尝试着搜了下没有找到更细节的资料,也想请老师或者大家推荐好的学习资料。

    作者回复: 不是特别清楚你的问题,LSH的降维就是通过分桶函数实现的吧?你说的降维是应用了那种算法是什么意思?

    2020-11-01
    3
收起评论
19
返回
顶部