点击率预估论文阅读笔记

251 阅读6分钟

背景

点击率预估(Click Through Rate Prediction)是广告和推荐系统中的核心工作之一。在广告系统中,当用户发起广告请求后,系统需要从全量广告集合中召回相关的若干条候选广告,并对于每个候选广告预估其点击率,最后通过一定的排序公式(如使用点击率乘以出价作为排序分进行排序),筛选排序靠前的候选广告作为最终胜出的广告向用户曝光。

早期,Logistic回归模型由于其解释性好、易于工程实现的优点被广泛应用于点击率预估,而随着深度学习的发展,深度学习逐渐被应用于点击率预估,并在模型结构上不断演进,其中有一系列工作不只考虑单次广告请求的上下文和候选广告的特征,还会考虑用户历史行为的特征,基于深度学习对用户兴趣进行建模。本文是对这一系列工作的论文阅读笔记,如有不足之处,请大家多指正。

DIN

2018年阿里妈妈发表的论文《Deep Interest Network for Click-Through Rate Prediction》提出了DIN算法。DIN算法将用户历史行为中的商品的Embedding向量作为用户兴趣的表征。由于不同用户历史行为长度不同,涉及的商品数目不同,因此需要将不同数目的商品的Embedding向量通过池化汇总为一个Embedding向量,以满足多层神经网络输入维度固定的要求,而池化会限制用户兴趣的表达,另外,用户兴趣是多样化的,比如某男性用户历史上可能陆续购买过手机和运动鞋,若候选广告是平板电脑,则购买手机这一历史行为所表征的用户兴趣和候选广告更相关,应该有更多的权重,基于这一原则,DIN算法引入注意力机制,计算历史行为中的商品的Embedding向量和候选广告的注意力得分,并基于注意力得分对历史行为中的商品的Embedding向量进行加权求和池化,从而挖掘和候选广告相关的用户兴趣,并满足多层神经网络输入维度固定的要求

论文首先介绍了基线模型,即将用户历史行为中的商品的Embedding向量作为用户兴趣的表征,通过池化汇总为一个Embedding向量,最后和其他特征的Embedding向量拼接在一起,输入多层神经网络,最后通过一个Softmax函数输出预估点击率,论文称该模型为“Embedding & MLP”模型。基线模型如图1左侧所示。

图1 基线模型和DIN的网络结构

基线模型特征包括四类:用户画像(User Profile)、用户行为(User Behavior)、候选广告(Candidate Ad)、上下文(Context),这些特征会被编码为高维离散二值特征,令第ii个特征表示为tiRKit_i \in R^{K_i}KiK_i表示其维度,即特征值基数,ti[j]t_i[j]表示特征tit_i的第jj个元素,并且ti[j]{0,1}t_i[j] \in \{0, 1\}j=1Kiti[j]=k\sum_{j=1}^{K_i}{t_i[j]}=k,若k=1k=1,则tit_i为独热编码(one-hot encoding),若k>1k>1,则tit_i为多热编码(multi-hot encoding)。一个样本可以表示成x=[t1T,t2T,...tMT]Tx=[t_1^T, t_2^T, ... t_M^T]^T,其中MM是特征数,i=1MKi=K\sum_{i=1}^M{K_i}=KKK是整个特征空间的维度。例如样本:

[weekday=Friday,gender=Female,visited_cate_ids={Bag,Book},ad_cate_id=Book][weekday=Friday, gender=Female, visited\_cate\_ids=\{Bag, Book\}, ad\_cate\_id=Book]

可以表示为:

[0,0,0,0,1,0,0]weekday=Friday[0,1]gender=Female[0,...,1,...,1,...,0]visited_cate_ids={Bag,Book}[0,...,1,...,0]ad_cate_id=Book\underbrace{[0, 0, 0, 0, 1, 0, 0]}_{weekday=Friday}\underbrace{[0, 1]}_{gender=Female\quad}\underbrace{[0, ..., 1, ..., 1, ..., 0]}_{visited\_cate\_ids=\{Bag, Book\}\quad}\underbrace{[0, ..., 1, ..., 0]}_{ad\_cate\_id=Book}

通过Embedding层将高维离散二值特征转化为低维稠密矩阵,对于特征tit_i,令Wi=[w1i,...,wji,...,wKii]RD×KiW^i=[w_1^i, ..., w_j^i, ..., w_{K_i}^i] \in R^{D \times K_i}表示tit_i的Embedding字典,其中,wjiRDw_j^i \in R^D表示D维的Embedding向量,Embedding计算其实就是Table Lookup操作:

  • 如果特征tit_i是独热编码且ti[j]=1t_i[j]=1,那么tit_i在Embedding计算后即得到Embedding向量ei=wjie_i=w_j^i;
  • 若果特征tit_i是多热编码且对于j{i1,i2,...,ik}j \in \{i_1, i_2, ..., i_k\}ti[j]=1t_i[j]=1,那么tit_i在Embedding计算后即得到一组Embedding向量{ei1,ei2,...,eik}={wi1i,wi2i,...,wiki}\{e_{i_1}, e_{i_2},..., e_{i_k}\}=\{w_{i_1}^i, w_{i_2}^i, ..., w_{i_k}^i\}

