【推荐算法】单目标精排模型——DIN
key word:
阿里巴巴广告推荐
Motivation:传统的
Embedding&MLP
算法会在用户的不同兴趣上产生瓶颈,这些算法是通过模型输出的用户不同行为序列的特征向量,做一个池化操作最后预测点击率,这种固定的特征往往不能够反应用户不同的兴趣特征,池化操作会损失特征信息。例如在广告推荐系统中:一名游泳运动员会点击推荐的护目镜,主要是因为他买了泳衣,而不是他上周购物清单上的鞋子。因此在这篇文章中,提出了自适应计算用户的兴趣Embedding。
一、历史发展
作为初学者(笔者),对一个领域发展的了解的很重要的。这篇论文对模型自动化提取特征的发展进行了介绍,笔者也对其作一个学习过程记录
- LP-PLM & FM
这两种算法可以被看作是只包含了一层隐藏层的的网络,是首次采用embedding layer对稀疏输入进行变换的模型,旨在捕捉特征之间的联系。
- Deep Crossing & Wide&Deep & YouTube Recommendation CTR model
通过复杂的MLP网络替换掉
FM
,LP-PLM
的转换函数
- PNN
实现高阶的特征交互
- DeepFM
采用
FM
替换 Wide&Deep的 Wide 部分,从而不需要人工的选择稀疏向量
以上推荐模型,都可以被称为:Embedding&MLP
,这类推荐模型的特征处理模式一致:通过用户不同的行为序列特征向量,对不同的行为序列特征向量做一个池化操作,最后预测点击率,池化操作会丢失不同特征的信息,无法处理同一用户的不同兴趣。一般模型的架构如图所示:
- Embedding Layer
embedding层的本质就是训练得到一个输入向量表达矩阵\(D \times K\),其中\(D\)表示embedding层的维度,\(K\)表示输入的id个数,进入embedding层后根据id值的索引输出embedding向量;因此one-hot编码只有一个向量输出,而multi-hot编码有多个Embedding向量输出
学习参考链接:【词向量表示】Word2Vec原理及实现-CSDN博客
- Pooling Layer
由于物品的multi向量的“1”个数的不同,导致embedding的向量输出个数不同,对于用户的行为序列的特征,最后进行池化操作。
【弊端】:这种池化操作会导致用户的兴趣向量是对于不同的广告来说都是一样的,无法反映出面对不同广告的兴趣。
- Loss
交叉熵损失
二、创新点
Local activation unit
:解决对于不同广告用户的向量不变的问题;
Mini-batch Aware Regularization
:解决\(l_2\)正则化导致的计算量上涨的问题;
Data Adaptive Activation Function
:调整激活函数自适应不同输入的分布;
三、DIN模型
Local activation unit
该激活单元仅用在了用户行为序列的特征上,通过给定的候选广告和历史行为序列,自适应计算用户的Embedding表征
- 实现方式
其中,\(w_j\)是通过计算候选广告\(v_a\)与用户行为向量\(e_j\)通过前馈网络\(a(·)\)得到的激活权重
- 与
NMT
的区别
NMT
在输出时进行了softmax归一化,而该篇文章并没有使用归一化操作,这是由于输出的分数认为是用户对于物品的兴趣程度,而归一化的结果只能比较广告和用户行为序列的相对关系,而不能表示绝对强度。一个用户只有 30% 衣服、70% 电子,另一个用户的行为序列是 10% 衣服、90% 电子,归一化的结果是一样,归一化后无法表现出第二个用户更喜欢电子。
Mini-batch Aware Regularization
在SGD优化器下,只需要更新与当前 mini-batch非零稀疏特征相关的模型参数。但是一旦加入\(l_2\)正则化,所有的参数都需要被计算,导致大量的参数计算。这是由于加入了正则化后,每一个参数都需要增加一个损失惩罚项\(\frac{\lambda}{2}||\theta||^2\),每一个参数都要计算。为此,提出一种新的正则化方式,只需要对稀疏特征进行惩罚,无需对所有参数计算。
Data Adaptive Activation Function
- PReLU
dead ReLU
:ReLU
激活函数在训练过程中,负值的神经元永久性死亡
Leaky ReLU
:输入为负数时,采用固定斜率而不是永远为0
PReLU
是一种可学习的激活函数,设计目的是为了解决 ReLU 激活函数的一些局限性,尤其是输入分布不同或存在dead ReLU
问题时的表现。通过\(\alpha\)对负值动态调整,使得负值输入也能产生小的激活输出,从而避免死神经元问题,比Leaky ReLU
更加灵活
数学定义:
进一步可以写为:
该篇文章对\(p(s)\)进行了修正,指出PReLU
的零值时一个硬分割点,不适合不同分布的输入,因此,将\(p(s)\)修改,最终得到DICE
激活函数: