本文主要是介绍深度推荐模型笔记05 DIN模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
深度推荐模型笔记05 DIN模型
本篇预计阅读时间5分钟,开源学习内容来自:datawhale
另外补充一些文章里提到的关于注意力机制和注意力网络的内容:注意力机制
1. DIN模型的来源和发展
论文《Deep Interest Network for Click-Through Rate Prediction》提出深度兴趣网络Deep Interest Network,以下简称DIN模型。它是一种从真实用户场景出发的模型,基于客户历史行为数据帮助类似attention的网络进行学习。
1.1 基线模型
DIN模型包括embedding layer,pooling layer and Concat layer,MLP,Loss层。以下分层说明各自关系。
- embedding layer:把高维稀疏的输入转成低维稠密向量,每个离散特征下面会对应着一个embedding词典,维度为D/K,D是隐向量的维度,K表示当前离散特征点的唯一取值个数
- pooling layer and Concat layer:根据用户的历史行为进行特征拼接。
- MLP :全连接层
- **loss:**点击率预测任务,二分类的问题
与基准模型相比,DIN引入了与attention机制功能相似的Activation Unit用于根据候选广告计算历史行为的权重。如下图:
1.2 DIN 模型架构
2. DIN代码复现
具有框架可以参考上面提到的开源地址,tensorflow中其实可以安装deepctr来实现DIN模型,代码如下:
pip install deepctr[gpu]
在其 github 仓库中提供了一个 demo,其代码以及关键部分的注释如下:
import numpy as npfrom deepctr.models import DIN
from deepctr.feature_column import SparseFeat, VarLenSparseFeat, DenseFeat,get_feature_namesdef get_xy_fd():# 对基础特征进行 embeddingfeature_columns = [SparseFeat('user',vocabulary_size=3,embedding_dim=10),SparseFeat('gender', vocabulary_size=2,embedding_dim=4), SparseFeat('item_id', vocabulary_size=3,embedding_dim=8), SparseFeat('cate_id', vocabulary_size=2,embedding_dim=4),DenseFeat('pay_score', 1)]# 指定历史行为序列对应的特征behavior_feature_list = ["item_id", "cate_id"]# 构造 ['item_id', 'cate_id'] 这两个属性历史序列数据的数据结构: hist_item_id, hist_cate_id# 由于历史行为是不定长数据序列,需要用 VarLenSparseFeat 封装起来,并指定序列的最大长度为 4 # 注意,对于长度不足4的部分会用0来填充,因此 vocabulary_size 应该在原来的基础上 + 1feature_columns += [VarLenSparseFeat(SparseFeat('hist_item_id', vocabulary_size=3 + 1,embedding_dim=8,embedding_name='item_id'), maxlen=4),VarLenSparseFeat(SparseFeat('hist_cate_id', 2 + 1,embedding_dim=2 + 1, embedding_name='cate_id'), maxlen=4)]# 基础特征数据uid = np.array([0, 1, 2])ugender = np.array([0, 1, 0])iid = np.array([1, 2, 3])cate_id = np.array([1, 2, 2]) pay_score = np.array([0.1, 0.2, 0.3])# 构造历史行为序列数据# 构造长度为 4 的 item_id 序列,不足的部分用0填充hist_iid = np.array([[1, 2, 3, 0], [3, 2, 1, 0], [1, 2, 0, 0]])# 构造长度为 4 的 cate_id 序列,不足的部分用0填充hist_cate_id = np.array([[1, 2, 2, 0], [2, 2, 1, 0], [1, 2, 0, 0]])# 构造实际的输入数据feature_dict = {'user': uid, 'gender': ugender, 'item_id': iid, 'cate_id': cate_id,'hist_item_id': hist_iid, 'hist_cate_id': hist_cate_id, 'pay_score': pay_score}x = {name:feature_dict[name] for name in get_feature_names(feature_columns)}y = np.array([1, 0, 1])return x, y, feature_columns, behavior_feature_listif __name__ == "__main__":x, y, feature_columns, behavior_feature_list = get_xy_fd()# 构造 DIN 模型model = DIN(dnn_feature_columns=feature_columns, history_feature_list=behavior_feature_list)model.compile('adam', 'binary_crossentropy',metrics=['binary_crossentropy'])history = model.fit(x, y, verbose=1, epochs=10)
这篇关于深度推荐模型笔记05 DIN模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!