【序列建模】DIN深度兴趣网络

通过用户的历史行为序列刻画用户兴趣的广泛性,是推荐系统比较大的一个难点,用户历史行为序列建模的研究经历了从Pooling、RNN到attention、capsule再到transformer的顺序

  • Pooling:代表是Youtube DNN ,对用户历史行为的商品ID进行embedding后再sum pooling/mean pooling,比如用户历史买过10件电子产品和1件衣服,那embedding被pooling仍然能够反映出用户对电子商品的偏好。这种做法优势是比较容易实现,复杂度也不高,但是很多信息会被平滑了,在长序列建模中,这种就尤其容易学到四不像的一个embedding。
  • 直接拼接:就是把历史行为序列的embedding直接拼接在一起输入网络,但是在推荐场景下,本身特征维度已经很高了,这种做法1是容易过拟合2历史行为本身已经很长了拼接后参数膨胀,对学习和线上推理都是一个负担。
  • RNN模式:DIEN就是用的这种方法,把历史行为输入一个序列网络学习来抽取信息,他的缺点是,RNN顺序学习的方法不利于线上并行,导致速度上不去;另一个原因是在推荐场景中,可能用户的兴趣是跳跃的,比如先买了键盘后,买了一件衣服,才回来买鼠标,RNN顺序学习的模式也难以学习到这种跳跃情况。
  • Attention:DIN模型用的方法,attention可以学习到序列信息中每一个具体item的权重,这样进行pooling的时候能够对本次行为相关的商品赋予更大的权重,它的缺点是attention本身没有利用时间信息,也就是如何利用用户购买的顺序信息,如何设计位置编码也有很多论文进行了探讨。
  • 胶囊网络:MIND用的方法,利用胶囊网络中动态路由算法来表达用户多种行为兴趣。通常是在召回阶段用户序列模型得到的兴趣向量,召回的商品都很相似,无法刻画用户兴趣的多样性。Capsule建模能够得到多个用户的兴趣向量,从而召回用户的多类目商品。
    ————————————————

Motivation

在DIN之前,业界处理序列特征,普遍是在embedding之后进行pooling,这种做法将序列特征的每个item看作是相等的权重,举个例子:用户历史购买过9件衣服和1个鼠标,本次候选商品是键盘,但是因为用户历史行为被衣服充斥着,历史行为pooling后的embedding非常偏向衣服这个子空间,而历史购买键盘后再买鼠标显然应该赋予更大的权重。通过pooling的做法就会导致历史行为的兴趣被平滑了,学成一个四不像的没法体现用户广泛兴趣的向量。

DIN模型提出的动机是利用target attention的方法,进行加权pooling,它为历史行为的物品和当前推荐物品计算一个attention score,然后加权pooling,这样的方法更能体现用户兴趣多样性。在工业界实践中,DIN模型也证明了他的优异性能,即使到了当前(2022)我了解腾讯很多组在规模不大的推荐场景下还是会使用DIN模型。

Attention Layers


DIN主要是利用一个局部激活单元来计算attention得分,它的attenton是一个MLP,输入是历史行为的item和当前候选商品的item,输出它们的相关性得分,同时还加入了两者的差以及外积,一起输入,体现一个特征交叉。

原文还特别提到了DIN的权重计算出来后不用通过softmax(不同于transformer的self-attention)来体现用户的多峰兴趣。我理解的这个做法主要是因为softmax会加强最大值哪个数的强度,削弱其他强度,如果有个item计算出来的score和别人不是一个数量级,那其他item将会被softmax后趋近于0,不利于表达用户列表中多个和候选商品有关的历史行为。

DIN模型复现

数据集

复现DIN的时候采用了是阿里巴巴提供的一个淘宝用户行为数据集,用于隐式反馈推荐问题的研究。数据集链接:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649。

这是数据集比较简单,只有一个文件,特征也不多,易于我们跑一个baseline。

特征工程


特征中主要关注的是行为列,这一个列有四种离散类型,在复现DIN的时候,我们可以把这四种类型都当作正样本,也就是整个数据集都是正样本。所以这个特征我们用类别编码,方便后续处理。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data_raw.behavior = le.fit_transform(data_raw.behavior)

此时数据集的样子:

如何构建样本

DIN构建样本的方式比较多,首先是负样本的选择:因为我们的数据集只有正样本,所以采用全局随机选择一条没有出现在用户行为列表的样本作为负样本。产生样本的方法是根据用户行为列表,把前n-1条当作行为列表,第n条当作候选item,也就是本次需要预测的商品。然后把这条item换成随机生成的item,就是一条负样本了。

我测试过两种构建样本的方式,第一种是每个user只生成正负样本各一条,也就是选用用户最后一条购买的item作为预测,然后1:1生成负样本,发现这种情况下训练集auc达到了1,存在特征泄漏,但是一直也没找到原因。第二种是采用滑动窗口,用户历史行为每一条item都为他生成正负样本各一条。

