MindSpore实现DIEN网络

DIEN(Deep Interest Evolution Network)是阿里巴巴提出的一种深度学习模型,用于点击率(CTR)预测。该模型通过行为序列层、兴趣提取层、兴趣进化层和全连接层,捕捉用户兴趣的演变过程。行为序列层将用户行为转化为embedding,兴趣提取层利用GRU学习兴趣序列,兴趣进化层通过AUGRU和注意力机制进一步细化兴趣表示。数据预处理涉及行为序列规范化和负采样。模型构建中,全连接层接收兴趣进化层的输出和其他特征,通过多层神经网络预测CTR。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码仓库地址

https://github.com/sduzjp/DIEN

DIEN网络模型概述

DIEN(Deep Interest Evolution Network)是阿里提出的应用于CTR预测的深度兴趣进化网络。

论文:Zhou, G., Mou, N., Fan, Y., Pi, Q., Bian, W., Zhou, C., Zhu, X., & Gai, K. (2019). Deep Interest Evolution Network for Click-Through Rate Prediction. Proceedings of the AAAI Conference on Artificial Intelligence, 33(01), 5941-5948.

论文下载地址:https://doi.org/10.1609/aaai.v33i01.33015941

在这里插入图片描述
DIEN网络框架,主要分成以下几层:

  1. 行为序列层(Behavior Layer):主要将用户浏览过的商品转换为对应的embedding,并且按照浏览时间做排序,即把原始的id类行为序列特征转换成Embedding行为序列
  2. 兴趣抽取层(Interest Extractor Layer):主要是通过模拟用户的兴趣迁移过程,基于行为序列提取用户兴趣序列
  3. 兴趣进化层(Interest Evolving Layer):主要是通过在兴趣抽取层基础上加入Attention机制,模拟与当前目标广告相关的兴趣进化过程,对与目标物品相关的兴趣演化过程进行建模
  4. 最后将兴趣表示、Target Ad、user profile、context feature的embedding向量进行拼接,最后使用MLP完成预测

数据预处理

  1. data_iterator.py:数据迭代器构造,data_iterator里面包括各组建batch,将item,category转化为id,负采样等等,其返回值是 source, target,是在train中用来加载数据生成迭代器train_data和test_data。

  2. 其中source是一个列表(batch),每一个元素也是一个列表 [uid, mid, cat, mid_list, cat_list, noclk_mid_list, noclk_cat_list]

    target也是一个列表(batch),每一个元素也是一个列表 [float(ss[0]), 1-float(ss[0])]

    source中的元素:

    ​ uid:用户id,一个数

    ​ mid:目标movie id(query),待预测是否点击的movie id,一个数

    ​ cat:目标movie category id(query),待预测是否点击的movie category id,一个数

    ​ mid_list:用户历史点击的 movie id ,其实一个列表(长度不定的)

    ​ cat_list:用户历史点击的 movie category id ,其实一个列表(长度和mid_list一样)

    ​ noclk_mid_list、noclk_cat_list:负采样的movie id和category id,

    负采样的过程:从mid_list(历史行为序列)中拿movie id(pos_mid),然后在mid_list_for_randoms随机抽取一个位置(对应一个movie id即noclk_mid),然后看看pos_mid和noclk_mid是否一样,一样就跳过,不一样就可以将其作为一个负样本,负样本个数超过5个即可返回。因此抽取的负样本noclk_mid_list是一个二维列表[length,5],length就是该用户历史行为中点击的商品的个数

    举例:假设用户历史点击的商品有[1,45,34]

    ​ 那么我们先取出1,其对应抽5个负样本[2,3,4,5,6]

    ​ 再取出45,其对应抽5个负样本[7,8,2,9,1]

    ​ 再取出34,其对应抽5个负样本[89,56,23,67,3]

    ​ 最后noclk_mid_list的形式就是[[2,3,4,5,6], [7,8,2,9,1], [89,56,23,67,3]]

    target就是一个列表,[0,1]或[1,0]标签

  3. 根据data_iterator中得到的source 和 target,经过train.py中的prepare_data函数进行数据预处理,目的是将行为序列长度规范化到100。需要规范化的字段主要就4个:mid_list,cat_list,noclk_mid_list,noclk_cat_list。最后规范化以后多了一个mid_mask来记录padding,1表示的就是真实的,0表示的就是填充的。