例如,若特征tit_i表示用户浏览过的商品id,则tit_i是多热编码,对于ti[j]=1t_i[j]=1,则表示商品jj被用户浏览过,且{ei1,ei2,...,eik}\{e_{i_1}, e_{i_2},..., e_{i_k}\}为商品{i1,i2,...,ik}\{i_1, i_2, ..., i_k\}相应的Embedding向量。 不同用户有不同的商品浏览行为,因此不同样本多热编码特征tit_i的Embedding向量组是变长的,而全连接网络只能处理固定长度的输入,因此需要通过一个池化层将Embedding向量组转化为固定长度向量:

ei=pooling(ei1,ei2,...,eik)e_i = \text{pooling}(e_{i_1}, e_{i_2}, ..., e_{i_k})

常用池化方式包括求和池化和平均池化。在基线模型中,用户行为特征使用已浏览过的若干个商品,而每个商品的特征包括商品id、商品店铺id、商品品类id。对每个商品的商品id、商品店铺id、商品品类id进行Embedding计算后再拼接在一起得到商品的Embedding向量。再通过对所有浏览过的商品Embedding向量进行求和池化得到用户行为特征的Embedding向量。最后再将所有特征的Embedding向量拼接在一起,组成样本的向量表示。 将上述拼接好的样本向量输入到多层全连接网络。该网络加上输入层共4层。输入层共有16种特征,每种特征的Embedding向量是12维,因此输入层共有192个输入。中间两层分别有200和80个单元,每个单元采用PReLU作为激活函数。最后一层为Softmax层。模型的损失函数采用负对数似然函数:

L=1N(x,y)S(ylogp(x)+(1y)log(1p(x)))L=-\frac{1}{N}\sum_{(x,y)\in\mathcal{S}}{(y\log p(x)+(1-y)\log(1-p(x)))}

其中,S\mathcal{S}表示训练样本集,大小为NNyy为样本标记(广告是否点击),p(x)p(x)为模型最后Softmax层输出的预估点击率。

在基线模型中,用户行为特征通过对浏览过的各商品的Embedding向量求和池化得到,并没有考虑这些商品与候选商品的相关性,因此,DIN引入了Attention机制,如图1右侧所示。相对于基线模型,DIN引入局部激活单元(Activation Unit),通过引入加权求和池化来计算给定候选广告AA时的用户行为特征:

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}^H{a(e_j, v_A)e_j}=\sum_{j=1}^H{w_j e_j}

其中{e1,e2,...,eH}\{e_1, e_2, ..., e_H\}是用户UU行为特征的Embedding向量组(即浏览过的商品Embedding向量),vAv_A是候选广告(即商品)AA的Embedding向量,即对每个浏览过的商品,设置一个Activation Unit,将浏览过的商品Embedding向量和候选商品Embedding向量作为输入。Activation Unit输出每个浏览过商品的权重wjw_j,使用该权重叉乘浏览过商品的Embedding向量进行加权后再进行求和池化。在Activation Unit内部,对浏览过商品的Embedding向量和候选商品的Embedding向量进行外积计算后再和上述两者拼接后输入两层全连接网络,第一层有36个单元,每个单元采用PReLU或Dice(后面详述)作为激活函数,第二层为Linear层。各种特征拼接后输入的全连接网络和基线模型类似,但设计了新激活函数Dice并取得了更好的效果。对于Activation Unit输出每个浏览过商品的权重,论文中提到,不同于其他Attention机制,这里对权重不作归一化来限制iwi=1\sum_i{w_i}=1,这么做的好处是可以保留浏览过商品和候选商品相关性的密度,例如,某男性用户历史行为大部分和数码有关、少部分和男装相关,那么候选广告为平面电脑时的vu(A)v_u(A)值应大于候选广告为T恤时的vu(A)v_u(A)值,即用户对前者的兴趣大于对后者的兴趣。

DIEN

2019年阿里妈妈发表的论文《Deep Interest Evolution Network for Click-Through Rate Prediction》提出了DIEN算法。前述的DIN算法将用户历史行为中的商品的Embedding向量直接作为用户兴趣的表征,并通过注意力机制计算历史行为中的商品的Embedding向量和目标商品的注意力得分,并基于注意力得分对历史行为中的商品的Embedding向量进行加权求和,从而挖掘历史行为中和目标商品相关的用户兴趣的表征。DIEN在此基础上,首先通过兴趣抽取层,使用RNN对用户行为序列进行建模,将RNN输出的隐状态作为兴趣表征,将行为序列转化为兴趣表征序列,再通过兴趣演进层,引入注意力机制计算用户各阶段兴趣表征和候选广告的注意力得分,并结合注意力得分和RNN,对用户和候选广告相关的兴趣演进过程进行建模,得到用户和候选广告相关的兴趣演进表征。

