DIN
DIN利用注意力机制来捕捉用户历史行为与候选广告之间的相关性,从而为每个候选广告动态地调整用户行为特征的权重
应用场景:阿里巴巴的电商广告推荐
- 会有大量的用户历史行为信息
- 用户【兴趣】多种多样,并且变化多端
- 用户的【兴趣】往往蕴含在其【历史行为】中
- 对于用户点不点击当前的商品广告,很大程度上是依赖于他的历史行为的
设计思路
- 现有的深度学习模型都是通过embedding layer将大规模的稀疏特征投影为低维连续的嵌入向量,然后将向量拼接后输入到深度网络中进行预测,没有考虑不同特征对预测的影响程度不同
- 之前的模型都不包括用户历史行为,但实际上,用户历史行为中有许多有效信息:
- 一个用户可以对多种品类的东西感兴趣,即历史特征中有很多种类
- 并不是所有的历史特征,都对当前预估任务有效,有一些无关历史行为可能引入噪声
- 必须筛选出有效特征,并按照重要程度,分配相应权重
- 考虑用户的历史行为商品与当前商品广告的关联性(局部兴趣),模拟出用户对目标商品的感兴趣程度(注意力得分)
例子
目标商品:键盘
- A用户历史行为:化妆品,包包,衣服,洗面奶
- B用户历史行为:鼠标,电脑,iPad,手机
- C用户历史行为:鼠标,化妆品,衣服,洗面奶
用户历史行为中,有效特征是:
- A用户有效历史行为:
- B用户有效历史行为:鼠标,电脑,iPad,手机
- C用户有效历史行为:鼠标
目标商品: 口红
- A用户历史行为:化妆品,包包,衣服,洗面奶
- B用户历史行为:鼠标,电脑,iPad,手机
- C用户历史行为:鼠标,化妆品,衣服,洗面奶
用户历史行为中,有效特征是:
- A用户有效历史行为:化妆品,洗面奶
- B用户有效历史行为:
- C用户有效历史行为:化妆品,洗面奶
基本思想
DIN利用注意力机制来捕捉用户历史行为与候选广告之间的相关性,从而为每个候选广告动态地调整用户行为特征的权重。
具体来说,在Embedding层与MLP之间加入注意力机制,利用候选商品和历史行为商品之间的相关性计算出一个权重
- 不同应用场景下,特征的权重不同
- 筛选出有用特征,并分配好权重,重要的历史特征分配更大权重
输入特征
分为两大部分,一部分是用户u的特征组,另一部分是候选广告a的特征组。
- 用户画像
- 用户行为特征
- 广告特征:
- 上下文特征
无论是用户还是广告,都含有两个非常重要的特征商品id和商铺 id。用户特征里的商品 id是一个序列,代表用户曾经点击过的商品集合,商铺id同理;而广告特征里的商品id和商铺id就是广告对应的商品 id和商铺 id。
用户行为特征用的是multi-hot,它与one-hot的不同之处在于:
- One-hot编码每个类别对应一个唯一的二进制位,整个向量中只有一个位置是1,其余都是0
- Multi-hot编码在一个向量中,可以有多个位置是1,表示样本属于多个类别,在这里,Multi-hot编码可以表示用户查看过的商品,因为商品不止一个,所以用Multi-hot编码
Base模型
网络结构
- Embedding 层:首先将用户特征和商品特征等稀疏特征通过Embedding层转化为低维稠密向量
- SUM Pooling:用户的行为序列长度不同,sum pooling可以将不同长度的行为序列通过求和操作转化为固定长度的向量,使得可以被全连接层处理。而且sum pooling对多个商品的embedding向量在每个对应的维度上做求和,可以实现降维。
- 如果用户点击序列有10个商品,每个商品的embedding维度是16,那么分别在第1到16维上,对10个值求和,从而得到一个固定维度的向量
- 全连接层(MLP):特征拼接后输入到多层DNN网络,最后预测得到用户对当前目标ADs的点击概率。
缺点:
- 用户的历史行为特征和当前的候选广告特征在全都拼起来给神经网络之前,没有交互的过程
- 拼起来之后给神经网络,丢失了部分重要信息,也引入了一定的噪声(无关信息),没有筛选重要的特征
DIN网络结构
DIN模型的网络结构如下:
DIN模型的数学公式如下:
DIN在Base模型的基础之上改进了两个缺点:
- DIN模型引入注意力机制(Attention Mechanism),模型中的“Attention Unit”会计算候选广告与用户历史行为中每个行为的关联性,生成相关性权重得分。权重得分反映了候选广告与用户历史行为的匹配程度。
- DIN模型用Attention Unit的得分和用户历史行为特征进行加权求和(Weighted Sum Pooling),而非简单的求和或平均,这样就能够根据候选广告的不同,动态地给予不同的历史行为不同的权重。与候选广告相关性高的行为会被赋予更高的权重,而相关性低的行为权重则较低,这样既保留了重要信息,又减少了无关信息带来的噪声。
训练方式
小批量感知正则化 Mini-batch Aware Regularization
面临问题
- 为防止过拟合,通常做法是L1、L2、Dropout等,但是论文中尝试之后效果都不是很好
- 用户数据符合长尾定律,在数据集当中,出现次数很多的往往是一小部分热门特征,大多数冷门特征只出现了几次,容易加重过拟合
解决思路
1 对每个小批量中出现的稀疏特征参数进行L2-范数的计算(如果特征全是0,就不用计算参数)
2 自适应正则:针对特征出现的频率,自适应的调整他们的正则化强度(出现频率高的,给予小的正则化强度;出现频率低的,给予大的正则化强度)
数学表达式
全局表示:
其中,K是onehot编码之后的特征维度,S是全局样本, x j x_j xj是第j个特征值, n j n_j nj是 x j x_j xj出现( x j = 1 x_j = 1 xj=1)的次数
mini batch:
近似:
数据自适应激活函数 Data Adaptive Activation Function
ICS问题(Internal Covariate Shift )
Internal Covariate Shift指的是在训练过程中,由于每层的参数更新,导致每层输入分布的变化。这种分布的变化会导致训练不稳定,增加训练时间,甚至导致模型无法收敛。
PReLu激活函数
常用PReLU作为激活函数,PReLU(Parametric Rectified Linear Unit)是ReLU的一种变体,旨在解决ReLU的死亡ReLU问题,即当输入为负时,ReLU的输出为0,导致梯度消失
PReLU通过引入一个可学习的参数来调整负输入的斜率,使得模型在处理负输入时也能保持一定的梯度
PReLU函数的公式如下:
f
(
s
)
=
p
(
s
)
⋅
s
+
(
1
−
p
(
s
)
)
⋅
α
s
,
p
(
s
)
=
I
(
s
>
0
)
f(s) = p(s) \cdot s + (1 - p(s)) \cdot \alpha s,p(s) =I(s>0)
f(s)=p(s)⋅s+(1−p(s))⋅αs,p(s)=I(s>0)
但是当数据分布集中在小于0的区间,梯度值小,参数更新将变得很缓(梯度消失)
解决方案——Dice激活函数
提出Dice:Dice是PReLU的一种改进,思想是据输入数据的分布来自适应调整激活函数参数,让激活函数适应数据分布
Dice函数的关键思想是根据输入数据的分布来自适应调整激活函数的阈值点(即均值 E [ s ] E[s] E[s]),并且平滑地在两个通道之间切换。当 E [ s ] = 0 E[s] = 0 E[s]=0 且 V a r [ s ] = 0 Var[s] = 0 Var[s]=0 时,Dice函数退化为PReLU。
Dice函数的公式如下:
f
(
s
)
=
p
(
s
)
⋅
s
+
(
1
−
p
(
s
)
)
⋅
α
s
,
p
(
s
)
=
1
1
+
e
−
s
−
E
[
s
]
V
a
r
[
s
]
+
ϵ
f(s) = p(s) \cdot s + (1 - p(s)) \cdot \alpha s,p(s) = \frac{1}{1 + e^{-\frac{s - E[s]} {\sqrt{Var[s] + \epsilon}}}}
f(s)=p(s)⋅s+(1−p(s))⋅αs,p(s)=1+e−Var[s]+ϵs−E[s]1
其中,
p
(
s
)
p(s)
p(s) 是一个控制函数,
E
[
s
]
E[s]
E[s] 和
V
a
r
[
s
]
Var[s]
Var[s] 分别是激活函数输入的均值和方差,
ϵ
\epsilon
ϵ 是一个很小的常数,用于防止分母为零。
- 在训练阶段, E [ s ] E[s] E[s] 和 V a r [ s ] Var[s] Var[s] 是基于每个小批量(mini-batch)的输入数据计算得到的;
- 在测试阶段,它们是基于数据的移动平均值来计算的。
参考
深度学习推荐系统(王喆)
【深度学习推荐模型】DIN模型