Attention Unit

整个模型的复现我是基于tensorflow2的,参考了deepctr和潜心开源的版本。DIN中的attention机制就是一个mlp,这里复现的版本是加了softmax的,具体实现可以看代码:

    def call(self, inputs):querry, key, val, mask = inputs# 为每一个行为序列的item计算score,方法是先把候选商品展开为和序列一样的维度,也就是maxlen的长度querry = tf.tile(querry, multiples=[1, key.shape[1]])querry = tf.reshape(querry, shape=[-1, key.shape[1], key.shape[2]])# 特征交叉outputs = tf.concat([querry, key, querry-key, querry*key], axis=-1)# dnnfor dense in self.dense:outputs = dense(outputs)# 对于我们padding为0的那些元素,不用参与score计算,所以给他们赋予很小的权重outputs = self.out(outputs)outputs = tf.squeeze(outputs, axis=-1)padding = tf.ones_like(outputs) *(-2 ** 32 + 1)outputs = tf.where(tf.equal(mask, 0), padding, outputs)# softmax层outputs = tf.nn.softmax(logits=outputs)outputs = tf.expand_dims(outputs,axis=1)# 加权poolingoutputs = tf.matmul(outputs, val)outputs = tf.squeeze(outputs, axis=1)return outputs

基本上挤上了注释,能够看懂每一部分在干啥就能看懂。

DIN

有了attention模块,我们实现din就容易很多了,我也基本加了注释,完整的代码可以看github:DIN复现github,只需要把数据集放入datasets目录就可以直接跑:

class DIN(Model):def __init__(self,feature_columns,behavior_feature_list,attention_hidden_units=None,dnn_hidden_units=None,attention_activation='prelu',dnn_activation='relu',dnn_dropout=0,embedding_regularizer=1e-4,sequence_length=50,**kwargs):super(DIN, self).__init__()if dnn_hidden_units is None:dnn_hidden_units = (512, 128, 64)if attention_hidden_units is None:attention_hidden_units = (64, 32)self.sequences_length = sequence_lengthself.dense_feature_info, self.sparse_feature_info = feature_columnsself.other_sparse_lenght = len(self.sparse_feature_info) - len(behavior_feature_list)self.dense_feature_length = len(self.dense_feature_info)self.behavior_feature_nums = len(behavior_feature_list)self.sparse_features_embedding = [Embedding(input_dim=feat['feat_num'],input_length=1,output_dim=feat['embed_dim'],embeddings_initializer='random_uniform',embeddings_regularizer=l2(embedding_regularizer))for feat in self.sparse_feature_infoif feat['feat'] not in behavior_feature_list]self.sequences_features_embedding = [Embedding(input_dim=feat['feat_num'],input_length=1,output_dim=feat['embed_dim'],embeddings_initializer='random_uniform',embeddings_regularizer=l2(embedding_regularizer))for feat in self.sparse_feature_infoif feat['feat'] in behavior_feature_list]self.attention_layer = AttentionLayer(attention_hidden_units, activation='prelu')self.batchnorm = BatchNormalization(trainable=True)self.dnn_layer = [Dense(unit, activation=PReLU()) for unit in dnn_hidden_units]self.dropout = Dropout(dnn_dropout)self.out = Dense(1)def call(self, inputs):dense_inputs, sparse_inputs, sequense_inputs, item_inputs = inputsmask = tf.cast(tf.not_equal(sequense_inputs[:, :, 0], 0), dtype=tf.float32)# 非序列的稀疏特征通过embedding后,和稠密特征拼接other_inputs = dense_inputsfor i in range(self.other_sparse_lenght):other_inputs = tf.concat([other_inputs, self.sparse_features_embedding[i](sparse_inputs[:, i])], axis=-1)# 序列特征enbeddingsequense_embedding = tf.concat([self.sequences_features_embedding[i](sequense_inputs[:, :, i]) for i in range(self.behavior_feature_nums)], axis=-1)item_embedding = tf.concat([self.sequences_features_embedding[i](item_inputs[:, i]) for i in range(self.behavior_feature_nums)], axis=-1)# 把序列特征输入attention层user_info = self.attention_layer([item_embedding, sequense_embedding, sequense_embedding, mask])if self.dense_feature_length > 0 or self.other_sparse_lenght > 0:outputs = tf.concat([user_info, item_embedding, other_inputs], axis=-1)else:outputs = tf.concat([user_info, item_embedding], axis=-1)# 送入dnnfor dense in self.dnn_layer:outputs = dense(outputs)outputs = self.dropout(outputs)outputs = tf.nn.sigmoid(self.out(outputs))return outputs

参考

  • DeepInterestNetwork
  • Recommender System with TF2.0—v0.0.3

【序列建模】DIN深度兴趣网络相关推荐

  1. [论文阅读]阿里DIN深度兴趣网络之总体解读

    [论文阅读]阿里DIN深度兴趣网络之总体解读 文章目录 [论文阅读]阿里DIN深度兴趣网络之总体解读 0x00 摘要 0x01 论文概要 1.1 概括 1.2 文章信息 1.3 核心观点 1.4 名词 ...

  2. 深度学习 - 46.DIN 深度兴趣网络

    目录 一.引言 二.摘要 ABSTRACT 三.介绍 INTRODUCTION 1.CTR 在广告系统的作用 2.传统 MLP 存在的问题 3.DIN 的改进 四.近期工作 RELATEDWORK 1 ...

  3. 100分钟吃掉DIN深度兴趣网络

    阿里巴巴在CTR预估领域有3篇比较有名的文章. 2017年的深度兴趣网络, DIN(DeepInterestNetwork). 2018年的深度兴趣演化网络, DIEN(DeepInterestEvo ...

  4. 阿里DIN模型(深度兴趣网络)详解及理解

    这里写目录标题 目标: 模型产生原因: 核心思想: 模型介绍: Base model 改进模型 模型算法设计 论文的算法改进 参考资料 目标: 掌握2017年阿里提出的深度兴趣网络(Deep Inte ...

  5. 推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network)

    推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR ...

  6. 序列建模:时间卷积网络取代RNN(An Empirical Evaluation of Generic Convolutional and Recurrent)论文 pdf

    下载地址:https://u20150046.ctfile.com/fs/20150046-376633283 作者:Shaojie Bai, J. Zico Kolter, Vladlen Kolt ...

  7. DIN:使用Attention挖掘历史数据的深度兴趣网络

    DIN要解决的问题 DIN(Deep Interest Network)是阿里巴巴用于解决工业级CTR预估问题的预测模型,论文收录于KDD 2018.这篇论文的主要贡献有三点:提出了DIN模型:提出了 ...

  8. din算法 代码_深度兴趣网络(DIN,Deep Interest Network)

    1. DIN介绍 Deep Interest Network是基于BaseModel演化而来 1.1 流程: 整个流程可以描述为:1.检查用户历史行为数据 2.使用matching module产生候 ...

  9. 【王喆-推荐系统】模型篇-(task8)深度兴趣网络 DIN

    学习总结 DIN基于注意力机制,利用激活单元计算出用户对于不同历史商品的注意力权重,针对当前广告商品,作出更有针对性的预测.该激活单元将历史行为商品的 Embedding和候选广告商品的 Embedd ...

最新文章

  1. 利用rank函数实现自动排序
  2. re2c编译选项的说明
  3. 【编译原理】FIRSTVT和LASTVT求法
  4. 多任务 schedule python_Python3.6 Schedule 模块定时任务 (实例讲解)
  5. git缓冲区查看_git原理学习记录:从基本指令到背后原理,实现一个简单的git
  6. 模拟电子线路设计 实验报告
  7. 从mysql中导出数据乱码_MySQL导入导出数据出现乱码的解决办法
  8. 见过这么有才的笑话吗?
  9. c语言中自动生成迷宫地图,C语言新案例-迷宫制作
  10. android短视频列表自动播放,手把手教你实现视频列表滚动自动播放-短视频列表滚动播放实战...
  11. 如何使用百数低代码开发平台制作问卷调查表?
  12. JavaScriptnbsp;的学习程序整理(…
  13. 获取闲鱼已售商品的价格等信息
  14. 计算机北大核心期刊不要审稿费,这些核心医学期刊不收取审稿费(建议收藏)...
  15. 《数据结构(C语言版)》严巍敏课件~第七章:图
  16. 如何设置微信公众号在被添加关注之后, 自动回复文字和图片两条消息
  17. springcloud-oauth2实践
  18. Python爬虫天涯论坛美图
  19. FCFS磁盘调度算法(C语言实现)
  20. linux监控硬件温度(CPU和GPU等)

热门文章

  1. Sack Panic漏洞TCP MSS机制(二)(together with myself)
  2. 小步快跑,快速迭代:安全运营的器术法道
  3. 多人在线编辑文档 开发_太方便了,支持多人同时编辑,电脑和手机端实时同步保存...
  4. 【px4编译】make px4fmu-v3_default upload 不能使用
  5. 计算机的一些小操作,电脑操作实用小技巧(适用小白)
  6. 小飞鱼通达二开 解决通达OA数据库服务不能启动的问题(图文)
  7. 网络web渗透工程师-教你怎么喝着茶,把甲方爸爸的活干了。
  8. 一位老兄看 深圳西安北京上海 大众收入与消费
  9. 解决Windows Server 2008 R2安装声卡驱动后还是提示无音频设备的问题
  10. 2016-6-2-第二个sprint