模型构建

一:行为序列层(Behavior Layer)

  1. 实际上就是个embedding层,作用是将用户浏览过的商品转换成对应的embedding,并且按照浏览时间做排序,即把原始的id类行为序列特征转换成Embedding行为序列。
  2. 输入就是经过数据预处理后的用户浏览过后的商品,输出就是embedding行为序列。

二:兴趣提取层(Interest Extractor Layer)

  1. 输入是embedding行为序列向量,输出是经过GRU的隐藏层向量,同时还计算了一个辅助loss。
  2. GRU是dynamic rnn,可以和LSTM达到相同的效果,LSTM解决了RNN在长期依赖上的问题,可以很好的学习到很长的历史信息,GRU和LSTM类似,但是更容易训练,能够很大程度上提高训练效率。
  3. GRU的内部结构图和计算公式:
    在这里插入图片描述
    GRU中只有两个门,一个更新门,一个重置门,而LSTM中有三个门。
    在这里插入图片描述
  4. 辅助损失:利用t时刻的embedding行为e(t+1)作为监督去学习隐含层向量ht,其中正负样本分别代表了用户 点击/未点击 的第t个物品的embedding向量。正样本就是真实的下一个行为作为样本,负样本就是从用户从未交互过的商品中随机抽取,或是从已展示给用户但用户没有点击的商品中随机抽取。
    在这里插入图片描述辅助损失函数表达式:
    在这里插入图片描述

三:兴趣进化层(Interest Evolving Layer)

  1. 主要组件是AUGRU,AUGRU是在GRU的基础上引入了attention score来控制其中的门。
  2. attention机制:将source中(这里source可以理解为实际样本)的构成元素想象成由一系列的 <Key,Value> 数据对构成的,此时给定 Target 中的某个元素 Query,通过计算Query和各个Key的相似性或相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,从而得到最终的Attention数值。
    在这里插入图片描述
    可以理解成从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息。

也可以理解成一种软寻址(Soft Addressing)

总结一下Attention数值的具体计算过程:

  1. 根据Query和Key计算两者相似性或相关性的值,常用的方法有:求两者的向量点积、求两者的向量cosine相似性、引入MLP网络求值。
    在这里插入图片描述

  2. 对相似性的值进行归一化处理得到权重系数,归一化的方法用softmax。
    在这里插入图片描述

  3. 根据权重系数对Value进行加权求和。
    在这里插入图片描述
    Attention计算整体流程图:
    在这里插入图片描述

四:全连接层

  1. 全连接层的输入:将兴趣进化层的输出和target id、context feature、user profile feature的embedding向量进行拼接得到全连接层的输入
    在这里插入图片描述

首先进行 Batch Normalization

然后经过一个200个节点的全连接层,输出用 dice 或 prelu 激活

经过一个80个节点的全连接层,输出用 dice 或 prelu 激活

经过一个2个节点的全连接层,输出再经过softmax得到最终的输出

五:代码实现

具体请参考github仓库代码。