论文首先介绍了特征和基线模型。基线模型和DIN中的基线模型基本一致,不再详述。特征也和DIN中的特征基本一致,包括四类:用户画像(性别、年龄等)、用户行为(已浏览商品id)、候选广告(广告id、店铺id等)、上下文(广告请求时间等)。这四类特征经过独热编码后的特征向量分别用xp\text{x}_pxb\text{x}_bxa\text{x}_axc\text{x}_c表示,其中,xb=[b1;b2;,bT]RK×T\text{x}_b=[\text{b}_1;\text{b}_2;\dots,\text{b}_T]\in\mathbb{R}^{K\times T}TT表示用户行为的次数,KK表示所有商品数,bt\text{b}_t表示用户第tt次行为浏览商品的独热编码,bt[jt]=1\text{b}_t[j_t]=1表示用户第tt次行为浏览了第jtj_t个商品。令所有商品的Embedding字典为Egoods=[m1;m2;;mK]RnE×K\text{E}_{goods}=[\text{m}_1;\text{m}_2;\dots;\text{m}_K]\in\mathbb{R}^{n_E\times K},其中第jjmjRnE\text{m}_j\in\mathbb{R}^{n_E}即表示商品jj的Embedding向量,Embedding向量维度为nEn_E,则用户行为特征经过Embedding计算后的Embedding向量可表示为eb=[mj1;mj2;;mjT]\text{e}_b=[\text{m}_{j_1};\text{m}_{j_2};\dots;\text{m}_{j_T}],相应的,用户画像、候选广告、上下文这三类特征经过Embedding计算后的Embedding向量分别用ep\text{e}_pea\text{e}_aec\text{e}_c表示。模型的损失函数也采用负对数似然函数:

Ltarget=1N(x,y)DN(ylogp(x)+(1y)log(1p(x)))L_{target}=-\frac{1}{N}\sum_{(\text{x},y)\in\mathcal{D}}^N{(y\log p(x)+(1-y)\log(1-p(x)))}

其中,x=[xp,xa,xc,xb]D\text{x}=[\text{x}_p,\text{x}_a,\text{x}_c,\text{x}_b]\in\mathcal{D}D\mathcal{D}表示训练样本集,大小为NNyy为样本标记(广告是否点击),p(x)p(x)为模型最后Softmax层输出的预估点击率。

图2 DIEN网络结构

DIEN的网络结构如图2所示,和DIN保持一致的部分是Embedding层和全连接网络层,优化创新的部分是用户兴趣演进过程的挖掘,其包含两部分:第一部分是兴趣抽取层(Interest Extractor Layer),将用户行为序列转化为兴趣序列,第二部分是兴趣演进层(Interest Evolving Layer),对兴趣演进过程中与候选广告相关的部分进行建模。

在兴趣抽取层(图2中黄色部分)中,论文使用RNN对用户行为序列进行建模,将RNN输出的隐状态作为兴趣表征。RNN逐个处理每次用户行为bt\text{b}_t,第 tt次用户行为的隐状态ht\text{h}_t由当前行为的Embedding向量eb[t]\text{e}_b[t]和前序行为的隐状态ht1\text{h}_{t-1}计算得出:

ht=H(eb[t],ht1), t[0,T]\text{h}_t=\mathcal{H}(\text{e}_b[t],\text{h}_{t-1}),\space t\in[0,T]

其中,H\mathcal{H}表示RNN的网络结构,具体实现采用了门控循环单元(Gated Recurrent Unit,GRU),其能够解决传统RNN中梯度计算、矩阵连乘导致的梯度消失或梯度爆炸问题。GRU的网络结构如图3,其引入重置门(Reset Gate)和更新门(Update Gate)这两个元素大小在(0,1)(0,1)区间的向量,通过其控制新状态中旧状态的比例。

图3 GRU的网络结构

tt次用户行为的隐状态ht\text{h}_t的具体计算过程如下。令it=eb[t]\text{i}_t=\text{e}_b[t]表示GRU的输入,itRnE\text{i}_t\in\mathbb{R}^{n_E},重置门rt\text{r}_t由下式计算:

rt=σ(Writ+Urht1+br)\text{r}_t=\sigma(W^r\text{i}_t+U^r\text{h}_{t-1}+\text{b}^r)

其中,σ\sigma为Sigmoid函数,WrRnH×nEW^r\in\mathbb{R}^{n_H\times n_E}UrRnH×nHU^r\in \mathbb{R}^{n_H\times n_H}brRnH\text{b}^r\in\mathbb{R}^{n_H}。 更新门ut\text{u}_t由下式计算:

ut=σ(Wuit+Uuht1+bu)\text{u}_t=\sigma(W^u\text{i}_t+U^u\text{h}_{t-1}+\text{b}^u)

其中,σ\sigma为Sigmoid函数,WuRnH×nEW^u\in\mathbb{R}^{n_H\times n_E}UuRnH×nHU^u\in \mathbb{R}^{n_H\times n_H}buRnH\text{b}^u\in\mathbb{R}^{n_H}。 候选隐状态h~t\tilde{\text{h}}_t由下式计算:

h~t=tanh(Whit+rtUhht1+bh)\tilde{\text{h}}_t=\tanh(W^h\text{i}_t+\text{r}_t\circ U^h\text{h}_{t-1}+\text{b}^h)

其中,\circ表示Hadamard积(按元素逐个相乘),WhRnH×nEW^h\in\mathbb{R}^{n_H\times n_E}UhRnH×nHU^h\in \mathbb{R}^{n_H\times n_H}bhRnH\text{b}^h\in\mathbb{R}^{n_H} 最终隐状态ht\text{h}_t由下式计算:

ht=(1ut)ht1+uth~t\text{h}_t=(1-\text{u}_t)\circ\text{h}_{t-1}+\text{u}_t\circ\tilde{h}_t

为了能让隐状态ht\text{h}_t更准确地表征用户兴趣,论文引入了多任务学习思想,基于每一步的用户兴趣表征ht\text{h}_t直接影响下一步的用户行为这一假设,使用ht\text{h}_t对下一步的商品eb[t+1]\text{e}_b[t+1]是否被用户点击进行预测,采用Logistic回归预估点击率:

σ(ht,eb[t+1])\sigma(\text{h}_t,\text{e}_b[t+1])

而如何构造上述辅助任务的训练样本集,论文构造NN个用户的历史行为序列对{ebi,e^bi}DB\{\text{e}_b^i,\hat{\text{e}}_b^i\}\in\mathcal{D}_{\mathcal{B}}i1,2,,Ni\in 1,2,\dots,N,对于第ii个用户,ebiRT×nE\text{e}_b^i\in\mathbb{R}^{T\times n_E}即用户历史点击、浏览的商品的Embedding向量序列,而e^biRT×nE\hat{\text{e}}_b^i\in\mathbb{R}^{T\times n_E}是在全部商品中排除用户历史点击、浏览的商品后再采样得到的商品的Embedding向量序列。基于上述训练样本集,辅助任务的损失函数也采用负对数似然函数:

Laux=1N(i=1Ntlogσ(hti,ebi[t+1])+log(1σ(hti,e^bi[t+1])))L_{aux}=-\frac{1}{N}{(\sum_{i=1}^N{\sum_t{\log\sigma(\text{h}_t^i,\text{e}_b^i[t+1])+\log(1-\sigma(\text{h}_t^i,\hat{e}_b^i[t+1]))}})}

最终,整个模型的损失函数为:

L=Ltarget+αLauxL=L_{target}+\alpha*L_{aux}

其中,α\alpha作为超参,用于权衡点击率预估和用户兴趣表征的准确性。论文指出,引入辅助任务和损失,不仅能促进隐状态更准确地表征用户兴趣,还能缓解RNN反向传播时梯度消失的问题,并为Embedding层的训练提供更多的有监督信息。

用户的兴趣是多样化的,比如某男性用户既对数码产品感兴趣,也对男装感兴趣,并且用户不同类别的兴趣是独立演进的,比如某男性用户在数码产品方面可能一段时间对手机感兴趣,另一段时间对耳机感兴趣,因此,在兴趣抽取层使用RNN对用户行为序列进行建模,将RNN输出的隐状态作为兴趣表征后,DIEN进一步在兴趣演进层(图2中红色部分)中,引入注意力机制计算用户各阶段兴趣表征和候选广告的注意力得分,并结合注意力得分和RNN,对用户和候选广告相关的兴趣演进过程进行建模,得到用户和候选广告相关的兴趣演进表征。

用户各阶段兴趣表征和候选广告的注意力得分采用如下公式计算:

at=exp(htWea)j=1Texp(hjWea)a_t=\frac{\exp(\text{h}_tW\text{e}_a)}{\sum_{j=1}^T{\exp(\text{h}_jW\text{e}_a)}}

其中,WRnH×nAW\in\mathbb{R}^{n_H\times n_A}nAn_A是候选广告的Embedding向量ea\text{e}_a的维度。 在得到注意力的基础上,DIEN进一步将兴趣抽取层RNN各步输出的隐状态ht\text{h}_t作为兴趣演进层RNN各步的输入it\text{i}_t'。兴趣演进层RNN的具体实现也采用GRU,但如何结合注意力得分和GRU,论文提出了三种方案。 第一种方案是直接对输入进行注意力得分加权:

it=htat\text{i}_t'=\text{h}_t*a_t

该方案被称为AIGRU(GRU with attentional input)。

第二种方案是使用注意力得分替换更新门,用于从候选隐状态和前述隐状态计算当前隐状态:

ht=(1αt)ht1+αth~t\text{h}_t'=(1-\alpha_t)*\text{h}_{t-1}'+\alpha_t*\tilde{\text{h}}_t'

该方案被称为AGRU(Attention based GRU)。

更新门是一个向量,而注意力得分是一个标量,使用注意力得分替换更新门会忽略隐状态各维度信息的差异性,因此论文提出了第三种方案,先对更新门使用注意力得分进行加权,再使用加权后的更新门计算当前隐状态:

