热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深度兴趣网络DIN

1.概述用户兴趣是推荐系统中非常重要的trigger,在召回阶段,通过召回与用户兴趣相匹配的item,在排序阶段,用户兴趣

1. 概述

用户兴趣是推荐系统中非常重要的trigger,在召回阶段,通过召回与用户兴趣相匹配的item,在排序阶段,用户兴趣作为很重要的一个特征维度,与用户兴趣越相似的item将会被排到越靠前的位置。因此,在推荐系统中,对于用户兴趣的建模显得尤为重要。在目前为止,通常采用的方法是对用户的历史行为挖掘,实现对用户兴趣的建模。

在实际生活中,一个人的兴趣通常是多方面的,不是单一的,传统的建模方式是将用户的行为序列转成固定长度的embedding形式,这样的方式却限制了对用户兴趣的建模能力。其主要原因是用户的兴趣是多样的,统一的固定长度的embedding难以刻画用户兴趣的多样性。深度兴趣网络DIN[1]通过使用Attention机制捕获目标item与用户行为序列中的item之间的相关性,从而实现对特定的目标item的兴趣建模,并将其应用到排序阶段。


2. 算法原理


2.1. 基本模型

DIN模型也是建立在基本模型MLP基础上,对于基础模型Base Model如下图所示:

在这里插入图片描述
对于CTR预估,特征主要包括用户画像特征(User Profile Features),用户行为特征(User Behavior Features),目标item的特征(Candidate Ad)以及上下文特征(Context Features)。上述的特征中,对于离散的类别特征,通常转换成one-hot或者multi-hot形式,具体如下图所示:

在这里插入图片描述
通过对用户历史行为的特征进行pooling操作,实现对用户兴趣的建模,并与其他的特征,如用户的画像特征,待排序item特征,上下文特征一起实现CTR预估,最终,模型的损失函数为:

L=−1N∑(x,y∈S)(ylogp(x)+(1−y)log(1−p(x)))L=-\frac{1}{N}\sum_{\left ( \boldsymbol{x},y\in S \right )}\left ( ylog\, p\left ( \boldsymbol{x} \right ) + \left ( 1-y \right )log\left ( 1-p\left ( \boldsymbol{x} \right ) \right )\right )L=N1(x,yS)(ylogp(x)+(1y)log(1p(x)))


2.2. 深度兴趣网络DIN

在实际场景中,用户的兴趣往往是多样的,或者说是多个维度的,在上述基本的网络模型中,通过对用户行为序列建模,得到用户兴趣的固定长度的向量表示,这样的固定长度的向量难以表达用户的不同兴趣。在深度兴趣网络(Deep Interest Network,DIN)[1]中,借鉴Attention的原理,通过计算候选item与用户行为序列中item之间的相关关系,来动态的计算用户在当前的item下的即时兴趣向量。


2.2.1. DIN的模型结构

DIN的模型结构如下图所示:

在这里插入图片描述
DIN的模型结构与基本模型结构基本一致,不同的是在计算用户兴趣向量时,使用了如下的计算方式:

vU(A)=f(vA,e1,e2,⋯,eH)=∑j=1Ha(ej,vA)ej=∑j=1Hwjej\boldsymbol{v}_U\left ( A \right )=f\left ( \boldsymbol{v}_A,\boldsymbol{e}_1,\boldsymbol{e}_2,\cdots ,\boldsymbol{e}_H \right )=\sum_{j=1}^{H}a\left ( \boldsymbol{e}_j,\boldsymbol{v}_A \right )\boldsymbol{e}_j=\sum_{j=1}^{H}\boldsymbol{w}_j\boldsymbol{e}_jvU(A)=f(vA,e1,e2,,eH)=j=1Ha(ej,vA)ej=j=1Hwjej


2.2.2. DIN的实现差异

在[3]的官方实现中,在计算Activation Weight的过程中,有几点与原文中不一致:


  • 特征
    从上面的图中,我们看到是将User的特征,Ad的特征,以及Out Product(两者的外积)的特征concat在一起,在代码中是将:queries,facts,queries - facts,queries * facts这四项concat在一起:

in_all = tf.concat([queries, facts, queries - facts, queries * facts], axis=-1)

其中queries表示的是Ad向量,facts表示的是User的行为向量,queries * facts表示的是外积。


  • 是否归一化
    原文中指出不需要归一化,但是在代码中却是可以使用了归一化的操作,如下所示:

# Activation
if softmax_stag: # 是否使用归一化scores = tf.nn.softmax(scores) # [B, 1, T]
# Weighted sum
if mode == 'SUM': # 加权求和output = tf.matmul(scores, facts) # [B, 1, H]

完整的实现可以参见参考文献[3]。


3. 总结

鉴于单一的固定向量不能表达用户兴趣的多样性,在深度兴趣网络DIN中使用了注意力机制捕获目标item与用户的行为序列中的item之间的相关性,得到在特定目标item的场景下的用户兴趣表示,从而提升对用户及时兴趣的捕捉能力。


参考文献

[1]. Zhou G , Song C , Zhu X , et al. Deep Interest Network for Click-Through Rate Prediction[J]. 2017.

[2]. 推荐系统CTR模型:Deep Interest Network(DIN)源码分析

[3]. DIN官方实现


推荐阅读
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
author-avatar
丿氵小柒柒2502894463
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有