手把手带你搭建推荐系统
黄鸿波
谷歌开发者专家,知名游戏公司技术专家
3441 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
手把手带你搭建推荐系统
15
15
1.0x
00:00/00:00
登录|注册

22|YouTubeDNN:召回算法的后起之秀(下)

你好,我是黄鸿波。
上节课我们讲了关于 YouTubeDNN 的召回模型,接下来,我们来看看如何用代码来实现它。
我们在做 YouTubeDNN 的时候,要把代码分成两个步骤,第一个步骤是对数据的清洗和处理,第二个步骤是搭建模型然后把数据放进去进行训练和预测。

数据的清洗和处理

先来讲数据部分。
按照 YouTubeDNN 论文来看,输入的数据是用户的信息、视频的 ID 序列、用户搜索的特征和一些地理信息等其他信息。到了基于文章内容的信息流产品中,就变成了用户 ID、年龄、性别、城市、阅读的时间戳再加上视频的 ID。我们把这些内容可以组合成 YouTubeDNN 需要的内容,最后处理成需要的 Embedding。
由于前面没有太多的用户浏览数据,所以我先造了一批数据,数据集我会放到 GitHub 上(后续更新),数据的形式如下。
接下来我们就把这批数据处理成 YouTubeDNN 需要的形式。首先在 recommendation-class 项目中的 utils 目录下建立一个 preprocess.py 文件,作为处理数据的文件。
我们要处理这一批数据,需要下面五个步骤。
加载数据集。
处理数据特征。
特征转化为模型输入。
模型的搭建和训练。
模型评估。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何使用代码实现YouTubeDNN的召回模型。作者首先讲解了数据的清洗和处理过程,包括加载数据集、处理数据特征、特征转化为模型输入等步骤。接着,详细介绍了代码实现的过程,包括生成训练集和测试集以及模型的输入。重点介绍了gen_data_set()和gen_model_input()两个函数的实现细节,以及其在数据处理和模型训练中的作用。通过对这些代码的解释,读者可以快速了解如何使用代码实现YouTubeDNN的召回模型,以及其中涉及的关键步骤和技术特点。文章内容详实,适合对召回算法感兴趣的读者阅读学习。文章中使用了Pandas、sklearn、tensorflow等工具和库,通过对数据的加载、特征编码、数据集构建和模型训练等步骤的解释,读者可以快速了解整个YouTubeDNN召回模型的实现过程。文章还介绍了如何构建用户和物品的特征输入,以及如何使用deepmatch库构建含有DNN的YouTube推荐模型。整体而言,本文通过详细的代码解释和技术讲解,为读者提供了一个全面的YouTubeDNN召回模型实现指南。文章最后还提到了课后题,鼓励读者在留言区与作者交流讨论,以及推荐给朋友一起学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你搭建推荐系统》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 静心
    有两个问题没弄明白,请老师指点: 1、embedding_dim的大小是如何确定的? 2、什么时候用离散特征,什么时候用变长特征?

    作者回复: 在YouTube DNN中,embedding_dim的大小是一个超参数,需要根据具体任务和数据集来确定。以下是一些指导原则: 数据集规模:embedding_dim的大小通常与数据集的大小相关。较大的数据集通常需要更大的embedding_dim,以便模型可以更好地学习数据中的复杂模式。一般来说,embedding_dim的大小可以在一个相对小的范围内进行实验,例如从10到100。 特征维度:embedding_dim的大小还可以根据离散特征的维度来确定。对于具有大量离散特征的数据集,embedding_dim可能需要相对较大,以确保模型可以捕捉到离散特征之间的细微差异。如果离散特征的维度较小,则可以选择较小的embedding_dim。 任务复杂度:embedding_dim的大小还可以根据任务的复杂度来确定。对于较复杂的任务,例如推荐系统中的点击率预测,可能需要更大的embedding_dim来表示更多的信息。对于较简单的任务,例如二分类问题,可以选择较小的embedding_dim。 关于离散特征和变长特征的选择,一般的原则如下: 离散特征:离散特征是指具有有限取值或离散类别的特征,例如性别、国家、城市等。对于离散特征,可以使用embedding来将其映射到低维连续向量空间中。这使得模型能够学习离散特征之间的相关性和交互关系。通常情况下,离散特征需要经过编码(例如独热编码)并与其他特征一起输入到模型中。 变长特征:变长特征是指具有可变长度的特征,例如用户的历史行为序列或商品的标签列表。对于变长特征,可以使用循环神经网络(RNN)或Transformer等模型来建模。这些模型可以处理可变长度的序列,并捕捉序列中的时序关系和上下文信息。 根据任务和数据的特点,可以选择使用离散特征或变长特征,或者二者的组合。在YouTube DNN中,通常会同时使用离散特征和变长特征来丰富模型的表达能力。

    2023-09-11归属地:北京
    1
  • alexliu
    老师,faiss.IndexFlagIP这个应该是faiss.IndexFlatIP吧?另外index.add(n,x)有两个参数,为什么在代码里只有item_embs一个参数? ps:add源码如下: def add(self, n, x): r""" default add uses sa_encode""" return _swigfaiss.IndexFlatCodes_add(self, n, x)

    作者回复: 您是对的,faiss.IndexFlagIP是错误的,应该是faiss.IndexFlatIP。非常抱歉给您带来了困惑。 至于add方法的参数,代码片段中只有item_embs一个参数的可能是因为之前的代码中定义了n的值,将其传递给了add方法。下面是一个可能的例子,用于解释这个情况: import faiss # 创建索引 index = faiss.IndexFlatIP(d) # 假设d是维度大小 # 这里的n表示要添加的向量数量 n = 100 item_embs = ... # 设置待添加的向量 index.add(n, item_embs) 这个例子中,通过将n值传递给add方法,告诉索引要添加的向量数量。它并不是add方法的参数,而是用来限制要添加的向量数量的一个值。add方法的参数应该是表示待添加向量的item_embs。 需要注意的是,代码片段中的add方法与faiss库中的实际实现有所不同,这只是一个示例。实际的add方法可以根据具体的索引类型和实现细节有所区别,您可以查阅faiss官方文档或源码以了解具体的add方法和参数。

    2023-06-07归属地:上海
  • peter
    YoutubeDNN是拿来就能用吗?类似于工具软件那种,不需要开发。

    作者回复: 需要开发,要自己组装特征。

    2023-06-06归属地:北京
  • 爱极客
    老师,后面会出一篇课后答疑的文章吗?

    作者回复: 如果有需要的话,可以的,到时候我和极客时间的工作人员商量一下,看看是以文字的形式还是直播的形式比较好。

    2023-06-06归属地:广东
    2
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部