在电商领域,每个用户都有丰富的历史行为数据,这些数据具有如下特点:

  1. 多样性(Diversity):用户可能对多种商品感兴趣,例如手机、衣服。

  2. 局部激活(Local Activation):用户是否点击新商品,仅仅取决于历史行为中与新商品相关度高的部分数据。

如何从中捕获特征对CTR预估模型非常重要。论文 《Deep Interest Network for Click-Through Rate Prediction 提出了深度兴趣网络 Deep Interest Network,以下简称 DIN 模型,设计了类似 attention 的网络结构来激活历史行为数据中与候选广告相关度高的行为,即:增大与目标广告相关性高的历史行为权重。

模型解读

基准模型

论文并没有直接讲解DIN模型,而是先介绍了基准模型的结构:

此模型主要功能是将输入的用户特征、行为特征、候选广告以及上下文特征转换成 embedding,然后将这些 embedding 拼接在一起用几个全连接层完成点击率的预测。这里面有几个需要注意的细节:

1,用户行为序列的长度一般是不同的,所以为了能够将不同序列长度的embedding 向量转换成相同的大小,一种思路是将所有的 embedding 向量进行 sum pooling,即对所有 embedding 向量求和,得到一个固定大小的向量,作为全连接层的输入。

2,直接对行为的 embedding 向量求和,会损失很多信息,即:无法捕捉到候选广告与历史行为信息中的局部相关性。

DIN模型

于是,在论文中又提出了改进后的模型: DIN,网络结构如下图:

与基准模型相比,最大的区别在于:引入了与 attention 机制功能相似的 Activation Unit 用于根据候选广告计算历史行为的权重。

如果用 {e1,e2,...,eHe_1, e_2, ... , e_He1,e2,...,eH} 表示用户 U 对 H 个商品行为 embedding 向量,vAv_AvA 表示候选广告的向量,那么用户 U 对广告 A 的兴趣向量 vU(A)v_U(A)vU(A) 可以用下面的公式计算:
vU(A)=f(vA,e1,e2,...,eH)=∑j=1Ha(ej,vA)ej=∑j=1Hwjejv_U(A) = f(v_A,e_1,e_2,...,e_H)=\sum_{j=1}^Ha(e_j,v_A)e_j=\sum_{j=1}^Hw_je_j vU(A)=f(vA,e1,e2,...,eH)=j=1Ha(ej,vA)ej=j=1Hwjej
其中, a(⋅)a(\cdot)a() 本质上是一个前馈神经网络,用于计算 eje_jej 的权重 wjw_jwj。在计算权重时,需要将 eje_jejvAv_AvA 作为下图 Activation Unit 的输入,最终得到的输出就是权值。

如果历史行为中某个商品 eje_jej 与候选广告商品 vAv_AvA 相似度高,那么在使用 SUM Pooling 计算 vU(A)v_U(A)vU(A) 时,相似度高的商品的权重也应该高一些。从公式可以看出,引入了 Activation Unit 之后,不同的候选广告,用户的兴趣向量也会有所不同。

需要注意的是,与 attention 不同,权值 w 不需要保证的和为1。

训练技巧

Dice 激活函数

PReLU 可以看作是 ReLU 的改版,计算方法为:
f(s)={sifs>0αsifs≤0=p(s)⋅s+(1−p(s))⋅αs\begin{aligned} f(s) & =\left\{ \begin{array}{l} s \;\;\qquad if\quad s>0 \\ \alpha s \qquad if\quad s \le 0 \end{array} \right. \\ & = p(s) \cdot s + (1-p(s))\cdot\alpha s \end{aligned} f(s)={sifs>0αsifs0=p(s)s+(1p(s))αs
无论是 ReLU 或者是 PReLU 突变点都是0。而论文认为突变点的选择应该依赖于数据,于是基于 PReLU 提出了 Dice 激活函数:
f(s)=p(s)⋅s+(1−p(s))⋅αsp(s)=11+e−s−E[s]Var[s]+ϵf(s)=p(s) \cdot s+(1-p(s)) \cdot \alpha s\\ p(s)=\frac{1}{1+e^{-\frac{s-E[s]}{\sqrt{V a r[s]+\epsilon}}}} f(s)=p(s)s+(1p(s))αsp(s)=1+eVar[s]+ϵ

sE[s]1
其中E[s],Var[s]E[s], Var[s]E[s],Var[s] 分别是每个 mini-batch 数据的均值与方差,ϵ\epsilonϵ10−810^{-8}108 。于是,p(s)p(s)p(s) 函数的图像如下:

这样的激活函数能够适应不同分布的输入数据,整体表现要优于 PReLU。

自适应正则化

在使用例如 l2l_2l2 这样的传统正则化方法时,每一个 mini-batch 正则化项的计算都需要所有的参数的参与,在参数数量庞大的情况下,这个计算消耗太大了。于是论文提出了一种正则化方法,只需要对在每个 mini-batch 中出现的参数进行计算。

回顾 DIN 模型,发现绝大多数参数出现在 embedding 层,令:
W∈RD×KW \in R ^{D \times K} WRD×K
表示整个 embedding 层的参数,其中 D 是嵌入维度,K 是特征个数。则正则化项的计算公式如下:
L2(W)≈∑j=1K∑m=1Bαmjnj∣∣wj∣∣22L_2(W) \approx \sum_{j=1}^K \sum_{m=1}^B \frac{\alpha_{mj}}{n_j}||w_j||_2^2 L2(W)j=1Km=1Bnjαmjwj22
其中,αmj\alpha_{mj}αmj 表示特征 j 是否出现在 mini-batch 样本 B 中,njn_jnj 表示样本 j 在 B 中的出现次数, wjw_jwj 则是第 j 个嵌入向量。整个公式的核心思想是出现的频率越大,正则化的强度越小。

GAUC 评估指标

GAUC 是 AUC 的加权平均:
GAUC=∑i=1nwi×AUCi∑i=1nwi=∑i=1nimpi×AUCi∑i=1nimpi\mathrm{GAUC}=\frac{\sum_{i=1}^{n} w_{i} \times \mathrm{AUC}_{i}}{\sum_{i=1}^{n} w_{i}}=\frac{\sum_{i=1}^{n} \mathrm{imp}_{i} \times \mathrm{AUC}_{i}}{\sum_{i=1}^{n} \mathrm{imp}_{i}} GAUC=i=1nwii=1nwi×AUCi=i=1nimpii=1nimpi×AUCi
其中:n 是用户的数量,AUCiAUC_iAUCi 表示用户 iii 所有样本的 AUC,impiimp_iimpi 是用户 iii 所有样本的个数。AUC 是考虑所有样本的排名,而实际上,我们只要关注给每个用户推荐的广告的排序,因此GAUC更具有指导意义。

模型例子

例子是在 tensorflow2.0 的环境中使用了 deepctr 实现的 DIN 模型,deepctr 安装方式如下:

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)

DIN 模型至少需要传入两个参数,一个是 dnn_feature_columns , 用于对所有输入数据进行 embedding;另一个是 history_feature_list,用于指定历史行为序列特征的名字,例如 [“item_id”, “cate_id”]。

要特别注意的地方是:特征 f 的历史行为序列名为 hist_f 。例如要使用 ‘item_id’, ‘cate_id’ 这两个特征的历史行为序列数据,那么在构造输入数据时,其命名应该加上前缀“hist_” ,即 ‘hist_item_id’, ‘hist_cate_id’。

参考链接:

CTR预估–阿里Deep Interest Network

Deep Interest and Evolution Network for CTR

AI算法工程师手册/DIN

CTR深度学习模型之 DIN(Deep Interest Network) 的理解与例子相关推荐

  1. CTR深度学习模型之 DIEN(Deep Interest Evolution Network) 的理解与示例

    本文介绍阿里提出的兴趣进化网络(Deep Interest Evolution Network,以下简称DIEN. 前一篇文章介绍的 DIN 模型如下图所示: DIN 直接把用户的某个行为作为用户的兴 ...

  2. CTR深度学习模型之 DSIN(Deep Session Interest Network) 论文解读

    之前的文章讲解了DIEN模型:CTR深度学习模型之 DIEN(Deep Interest Evolution Network) 的理解与示例,而这篇文章要讲的是DSIN模型,它与DIEN一样都从用户历 ...

  3. CTR深度学习模型之 DeepFM 模型解读

    CTR 系列文章: 广告点击率(CTR)预测经典模型 GBDT + LR 理解与实践(附数据 + 代码) CTR经典模型串讲:FM / FFM / 双线性 FFM 相关推导与理解 CTR深度学习模型之 ...

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

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

  5. 阿里的CTR预测(二):Deep Interest Evolution Network

    这篇文章发布于2018年9月,是之前的DIN的改进版.我们在阿里的CTR预测(一):Deep Interest Network中提到过,他们尝试使用LSTM来学习序列化数据的特征,但是对DIN的结果没 ...

  6. 深度学习模型建立过程_所有深度学习都是统计模型的建立

    深度学习模型建立过程 Deep learning is often used to make predictions for data driven analysis. But what are th ...

  7. 深度学习核心技术精讲100篇(五)-通过CTR预估对比深度学习模型(deepfm)梯度提升模型(catboost)

    前言 CTR预估模型的特点: 毫无疑问这个任务的是个二分类任务,预测点击与否. CTR 预估的特征一般是 用户的日志特征和画像特征,包含类别特征和数值型特征两种. 此任务的评估指标是 AUC 得分 或 ...

  8. 异常检测中的浅层模型与深度学习模型综述(A Unifying Review of Deep and Shallow Anomaly Detection)

    A Unifying Review of Deep and Shallow Anomaly Detection 异常检测中的浅层模型与深度学习模型综述 摘要:随着众多异常检测方法(基于生成模型,单分类 ...

  9. CTR预估专栏 | 一文搞懂阿里Deep Interest Network

    作者 | 李宁宁 来源 | 机器学习荐货情报局(ID:ML_CIA) 编辑 | Vincent AI 前线导读:Deep Interest Network(DIN) 是盖坤大神领导的阿里妈妈的精准定向 ...

最新文章

  1. 设计模式之职责链模式、减小了因为分支带来的耦合
  2. python3下关于copy和deepcopy中的区别
  3. 存储和存储服务器的游戏
  4. putty 配置导出
  5. 国行iphone第一次安装APP网络状况
  6. rdb和aof优势劣势
  7. win10c语言错误,win10打开程序提示错误状态0xc0000020的原因和解决方法
  8. 六西格玛dfss_六西格玛系列知识之二:六西格玛管理的基本原理
  9. psycopg2.errors.UndefinedTable: relation “xxxx“ does not exist
  10. 初级开发人员的缺点_如何避免我作为初级开发人员犯的这7个错误
  11. conda不是内部文件或外部命令_Fastqc文件数据质量质检
  12. 95-110-020-源码-Env-StreamExecutionEnvironment
  13. matlab在振动信号处理中的应用_激光测振仪在超声变幅杆振动测试中的应用
  14. Centos7忘记mysql的root用户密码
  15. Oracle中rownum用法总结
  16. httpclient 连接池工具类_C# 中 HttpClient 的简单使用
  17. SqlLoader(Sqlldr) 的用法
  18. vivado使用入门
  19. 可靠性试验与环境试验概述
  20. xampp如何设置多虚拟主机访问

热门文章

  1. RHEL7恢复.bashrc文件
  2. ffmpeg java 使用_macos下ffmpeg使用及java调用
  3. 深度学习(四十二)——深度强化学习(5)PPO, IMPALA, Hierarchical RL, OpenAI
  4. a标签传值到另一个页面_前端开发入门——HTML基础标签
  5. http post请求 参数放在路径后面 java_「思唯网络学院」网络基本概念之HTTP协议...
  6. Java每天5道面试题,跟我走,offer有!(九)
  7. 八个老师随机分配三个办公室
  8. ACM 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 B. Train Seats Reservation
  9. angularjs 弹出框 $modal传值
  10. 《R语言数据挖掘》----1.15 结果可视化