u~t=atut\tilde{\text{u}}_t'=a_t*\text{u}_t'
ht=(1u~t)ht1+u~th~t\text{h}_t'=(1-\tilde{\text{u}}_t')\circ\text{h}_{t-1}'+\tilde{\text{u}}_t'\circ \tilde{\text{h}}_t'

即注意力得分较少、和候选广告不相关的兴趣的更新门的值较小,该兴趣在当前隐状态中的占比也较小,该方案被称为AUGRU(GRU with attentional update gate)。从论文后续的实验结果来看,也是三个方案中的AUGRU的AUC最高。

DIEN通过兴趣演进层得到兴趣演进表征后,再将其与用户画像、候选广告和上下文特征的Embedding向量拼接在一起,输入多层神经网络,最后由Softmax层输出预估点击率。

DSTN

2019年阿里超级汇川发表的论文《Deep Spatio-Temporal Neural Networks for Click-Through Rate Prediction》提出了DSTN算法。DSTN算法的应用场景是搜索广告。在搜索广告场景下,用户输入搜索词,由广告系统返回若干个相关的广告展示至用户。DSTN算法认为当前候选广告是否被点击会受两类信息影响,如图4所示:

  • 时间维度的信息,和DIN、DIEN类似,DSTN认为用户历史点击的广告(Clicked ads)表征了用户正向偏好,可以使用该信息辅助预测候选广告的点击率,同时,DSTN还认为用户历史未点击的广告(Unclicked ads)表征了用户负向偏好,也可以使用该信息辅助预测候选广告的点击率;
  • 空间维度的信息,DSTN认为和候选广告在同一页面中的其他广告(Contextual ad)也会影响候选广告是否被点击,例如某男性用户搜索手机,若返回的多个广告中只有一个是其欲购买的品牌,则这个广告较大概率会被点击。

图4 搜索广告场景下的时空信息

基于上述分析,DSTN将用户历史点击广告序列、历史未点击广告序列、上下文广告序列作为特征,由于点击广告序列、未点击广告序列、上下文广告序列涉及多个广告,而不同广告和候选广告的相关性不同,因此和DIN类似,DSTN使用交互注意力机制(Interactive Attention)分别计算每个点击广告、未点击广告、上下文广告的Embedding向量和候选广告的Embedding向量的注意力得分,基于注意力得分,分别对点击广告序列、未点击广告序列、上下文广告序列中的多个广告的Embeding向量进行加权求和,从而得到点击广告序列、未点击广告序列、上下文广告序列和候选广告相关的表征,最后将点击广告序列、未点击广告序列、上下文广告序列的Embedding向量和候选广告的Embedding向量拼接在一起,输入全连接网络层,并由Sigmoid函数输出候选广告的预测点击率

图5 DNN、DSTN-Pooling model、DSTN-Interactive attention model

论文详细介绍了DSTN的设计过程,最初只将候选广告的特征作为输入,基于“Embedding & MLP”形式的网络结构进行建模,接着引入点击广告序列、未点击广告序列和上下文广告序列,并通过池化操作将这些序列中多个广告的Embedding向量转化为固定长度的Embedding向量,类似DIN、DIEN中的基线模型,再接着将池化操作替换为自注意力机制(计算各序列中每个广告自身的注意力得分)和交互注意力机制(计算各序列中每个广告和候选广告的注意力得分),以下只介绍采用交互注意力机制的DSTN的网络结构,不再详述其他网络结构。

采用交互注意力机制的DSTN的网络结构如图5右侧所示,令候选广告的Embedding向量为xtRDt\text{x}_t\in\mathbb{R}^{D_t}ncn_c个上下文广告的Embedding向量为{xciRDc}i=1nc\{\text{x}_{ci}\in\mathbb{R}^{D_c}\}_{i=1}^{n_c}nln_l个点击广告的Embedding向量为{xljRDl}j=1nl\{\text{x}_{lj}\in\mathbb{R}^{D_l}\}_{j=1}^{n_l}nun_u个未点击广告的Embedding向量为{xuqRDu}q=1nu\{\text{x}_{uq}\in\mathbb{R}^{D_u}\}_{q=1}^{n_u}。基于注意力得分个,对上下文广告的Embedding向量进行加权求和:

x~c=i=1ncαci(xt,xci)xci\tilde{\text{x}}_c=\sum_{i=1}^{n_c}{\alpha_{ci}(\text{x}_t,\text{x}_{ci})\text{x}_{ci}}

其中的注意力得分采用多层神经网络进行计算,该网络包含一个隐层,并使用ReLU函数作为激活函数,可用以下公式表示其结构:

αci(xt,xci)=exp(hTReLU(Wtc[xt,xci]+btc1)+btc2)\alpha_{ci}(\text{x}_t,\text{x}_{ci})=\exp(\text{h}^T\text{ReLU}(\text{W}_{tc}[\text{x}_t,\text{x}_{ci}]+\text{b}_{tc1})+b_{tc2})

