1. 前言
点击率预估是推荐系统和互联网广告等场景的一个重点研究问题。随着深度学习的快速发展和应用,基于深度学习的点击率预估模型在以飞快的速度发展和迭代。深度兴趣网络(Deep Interest Network,DIN)是既FM和WDL之后又是一个里程碑的点击率预估模型,它最重要的创新思想就是对于目标商品,用户是否点击只和用户的历史行为的一部分有关系,而不是全部。
最近广告这边没什么大需求,同时本人又进行了一次推荐广告的串讲,广告场景中点击率预估目前主要用到了DIN模型,于是顺水推舟看了DIN论文。
2. 模型结构
2.1 base model
论文之前的点击率预估工作中,深度模型可以总结为:embedding层加上MLP。这种模型论文称之为基准模型(base model)。这种模型的优势是省去了繁琐的特征工程工作,缺点是将目标广告与用户历史上所有浏览过的商品联系在一起了。
在将特征传入神经网络前需要将特征进行预处理。文章将特征分为四类:用户特征(user profile feature)、用户行为特征(user behavior feature)、目标广告特征(ad feaure)和上下文特征(context feature)。用户行为特征就是选取一定量的用户浏览商品。离散特征进行one-hot编码。一些离散特征可以进行压缩处理,如年龄特征,每10岁对应一个值,用10位的one-hot向量表示年龄特征。
另外,论文中说用户行为特征中,形如shop_id的id特征可以将多个id映射成一个multi-hot编码向量,然后传给embedding层。但是文章给出的结构图中并非这样做的。图中先one-hot,再传给embedding层,再concat,然后会记性sum pooling。其实两者等价的操作。我们就按图中的方式理解,其实就是用户行为特征中每个浏览的商品为一个单位,将商品的shop_id、goods_id及cate_id等特征one-hot编码,然后concat成一个向量,用这样的向量表示用户行为特征中的每个商品。
(1)embedding层
该层负责将高维稀疏one-hot编码向量映射到低维密集向量(dense vector)中。
(2)池化层和连接层
用户行为特征中的每个商品的所有特征embedding向量连接成一个向量,即$k$个商品会得到$k$个向量。然后对这$k$个向量进行sum pooling,也就是向量的同纬度元素(element-wise)求和,最终得到一个表示用户行为特征的长向量。
用户行为特征向量再与其他特征的embedding向量进行concat&flaten,形成MLP的输入向量。
(3)MLP
这里损失函数用的是log损失:
$$
L=-\frac{1}{N}\sum_{(\textbf{x},y)\in{S}}(y\log{p(\textbf{x})}+(1-y)\log{(1-p(\textbf{x}))}
$$
2.2 DIN模型
DIN模型在基准模型的基础上,增加了一个激活单元,在保证用户行为多样性(diverse)的同时,实现了对于不同候选广告,局部激活(local activation)用户兴趣的特性。即为用户行为中每个商品与候选广告通过激活单元计算出一个激活权重。用户行为中的商品乘以权重再进行sum pooling。
激活单元是一个前馈网络,输入是商品的embedding向量和候选广告的embedding向量。进入单元后,两个向量求外积(out product),与两个向量本身concat形成神经网络输入层。最后输出层只有一个节点,即对隐层的输出带权求和,最终得到该商品的激活权重。注意,这里的外积并不是向量外积,而是指计算机定义的外积。在作者的实现开源代码中,商品向量和广告向量的元素相乘得到一个向量,元素相减得到一个向量,用这两个得到的向量作为外积,与商品向量和广告向量concat。
3. 训练技术
在提出DIN模型之外,论文提出了两个训练技术。一个是最小batch适度正则项,一个是DICE激活函数。作者给出的DIN源码中其实都没有用到这两个技术,可以说是作者在模型试验中得到的一些trick。对于DIN模型本身,并不是一块重要的内容。
神经网络参数多,而且在电商领域中,离散特征的值空间非常大,所以很容易过拟合。常用的L1和L2正则项很难学习。所以文章提出最小batch适度正则项。简单解释,就是对于每个batch,只调整(优化)batch中出现过的参数。并且对于出现频率大的id,参数调整的幅度越小,出现频率小的id,参数调整的越大。
而DICE激活函数事从PReLU激活函数改变而来。因为PReLU在0值上,导数是越界,直接从0到了1,不够圆滑,所以DICE函数在0附近进行了调整,使0值上的导数值为0.5。
4. 模型度量
AUC是点击率模型业内最认可的指标。在现实的电商场景中,每个用户的活跃度不一样,这就导致每个用户对于整体的点击率的贡献不一样。而我们用AUC评估模型的能力时并没有区分出用户对于整体效果的贡献程度。所以论文采用先计算验证集中每个用户的AUC,然后带上展现的权重求和得到最终的AUC。从而调整后的AUC能更好的表现出模型在活跃用户上的正负样本的区分能力。
$$
AUC=\frac{\sum_{i-1}^nimpression_i\times{AUC_i}}{\sum_{i-1}^nimpression_i}
$$
5. Q&A
- 内积和外积分别是什么
这里的内积和外积都指特指计算机计算中的方式,与数学上的向量内外积不同。
计算机向量内积与数学内积一样,就是点积:
$$
\textbf{a}\cdot{\textbf{b}}=a_1b_1+a_2b_2+a_3b_3
$$
计算机外积:
$$
\textbf{a}\times{\textbf{b}}=[a_1,a_2,a_3]^T\times[b_1,b_2,b_3]=\begin{bmatrix}
a_1b_1 & a_1b_2 & a_1b_3 \\
a_2b_1 & a_2b_2 & a_2b_3 \\
a_3b_1 & a_3b_2 & a_3b_3
\end{bmatrix}
$$
- 激活函数的意义是什么?
进行一次非线性映射, 激活部分输入。ReLU导数是一个值,学起来方便;sigmoid在绝对值很大时,导数很小,所以会学习慢。一般用在最后的输出层和一些0~1映射的地方。DIN开源代码中并没有使用DICE激活函数。
- step和epoch的区别
step是学习一个batch计为一个step。所有样本学习完一遍计为一个epoch。
References
[1] Deep Interest Network for Click-Through Rate Prediction
[2] https://github.com/zhougr1993/DeepInterestNetwork
[3] https://zhuanlan.zhihu.com/p/39439947