热门标签 | 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官方实现


推荐阅读
  • Elasticsearch排序机制详解
    本文深入探讨了Elasticsearch中的排序功能,包括相关性排序、字段值排序、多级排序及字符串和多值字段的排序策略,旨在帮助读者更好地理解和优化搜索结果。 ... [详细]
  • 本文详细探讨了如何在 SparkSQL 中创建 DataFrame,涵盖了从基本概念到具体实践的各种方法。作为持续学习的一部分,本文将持续更新以提供最新信息。 ... [详细]
  • 尽管大多数递归函数能够通过循环和栈结构重写,但在某些特定条件下,这种转换变得极为复杂甚至不可能。本文探讨了这些条件及其背后的原理。 ... [详细]
  • 本文详细介绍了使用NumPy和TensorFlow实现的逻辑回归算法。通过具体代码示例,解释了数据加载、模型训练及分类预测的过程。 ... [详细]
  • 在Elasticsearch中,映射(mappings)定义了索引中字段的结构,类似于传统数据库中的表结构。虽然Elasticsearch支持字段的增删,但直接修改字段类型是不允许的。本文介绍了一种通过创建新索引并迁移数据的方式来改变字段类型的方法。 ... [详细]
  • 浪潮AI服务器NF5488A5在MLPerf基准测试中刷新多项纪录
    近日,国际权威AI基准测试平台MLPerf发布了最新的推理测试结果,浪潮AI服务器NF5488A5在此次测试中创造了18项性能纪录,显著提升了数据中心AI推理性能。 ... [详细]
  • HTML5实现逼真树叶飘落动画详解
    本文详细介绍了如何利用HTML5技术创建一个逼真的树叶飘落动画,包括HTML、CSS和JavaScript的代码实现及优化技巧。 ... [详细]
  • 深入探讨PHP中的输出缓冲技术(Output Buffering)
    本文深入解析了PHP中输出缓冲(Output Buffering)的原理及其在Web开发中的应用,特别是如何通过输出缓冲技术有效管理HTTP头部信息,提高代码的灵活性与健壮性。 ... [详细]
  • 本文提供了关于如何在 Java 中使用 `com.amazonaws.services.kinesis.model.StreamDescription.getRetentionPeriodHours()` 方法的详细说明,并附带了多个实际代码示例。 ... [详细]
  • 本文详细介绍了在Java项目中如何使用de.codecentric.namespace.weatherservice.Weather类中的getServiceName()方法,并提供了多个实际应用的代码示例。 ... [详细]
  • .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
    .NETCore中的一个接口多种实现的依赖注入与动态选择看这篇就够了最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的 ... [详细]
  • Struts2(六) 用Struts完成客户列表显示
    Struts完成客户列表显示所用的基础知识在之前的随笔中已经讲过。这篇是介绍如何使用Struts完成客户列表显示。下面是完成的代码执行逻辑图:抽取项目部分代码相信大家 ... [详细]
  • LightningChart 是一款高性能的数据可视化工具,专为处理大规模实时数据设计,支持从2D到高级3D图表,包括极坐标图、史密斯图等。最新版本解决了在特定情况下导致应用程序崩溃的问题。 ... [详细]
  • LeetCode Java 实现:寻找最长公共前缀(初级)
    本文详细介绍了如何使用Java解决LeetCode上的“最长公共前缀”问题,涵盖了多种解题方法,包括横向扫描、纵向扫描及其变体,旨在帮助读者深入理解算法设计与优化。 ... [详细]
  • 本文介绍了一种算法,用于判断一组扑克牌是否构成连续的序列。通过记录数组中非零元素的最大值和最小值,并检查这些值之间的差异来实现这一目标。 ... [详细]
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社区 版权所有