其中,h\text{h}Wtc\text{W}_{tc}btc1\text{b}_{tc1}btc2b_{tc2}均为模型参数。和x~c\tilde{\text{x}}_c类似,可以得到点击广告、未点击广告的Embedding向量的加权和x~l\tilde{\text{x}}_lx~u\tilde{\text{x}}_u。DSTN网络结构中后续的全连接网络层和Sigmoid函数不再详述。

最后,再介绍一下DSTN的在线推理过程,如图6所示。不同于其他模型只需推理一次即可得到各候选广告的预测点击率,因为输入需包含上下文广告,所以DSTN的在线推理过程包含以下4步:

  1. Ad Server请求Model Server,输入包含候选广告、点击广告、未点击广告,但无上下文广告;
  2. Model Server返回候选广告的预测点击率;
  3. Ad Server根据候选广告的预测点击率,按照一定的排序机制选择最靠前的一个候选广告,将其作为上下文广告,再次请求Model Server,输入包含剩余的候选广告、点击广告、未点击广告和上下文广告;
  4. Model Server再次返回候选广告的预测点击率;

一般情况下,3、4两步需重复执行多次,直至选择出所需的多条广告,但论文指出,考虑到在线推理的低延时要求,3、4两步只执行一次,并基于第4步返回的预测点击率,按照一定的排序机制选择靠前的多个候选广告。

图6 DSTN的在线推理流程

DFN

2020年腾讯发表的论文《Deep Feedback Network for Recommendation》提出了DFN算法。DFN算法的应用场景是微信中的内容推荐,其将内容推荐问题转化为内容点击率预估问题,而内容推荐场景下,用户对内容有三种反馈,如图7所示:

  • 隐式正反馈(Implicit positive feedback),即用户点击内容;
  • 隐式负反馈(Implicte negative feedback),即用户未点击内容;
  • 显式负反馈(Explicit negative feedback),即用户点击内容的“不喜欢”按钮。

图7 内容推荐场景下的用户反馈

DFN对用户这三种反馈的行为序列进行建模,从中学习用户的正向和负向偏好。DFN首先使用Transformer中的多头自注意力分别挖掘每种反馈的行为序列和候选内容的相关性,得到每种反馈的行为序列和候选内容相关的Embedding向量。针对用户隐式负反馈多、但噪音也多(用户不点击内容可能有多种原因,并不一定是因为不喜欢),而显式负反馈和隐式正反馈少、但较准确的特点,DFN基于注意力机制,分别计算未点击行为和显式负反馈、隐式正反馈的Embedding向量的注意力得分,并使用上述两种注意力得分分别对未点击行为的Embedding向量进行加权求和,得到未点击行为中负向偏好、正向偏好的Embedding向量,最后将三种反馈的行为序列和候选内容相关的Embedding向量,以及未点击行为中负向偏好、正向偏好的Embedding向量拼接在一起作为用户反馈的表征,连同其他类型的特征,进行特征交互,再由Sigmoid函数输出候选内容的预估点击率。

令用户隐式正反馈(点击)的行为序列为{c1,,cn1}\{c_1,\cdots,c_{n_1}\},显式负反馈(点击“不喜欢”按钮)的行为序列为{d1,,dn2}\{d_1,\cdots,d_{n_2}\},隐式负反馈(未点击)的行为序列为{u1,,un3}\{u_1,\cdots,u_{n_3}\}

图8 DFN的网络结构

DFN的网络结构如图8所示,其包括反馈交互模块(Deep Feedback Interaction Module)和特征交互模块(Feature Interaction Module)两部分。

反馈交互模块如图8右侧所示,又包括同类反馈交互组件(Internal Feedback Interaction Component)和跨类反馈交互组件(External Feedback Interaction Component)两部分。

同类反馈交互组件使用Transformer中的多头自注意力分别挖掘每种反馈的行为序列和候选内容的相关性。以隐式正反馈(点击)为例说明其计算过程。令输入矩阵Bc={t,c1,,cn1}\text{B}_c=\{\text{t},\text{c}_1,\cdots,\text{c}_{n_1}\},其中t\text{t}为候选内容的Embedding向量,ck\text{c}_k为用户第kk次点击的Embedding向量(所点击内容的Embedding向量加上序号的Embedding向量),Transformer中的自注意力由下式计算:

Q=WQBc, K=WKBc, V=WVBc\text{Q}=\text{W}^Q\text{B}_c,\space\text{K}=\text{W}^K\text{B}_c,\space\text{V}=\text{W}^V\text{B}_c
Attention(Q,K,V)=softmax(QTKnh)V\text{Attention}(\text{Q},\text{K},\text{V})=\text{softmax}(\frac{\text{Q}^T\text{K}}{\sqrt{n_h}})\text{V}

多头自注意力中第ii个头的自注意力由下式计算:

headi=Attention(WiQQ,WiKK,WiVV)\text{head}_i=\text{Attention}(\text{W}_i^Q\text{Q},\text{W}_i^K\text{K},\text{W}_i^V\text{V})

