论文《Deep Interest Evolution Network for Click-Through Rate Prediction》

192 阅读5分钟

阿里DIEN

摘要里面表示很多CTR模型都将用户历史行为的向量表示直接作为用户兴趣,没有对用户这些行为背后的隐兴趣进行建模;此外很少有工作考虑用户的兴趣的变化趋势。DIEN设计了兴趣抽取层从历史行为序列中捕获用户隐式兴趣,设计了兴趣进化层建模用户兴趣变化。

简介中,介绍前人工作多是关注不同特征域的特征交叉,很少关注用户兴趣表示,DIN使用attention机制来捕获用户不同兴趣和目标item的相关性,但是这些模型都是将历史行为序列直接当做用户兴趣,没有去挖掘这些行为序列背后的用户真正的兴趣,而且用户兴趣是变化的,捕获用户动态变化的兴趣也十分重要。 DIEN中有2个关键模块,一个是从用户显式行为序列中抽取用户隐式的兴趣,另一个是建模用户兴趣进化过程。在兴趣抽取层,DIEN使用GRU建模用户行为之间的依赖,提出了使用下一个行为来监督当前hidden state的学习的辅助loss,有额外监督的hidden state称为兴趣state,即用户的隐式兴趣。用户兴趣是多样化的,会导致兴趣飘逸现象:用户在相邻的行为这意图可能差异巨大,用户产生一个行为可能依赖于很久之前产生的一个历史行为,每个兴趣都有自己的进化过程。基于兴趣提取层抽取的兴趣序列,使用带attention update gate的GRU来建模用户的兴趣进化轨迹,计算兴趣state和目标item的相关性来加强相关兴趣的影响,降低不相关兴趣的影响。

在相关工作中,很多工作关注特征的交互,Wide&Deep和DeepFM结合低阶特征和高阶特征提升表达效果,PNN有个点积层捕获不同类别特征的交叉,这些模型没有明确的反映用户的兴趣。DIN使用attention来激活历史序列,但是没法捕获这些序列之间的依赖关系。TDSSM结合长期和短期的历史序列来提升推荐质量,DRAEM使用RNN来研究每个用户的动态表示,ATRank使用基于attention的序列框架建模不同的用户行为。

基线模型

四类特征,用户画像、用户行为、item(ad)特征、上下文特征,分别表示为xp,xb,xa,xc\mathbf x_p,\mathbf x_b,\mathbf x_a,\mathbf x_c,每个行为都是一个one-hot的向量表示,用户行为特征xb=[b1;b2;...;bT]RK×T\mathbf x_b = [\mathbf b_1;\mathbf b_2;...;\mathbf b_T] \in R^{K \times T},bt{0,1}K\mathbf b_t \in \{0,1\}^{K}其中KK表示有行为的商品总量,TT表示用户行为序列长度。

Embedding

每个特征域对应一个Embedding矩阵,例如用户行为序列Embedding矩阵Egoods=[m1;m2;...;mK]RnE×K\mathbf E_{goods} = [\mathbf m_1;\mathbf m_2;...;\mathbf m_K] \in R^{n_E \times K},总共有KK个行为(商品),nEn_E表示每个行为embedding的维度。对于指定用户,用户行为的Embedding矩阵eb=[mj1;mj2;...;mjT]RnE×T\mathbf e_b = [\mathbf m_{j_1};\mathbf m_{j_2};...;\mathbf m_{j_T}] \in R^{n_E \times T},其他各个域类似。

MLP

先对行为序列做pooling操作,然后拼接到一起,作为MLP的输入

Loss

Ltarget=1N(x,y)DN(ylog(p(x))+(1y)log(1p(x)))L_{target} = - \frac {1} {N} \sum_{(\mathbf x, y) \in D}^N ( y \log (p(\mathbf x)) + (1-y) \log (1 - p(\mathbf x)) ) x=[xp;xb;xa;xc]\mathbf x = [\mathbf x_p;\mathbf x_b;\mathbf x_a;\mathbf x_c],y{0,1}y \in \{0,1\}

DIEN

Interest Extractor Layer

使用GRU来提取兴趣 在这里插入图片描述 Wu,Wr,WhRnH×nI\mathbf W^u,\mathbf W^r,\mathbf W^h \in R^{n_H \times n_I}Uu,Ur,UhRnH×nH\mathbf U^u,\mathbf U^r,\mathbf U^h \in R^{n_H \times n_H}nHn_H表示隐层维度,nIn_I表示输入维度,it=eb[i]\mathbf i_t=\mathbf e_b[i]是GRU的输入,ht\mathbf h_t表示第tt个hidden state。

