博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
推荐系统---深度兴趣网络DIN&DIEN
阅读量:7221 次
发布时间:2019-06-29

本文共 3071 字,大约阅读时间需要 10 分钟。

深度学习在推荐系统、CTR预估领域已经有了广泛应用,如wide&deep、deepFM模型等,今天介绍一下由阿里算法团队提出的深度兴趣网络DIN和DIEN两种模型

paper

DIN:

DIEN:

code

DIN:

DIEN:

DIN

常见的深度学习网络用于推荐或者CTR预估的模式如下: Sparse Features -> Embedding Vector -> MLPs -> Sigmoid -> Output. 这种方法主要通过DNN网络抽取特征的高阶特征,减少人工特征组合,如wide&deep、deepFM的DNN部分均是采用这种模式,然而阿里的小组经过研究认为还有以下两种特性在线上数据中十分重要的,而当前的模型无法去挖掘

Diversity:用户在浏览电商网站的兴趣多样性。 Local activation: 由于用户兴趣的多样性,只有部分历史数据会影响到当次推荐的物品是否被点击,而不是所有的历史记录。

为了充分挖掘这些特性,联系到attention机制在nlp等领域的大获成功,阿里团队将attention机制引入推荐系统,在向量进入MLP之前先通过attention机制计算用户行为权重,让每个用户预测关注的兴趣点(行为向量)不同。

网络基本结构如上图,Base Model有一个很大的问题,它对用户的历史行为是同等对待的,没有做任何处理,这显然是不合理的。一个很显然的例子,离现在越近的行为,越能反映你当前的兴趣。因此,DIN模型对用户历史行为基于Attention机制进行一个加权

···

def din_fcn_attention(query, facts, attention_size, mask, stag='null', mode='SUM', softmax_stag=1, time_major=False, return_alphas=False, forCnn=False):

if isinstance(facts, tuple):    # In case of Bi-RNN, concatenate the forward and the backward RNN outputs.    facts = tf.concat(facts, 2)if len(facts.get_shape().as_list()) == 2:    facts = tf.expand_dims(facts, 1)if time_major:    # (T,B,D) => (B,T,D)    facts = tf.array_ops.transpose(facts, [1, 0, 2])mask = tf.equal(mask,tf.ones_like(mask))facts_size = facts.get_shape().as_list()[-1] # Hidden size for rnn layerquery = tf.layers.dense(query,facts_size,activation=None,name='f1'+stag)query = prelu(query)queries = tf.tile(query,[1,tf.shape(facts)[1]]) # Batch * Time * Hidden sizequeries = tf.reshape(queries,tf.shape(facts))din_all = tf.concat([queries,facts,queries-facts,queries*facts],axis=-1) # Batch * Time * (4 * Hidden size)d_layer_1_all = tf.layers.dense(din_all, 80, activation=tf.nn.sigmoid, name='f1_att' + stag)d_layer_2_all = tf.layers.dense(d_layer_1_all, 40, activation=tf.nn.sigmoid, name='f2_att' + stag)d_layer_3_all = tf.layers.dense(d_layer_2_all, 1, activation=None, name='f3_att' + stag) # Batch * Time * 1d_layer_3_all = tf.reshape(d_layer_3_all,[-1,1,tf.shape(facts)[1]])  # Batch * 1 * timescores = d_layer_3_allkey_masks = tf.expand_dims(mask,1) # Batch * 1 * Timepaddings = tf.ones_like(scores) * (-2 ** 32 + 1)if not forCnn:    scores = tf.where(key_masks, scores, paddings)  # [B, 1, T] ,没有的地方用paddings填充# Activationif softmax_stag:    scores = tf.nn.softmax(scores)  # [B, 1, T]# Weighted sumif mode == 'SUM':    output = tf.matmul(scores,facts) # Batch * 1 * Hidden Sizeelse:    scores = tf.reshape(scores,[-1,tf.shape(facts)[1]]) # Batch * Time    output = facts * tf.expand_dims(scores,-1) # Batch * Time * Hidden Size    output = tf.reshape(output,tf.shape(facts))if return_alphas:    return output,scoreselse:    return output复制代码

··· 以上是其中attention的核心代码

DIEN

在用DIN解决了用户的兴趣不同的问题后,模型还存在以下问题 1)用户的兴趣是不断进化的,而DIN抽取的用户兴趣之间是独立无关联的,没有捕获到兴趣的动态进化性 2)通过用户的显式的行为来表达用户隐含的兴趣,这一准确性无法得到保证。

为了解决以上两个问题,阿里算法又提出了DIEN模型

对比DIN的结构,主要区别在于增加了兴趣抽取层和兴趣进化层(RNN)

作者将用户行为表示为序列,利用GRU来抽取兴趣状态

在此之后,为了进一步保证兴趣抽取的准确,作者设计了一个二分类网络,用下一刻的真实行为加GRU的状态拼接作为正例,抽取的假行为拼接GRU状态作为负例,输入二分类网络

同时设计损失函数

然后,抽取完兴趣的状态送入兴趣进化网络,为了让用户兴趣也能追着时间变化,采用RNN设计,同时继承与DIN的attention机制,结合后采用了GRU with attentional update gate (AUGRU)的方法,修改了GRU的结构

此处有多种GRU结合attention的方法。

最终DIEN的实验结果表现很好

转载地址:http://pihym.baihongyu.com/

你可能感兴趣的文章
squid优化笔记 nginx正向代理的缺点
查看>>
Linux 之nginx 负载均衡集群
查看>>
编译nginx的要求与nginx的安装和启动,停止,平滑启动
查看>>
Android官方命令深入分析之绘制9-patch
查看>>
iPhone手机关闭ios10自动更新
查看>>
Devil fly
查看>>
myecplise启动时报错:Content is not allowed in prolog
查看>>
MySQL索引使用笔记
查看>>
为什么你的教学,学生总是提不起兴趣?
查看>>
几何画板坐标轴刻度数字怎么变大
查看>>
Flash Stage3D Molehill 学习笔记(2)
查看>>
Android布局中 android:layout_gravity="bottom"为何不起作用?
查看>>
有趣的时钟
查看>>
[转载]Eclipse.ini的相关说明
查看>>
第二章 java数据类型 !!!
查看>>
移动互联网痛点调查
查看>>
maven 引入的jar有出现两种图标
查看>>
SpringCloud学习成长之路二 服务客户端(rest+ribbon)
查看>>
windows phone 小应用与随机算法的感悟
查看>>
Base64
查看>>