多头自注意力的输出矩阵为:

Fc=concat(head1,,headh)WO\text{F}_c=\text{concat}(\text{head}_1,\cdots,\text{head}_h)\cdot\text{W}^O

Fc\text{F}_c中包含n1+1n_1+1个Embedding向量,进行平均池化:

fc=Average_pooling(Fc)\text{f}_c=\text{Average\_pooling}(\text{F}_c)

fcRnh\text{f}_c\in\mathbb{R}^{n_h},即隐式正反馈(点击)的行为序列和候选内容相关的Embedding向量。类似地,可以得到隐式负反馈、显式负反馈的行为序列和候选内容相关的Embedding向量fu\text{f}_ufd\text{f}_d

跨类反馈交互组件基于注意力机制,分别计算未点击行为和显式负反馈、隐式正反馈的Embedding向量的注意力得分,并使用上述两种注意力得分分别对未点击行为的Embedding向量进行加权求和,得到未点击行为中负向偏好、正向偏好的Embedding向量。以未点击行为中负向偏好的Embedding向量fud\text{f}_{ud}为例,说明其计算过程。计算过程可用下式表示:

fud=i=1n3αiui, αi=f(fd,ui)j=1n3f(fd,ui)\text{f}_{ud}=\sum_{i=1}^{n_3}{\alpha_i\text{u}_i},\space\alpha_i=\frac{f(\text{f}_d,\text{u}_i)}{\sum_{j=1}^{n_3}{f(\text{f}_d,\text{u}_i)}}

其中,f(a,b)f(a,b)表示多层神经网络:

f(a,b)=MLP(concat(a,b,ab,ab))f(\text{a},\text{b})=\text{MLP}(\text{concat}(\text{a},\text{b},\text{a}-\text{b},\text{a}\odot\text{b}))

\odot表示Hadamard积(按元素逐个相乘)。类似地,可以得到未点击行为中正向偏好的Embedding向量fuc\text{f}_{uc}

最后将三种反馈的行为序列和候选内容相关的Embedding向量,以及未点击行为中负向偏好、正向偏好的Embedding向量拼接在一起作为用户反馈的表征:

fFeed={fc,fd,fu,fuc,fud}\text{f}_{Feed}=\{\text{f}_c,\text{f}_d,\text{f}_u,\text{f}_{uc},\text{f}_{ud}\}

特征交互模块如图8左侧所示。首先对各种特征进行交互和挖掘,其又包括三种组件:Wide、FM和Deep,该设计类似“Wide & Deep”。

通过Wide组件对稀疏特征进行简单的线性映射:

yiWide=wiTxi+bi\text{y}_i^{Wide}=\text{w}_i^T\text{x}_i+b_i

其中,xi\text{x}_i为独热编码后的特征。

通过FM组件对稠密特征F={f1,,fm,fFeed}\text{F}'=\{\text{f}_1,\cdots,\text{f}_m,\text{f}_{Feed}\}进行两两交叉:

yFM=i=1m+5j=i+1m+5fifj\text{y}^{FM}=\sum_{i=1}^{m+5}{\sum_{j=i+1}^{m+5}{\text{f}_i'\odot\text{f}_j'}}

通过Deep组件的多层神经网络对稠密特征间的深层关系进行挖掘:

yDeep=f(2)\text{y}^{Deep}=\text{f}^{(2)}
f(i+1)=ReLU(W(i)f(i)+b(i))\text{f}^{(i+1)}=\text{ReLU}(\text{W}^{(i)}\text{f}^{(i)}+\text{b}^{(i)})
f(0)=concat(f1,,fm,fFeed)\text{f}^{(0)}=\text{concat}(\text{f}_1,\cdots,\text{f}_m,\text{f}_{Feed})

最后将上述组件输出的特征Embedding向量拼接在一起,再由Sigmoid函数输出候选内容的预估点击率:

y=concat(yWide,yFM,yDeep)\text{y}=\text{concat}(\text{y}^{Wide},\text{y}^{FM},\text{y}^{Deep})
p(x)=σ(wpTy)p(x)=\sigma(\text{w}_p^T\text{y})

和用户反馈类似,模型训练所使用的损失函数也包含三类样本,分别是点击样本、未点击样本和点击“不喜欢”按钮样本:

L=1N(λcSclogp(x)+λuSulog(1p(x))+λdSdlog(1p(x)))L=-\frac{1}{N}(\lambda_c\sum_{S_c}{\log p(x)}+\lambda_u\sum_{S_u}{\log(1-p(x))}+\lambda_d\sum_{S_d}{\log(1-p(x))})

RACP