### 深度兴趣演化网络DIEN)模型概述 深度兴趣演化网络(Deep Interest Evolution Network, DIEN)是一种专门用于提升点击率(CTR)预测性能的深度学习模型。该模型的核心在于捕捉用户的动态兴趣变化并对其进行建模,从而更精准地预测用户的行为倾向。 #### 1. **DIEN 的背景与动机** 在推荐系统领域,传统的 CTR 预测方法通常基于静态特征表示,无法有效应对用户兴趣随时间演化的复杂性。DIEN 提出了两个关键模块——**兴趣提取层(Interest Extractor Layer)** 和 **兴趣演化层(Interest Evolving Layer)** 来解决这一问题[^2]。这些模块能够更好地捕获用户的历史行为序列中的短期和长期兴趣,并通过 GRU 结构进一步增强对目标项目的关注。 --- #### 2. **DIEN 架构详解** ##### (1)输入层 DIEN 的输入主要由两部分组成: - 用户历史行为序列 $ \{h_1, h_2, ..., h_n\} $ 表示用户过去的交互记录。 - 当前候选物品 $ x_t $ 是待评估的目标商品或广告。 ##### (2)兴趣提取层 兴趣提取层利用带有时序关系的兴趣抽取器来生成用户兴趣向量集合。具体来说,此阶段采用了一个改进版的 GRU 单元,称为 **AUGRU(Attention-based Update Gate Recurrent Unit)**,它可以自适应调整隐藏状态更新的程度,使得模型更加专注于那些与当前目标高度相关的兴趣点[^4]。 ##### (3)兴趣演化层 为了模拟用户兴趣的变化轨迹,DIEN 设计了兴趣演化层。在此过程中引入了一种特殊的注意机制,即 **辅助损失函数驱动的注意力计算方式**,这不仅提高了模型对于重要事件的关注能力,还减少了无关噪声带来的干扰影响[^5]。 最终输出经过全连接神经网络映射至概率空间完成二分类任务。 --- ### Python 实现代码片段 以下是基于 TensorFlow/Keras 的简化版本实现: ```python import tensorflow as tf from tensorflow.keras.layers import Input, Dense, Embedding, Concatenate, Dropout from tensorflow.keras.models import Model from tensorflow.keras.regularizers import l2 def AUGRU(units): """定义 Attention-based Update Gate Recurrent Unit""" def __call__(self, inputs, states, attention_score=None): xt = inputs ht_minus_1 = states[0] zt = tf.sigmoid(tf.matmul(xt, self.Wz) + tf.matmul(ht_minus_1, self.Uz)) rt = tf.sigmoid(tf.matmul(xt, self.Wr) + tf.matmul(ht_minus_1, self.Ur)) candidate_ht = tf.tanh( tf.matmul(xt, self.Wh) + tf.multiply(rt, tf.matmul(ht_minus_1, self.Uh)) * attention_score[:, None] ) ht = (1 - zt) * ht_minus_1 + zt * candidate_ht return ht, [ht] class DIEN(Model): def __init__(self, num_users, num_items, embedding_dim=64, hidden_units=128): super(DIEN, self).__init__() self.user_embedding = Embedding(num_users, embedding_dim) self.item_embedding = Embedding(num_items, embedding_dim) self.gru_layer = tf.keras.layers.GRU(hidden_units, return_sequences=True) self.augru_layer = AUGRU(hidden_units) self.dense_output = Dense(1, activation='sigmoid') def call(self, inputs): user_ids, item_seq, target_item = inputs # 嵌入操作 seq_embeddings = self.item_embedding(item_seq) target_emb = self.item_embedding(target_item) # 兴趣提取层 gru_out = self.gru_layer(seq_embeddings) # 计算注意力分数 att_scores = tf.nn.softmax(tf.reduce_sum(gru_out * target_emb[:,None,:], axis=-1), axis=1) # 利用 AUGRU 更新状态 augru_outputs = [] state = tf.zeros_like(gru_out[:,0]) for t in range(gru_out.shape[1]): output, state = self.augru_layer(gru_out[:,t:t+1], initial_state=[state], attention_score=att_scores[:,t]) augru_outputs.append(output) final_interests = tf.concat(augru_outputs, axis=1) # 输出层 concat_input = Concatenate()([final_interests[:,-1], target_emb]) logits = self.dense_output(concat_input) return logits ``` 上述代码展示了如何构建一个基础框架下的 DIEN 模型结构,其中包含了 AUGRU 层的设计思路以及整体流程逻辑[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻fufu滴人儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值