因为用户行为target item时通过最后一个兴趣触发的,因此能对最后一个兴趣state进行label监督,但是中间的兴趣状态ht(t<T)\mathbf h_t(t<T)没有相应的监督信号。DIEN兴趣提取层使用一个辅助的loss,用t+1的用户行为bt+1\mathbf b_{t+1}监督兴趣状态ht\mathbf h_t的学习,即用下一个真实的用户行为作为正例。同时从item集合(去除正例行为)中采样一个出来作为负例,有NN个行为Embedding 序列pair对\{ \mathbf e^i_b, \hat \mathbf e^i_b\},i = 1,2,...,N,其中ebiRT×nE\mathbf e^i_b \in R^{T \times n_E}表示点击的序列Embedding,\hat \mathbf e^i_b \in R^{T \times n_E}表示负采样的序列Embedding,TT是行为长度,nEn_E是行为Embedding的维度。

Loss

Laux=1N(i=1Ntlog(σ(htebi[t+1]))+log(1σ(htebi[t+1])))L_{aux} = - \frac {1} {N}( \sum_{i=1}^N \sum_t \log ( \sigma (\mathbf h_t \mathbf e_b^i[t+1]) ) + \log ( 1- \sigma (\mathbf h_t \mathbf e_b^i[t+1]) ) ) σ(x1,x2)=11+exp([x1,x2])\sigma (\mathbf x_1, \mathbf x_2) = \frac {1} { 1 + exp(- [\mathbf x_1, \mathbf x_2])} L=Ltarget+αLauxL = L_{target} + \alpha * L_{aux}

辅助loss使得每一个hidden state ht\mathbf h_t都能表示兴趣state 在这里插入图片描述

Interest Evolving Layer

用户的兴趣在随时间逐渐变化,兴趣在进化过程中有2个特点:

  1. 因为兴趣的多样性,兴趣可能会发生漂移,用户可能在一段时间内喜欢书籍,另外一段时间喜欢衣服。
  2. 兴趣互相影响,但是每个兴趣有自己的进化过程,例如对书籍的兴趣和对衣服的兴趣,DIEN仅关注进化过程中兴趣和target item的相关性。

使用it\mathbf i_t^{'}ht\mathbf h_t^{'}表示兴趣进化层的输入状态和隐层状态,兴趣进化层的输入it\mathbf i_t^{'}对应兴趣提取层的隐层状态ht\mathbf h_tit=ht\mathbf i_t^{'} = \mathbf h_t,attention分数可以表示为 at=htWeaj=1ThjWeaa_t = \frac { \mathbf h_t \mathbf W \mathbf e_a } { \sum_{j = 1}^T \mathbf h_j \mathbf W \mathbf e_a } 其中ea\mathbf e_a表示广告(target item)Embedding向量,WRnH×nA\mathbf W \in R^{n_H \times n_A},nHn_H表示hidden的维度,nAn_A表示广告Embedding的维度。

三种结合attention机制和GRU的方式

  1. GRU with attentional input (AIGRU) 直接用户attention分数(标量)乘以兴趣提取层的hidden state向量,这样不相关的兴趣因为attention分数小会减弱其相应的影响。但是效果不会好,因为即输入是零,也会改变GRU的hidden state,这样不相关的兴趣还是会影响兴趣进化过程。 it=atht\mathbf i_t^{'} = a_t * \mathbf h_t
  2. Attention based GRU(AGRU),使用attention分数替换GRU的更新门 \mathbf h_t^{'} = a_t * \mathbf h_{t-1}^{'} + (1-a_t) * \tilde \mathbf h_{t-1}^{'}
  3. GRU with attentional update gate (AUGRU)不替换更新gate,但是用attention分数改变更新gate \tilde \mathbf u_{t}^{'} = a_t * \mathbf u_{t}^{'} \mathbf h_t^{'} = (1 - \tilde \mathbf u_{t}^{'} ) \circ \mathbf h_{t-1}^{'} + (\tilde \mathbf u_{t}^{'}) \circ \tilde \mathbf h_{t-1}^{'} 在这里插入图片描述