MindSpore实现DIEN网络
代码仓库地址
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网络框架,主要分成以下几层:
- 行为序列层(Behavior Layer):主要将用户浏览过的商品转换为对应的embedding,并且按照浏览时间做排序,即把原始的id类行为序列特征转换成Embedding行为序列
- 兴趣抽取层(Interest Extractor Layer):主要是通过模拟用户的兴趣迁移过程,基于行为序列提取用户兴趣序列
- 兴趣进化层(Interest Evolving Layer):主要是通过在兴趣抽取层基础上加入Attention机制,模拟与当前目标广告相关的兴趣进化过程,对与目标物品相关的兴趣演化过程进行建模
- 最后将兴趣表示、Target Ad、user profile、context feature的embedding向量进行拼接,最后使用MLP完成预测
数据预处理
-
data_iterator.py:数据迭代器构造,data_iterator里面包括各组建batch,将item,category转化为id,负采样等等,其返回值是 source, target,是在train中用来加载数据生成迭代器train_data和test_data。
-
其中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]标签
-
根据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)
- 实际上就是个embedding层,作用是将用户浏览过的商品转换成对应的embedding,并且按照浏览时间做排序,即把原始的id类行为序列特征转换成Embedding行为序列。
- 输入就是经过数据预处理后的用户浏览过后的商品,输出就是embedding行为序列。
二:兴趣提取层(Interest Extractor Layer)
- 输入是embedding行为序列向量,输出是经过GRU的隐藏层向量,同时还计算了一个辅助loss。
- GRU是dynamic rnn,可以和LSTM达到相同的效果,LSTM解决了RNN在长期依赖上的问题,可以很好的学习到很长的历史信息,GRU和LSTM类似,但是更容易训练,能够很大程度上提高训练效率。
- GRU的内部结构图和计算公式:
GRU中只有两个门,一个更新门,一个重置门,而LSTM中有三个门。
- 辅助损失:利用t时刻的embedding行为e(t+1)作为监督去学习隐含层向量ht,其中正负样本分别代表了用户 点击/未点击 的第t个物品的embedding向量。正样本就是真实的下一个行为作为样本,负样本就是从用户从未交互过的商品中随机抽取,或是从已展示给用户但用户没有点击的商品中随机抽取。
辅助损失函数表达式:
三:兴趣进化层(Interest Evolving Layer)
- 主要组件是AUGRU,AUGRU是在GRU的基础上引入了attention score来控制其中的门。
- attention机制:将source中(这里source可以理解为实际样本)的构成元素想象成由一系列的 <Key,Value> 数据对构成的,此时给定 Target 中的某个元素 Query,通过计算Query和各个Key的相似性或相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,从而得到最终的Attention数值。
可以理解成从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息。
也可以理解成一种软寻址(Soft Addressing)
总结一下Attention数值的具体计算过程:
-
根据Query和Key计算两者相似性或相关性的值,常用的方法有:求两者的向量点积、求两者的向量cosine相似性、引入MLP网络求值。
-
对相似性的值进行归一化处理得到权重系数,归一化的方法用softmax。
-
根据权重系数对Value进行加权求和。
Attention计算整体流程图:
四:全连接层
- 全连接层的输入:将兴趣进化层的输出和target id、context feature、user profile feature的embedding向量进行拼接得到全连接层的输入
首先进行 Batch Normalization
然后经过一个200个节点的全连接层,输出用 dice 或 prelu 激活
经过一个80个节点的全连接层,输出用 dice 或 prelu 激活
经过一个2个节点的全连接层,输出再经过softmax得到最终的输出
五:代码实现
具体请参考github仓库代码。