2022年阿里巴巴发表的论文《Modeling Users' Contextualized Page-wise Feedback for Click-Through Rate Prediction in E-commerce Search》提出了RACP算法。RACP算法的应用场景是商品搜索。和DSTN算法在搜索广告中挖掘上下文广告、历史点击广告、历史未点击广告的特征类似,RACP算法的作者也认为搜索结果页(Search Result Page)中的多个商品对于用户是否点击存在相互影响,而用户搜索过程是一个兴趣逐渐聚焦的过程,搜索历史中的多个搜索结果页表征了用户兴趣演进过程,如图9所示,影响当前搜索结果页中的商品是否被点击,因此,RACP算法先对搜索历史中每个搜索结果页的多个商品的点击和不点击数据进行建模,以挖掘每个搜索结果页的上下文感知的用户兴趣特征,再对搜索历史中多个搜索结果页的兴趣演进过程进行建模,最后得到用户兴趣演进特征,将其和目标商品特征、用户画像特征拼接在一起,输入多层神经网络,最后由Sigmoid函数输出目标商品的预估点击率。 图9 用户兴趣演进过程 图10 RACP网络结构 RACP的网络结构如图10所示,以下只介绍由彩色区块标识的用户兴趣演进特征挖掘部分。该部分又分为四层。

第一层为Embedding层,其将用户搜索历史的高维稀疏特征转化为低维稠密特征。经过Embedding层后,用户搜索历史可表示为{pi}i=1T\{p_i\}_{i=1}^T,其中,共有TT个搜索结果页,pip_i表示第ii个搜索结果页,pip_i中的商品序列可表示为{xi,jRDx}i,j=1La\{x_{i,j}\in \mathbb{R}^{D_x}\}_{i,j=1}^{L_a},其中,共有LaL_a个商品,xi,jx_{i,j}表示第jj个商品,fi,jf_{i,j}表示第jj个商品是否被点击,ci,jc_{i,j}表示第jj个商品的上下文信息,包括搜索词、搜索词类别、页面中的点击数、页面中和该商品相同品牌的商品数、页面中和该商品相同卖家的商品数、页面中各商品的排序等。

第二层为搜索结果页内的上下文感知的用户兴趣挖掘层(Intra-page Context-aware Interest Layer)。对于pip_i,使用以下线性映射计算其中每个商品的注意力权重:

ai,j=Wia[Qi;xx,j;fi,j;ci,j]a_{i,j}^*=W_i^a*[Q_i;x_{x,j};f_{i,j};c_{i,j}]

再对注意力权重进行归一化:

ai,j=exp(ai,j)j=1Laexp(ai,j)a_{i,j}=\frac{\exp{(a_{i,j}^*})}{\sum_{j=1}^{L_a}{\exp{(a_{i,j}^*)}}}

最后,基于注意力权重对每个商品的特征进行加权求和,作为pip_i的上下文感知的用户兴趣特征:

pi=j=1Laai,j[xi,j;fi,j;ci,j]p_i=\sum_{j=1}^{L_a}{a_{i,j}*[x_{i,j};f_{i,j};c_{i,j}]}

第三层为搜索结果页间的用户兴趣演进挖掘层(Inter-page Interest Backtracking Layer)。从图10可以看出,兴趣演进挖掘是一个逆向回溯过程,从搜索历史中的最近一次搜索结果页开始,向前计算。论文使用了GRU,将长期记忆中和当前搜索相关的兴趣,与短期记忆中的兴趣进行融合。GRU的细节已在DIEN算法中介绍,这里不再展开,直接列出ptp_t重置门rtr_t、更新门ztz_t、候选隐状态ntn_t和隐状态QtQ_t的计算公式

rt=σ(Wirpt+bir+WhrQ(t+1)+bhr)r_t=\sigma(W_{ir}p_t+b_{ir}+W_{hr}Q_{(t+1)}+b_{hr})
zt=σ(Wizpt+biz+WhzQ(t+1)+bhz)z_t=\sigma(W_{iz}p_t+b_{iz}+W_{hz}Q_{(t+1)}+b_{hz})
nt=tanh(Winpt+bin+rt(WhnQ(t+1)+bhn))n_t=\tanh(W_{in}p_t+b_{in}+r_t*(W_{hn}Q_{(t+1)}+b_{hn}))
Qt=(1zt)nt+ztQ(t+1)Q_t=(1-z_t)*n_t+z_t*Q(t+1)

第四层为搜索结果页的用户兴趣聚合层(Page-level Interest Aggregation Layer)。对于pip_i,使用以下线性映射计算当前搜索和pip_i的注意力权重:

βi=Ws[QT;pi]\beta_i^*=W_s*[Q_T;p_i]

再对注意力权重进行归一化:

βi=exp(βi)i=1Texp(βi)\beta_i=\frac{\exp(\beta_i^*)}{\sum_{i=1}^T{\exp(\beta_i^*)}}

最后,基于注意力权重对pip_i的特征进行加权求和,得到最终的用户兴趣特征:

s=i=1Tβipis=\sum_{i=1}^T{\beta_i*p_i}

用户兴趣特征和目标商品特征、用户画像特征拼接在一起,输入多层神经网络,最后由Sigmoid函数输出目标商品的预估点击率:

y=σ(MLP([s;u;qT;xt]))y=\sigma(\text{MLP}([s;u;q_T;x_t]))

参考文献