深度CTR预估模型笔记
常规模型
DNN
常规的DNN模型,多层结构
WDL【2016】
特征的一阶结构与DNN部分并联,同时考虑了一阶特征和深度隐式的特征
FNN【2016】
使用FM预训练embedding
PNN【2016】
增加内积、外积(outer product,张量积,注意与exterior product区分)结构,把内外积结构与一阶结构concat之后再进入多层神经网络,增加了特征之间的显式交叉程度
DeepFM【2017】
- 并联DNN部分和FM部分
- FM部分包括一次项和二次项,二次项部分可以进行化简,降低时间复杂度
- 增加了显式交叉程度
DCN【2017】
- 并联DNN部分和多层Cross Layer
- Cross Layer:\(X_{l+1}=X_0X_l^TW_l+b_l+X_l=f(X_l,W_l,b_l)+X_l\)
- 上式中第一个等号右边的维度分别为(n,1)(1,n)(n,1)+(n,1)+(n,1)
- 由第二个等式可以看出\(f(X_l,W_l,b_l)\)部分拟合的是上下层之间的残差
- \(f(X_l,W_l,b_l)\)部分表示使用一阶特征与l阶特征进行显示交叉,l层cross layer可以实现l+1阶的交叉
- 工程实现时,\(X_0X_l^TW_l\)部分可以先计算后两个向量的内积,得到标量,能够大幅提升效率
- 实际上线并未作出效果,实际上可能只是对X0做线性映射,不能很好地学习到交叉信息
xDeepFM【2018】
- 并联Linear、DNN与CIN(Compressed Interaction Network)部分
- CIN的输入来自embedding层,设共有m个field,每个field维度是D,则输入层为\(X_0 \in R^{m*D}\)
- CIN的每一层会对上一层和输入层做显式交叉,交叉的方式为向量的哈达玛积,再进行加权求和,公式如下:
- \(X_h^k = \sum_{I=1}^{H_{k-1}}W_{ij}^{k,h}(X_i^{k-1} \odot X_j^0)\)
- 其中\(X_h^k\)表示第k层的第h个向量,它等于上层\(H_{k-1}\)个向量与输入层m个向量的哈达玛积的加权和,\(W^{k,h}\)表示第k层第h个向量的权重矩阵
- 对每层的\(H_k\)个向量沿着field维度D的方向做sum pooling,压缩成\(H_k * 1\)维的结果,把每层的结果concat起来作为最终结果输出到上层
- 每一层的不同向量,所用到的哈达玛积的结果都是一样的,区别在于W权重矩阵不同,类似CNN中的kernel
- DCN的cross结构中第l层都有1~l+1阶的交叉,CIN结构中第l层只有l+1阶的交叉信息
AutoInt【2018】
- 通过多头自注意力机制构造高阶特征
- 每一维特征得到固定维度的embedding,然后进行标准的多头自注意力结构处理
- 对于第m个特征,也就是第m个query,对每一个Head得到的结果做concat,然后再乘以W权重,加上原始embedding特征(这里是残差结构),作为第m个特征的输出
- 把每个特征的输出进行concat,最后连接一层输出层
DIN (Deep Interes Network)【2018】
- 对于item的多种属性id的embedding进行concat,作为item的embedding
- 使用Activation Unit产生Attention权重进行加权求和(Attention pooling)
- Activation Unit的输入为两个item的embedding,记为X、Y,将X、Y和X与Y的外积(张量积)(原始版本使用的是X-Y)进行concat,上面叠加2层MLP结构,输出为标量作为X和Y的Attention权重
- 自适应的激活函数Dice:对输出值进行batch norm以确定Dice的参数,自适应地调整PRelu的分界点
- 只对batch中参与了前向运算的embedding做正则化
- 评估方式GAUC:分别对每个用户计算AUC,然后按照展示数进行加权求和,更能说明推荐效果的优劣
DIEN (Deep Interest Evolution Network)【2019】
- 将用户行为序列embedding之后和其他特征embedding一起作为输入
- 兴趣抽取层:用户行为序列送入GRU结构,使用t时刻及之前的序列抽取t时刻的兴趣(即GRU对应细胞的输出\(h_t\))
- 在兴趣抽取层中引入辅助loss,最大化\(h_t\)与t+1时刻item embedding的内积,最小化\(h_t\)与随机采样负例的内积
- 辅助loss:对内积进行sigmoid转化为0~1之间的值之后,再与1/0得到binary交叉熵,与graphsage非监督学习的loss形式一致,在tf中实现为sigmoid_cross_entropy_with_logits
- 辅助loss能够对GRU的每一步进行学习,一方面有利于GRU的学习,使模型能够好地抓住某一时刻的兴趣点,另一方面也有利于item embedding的学习
- 将兴趣抽取层GRU的输出与目标向量e做attention,得到attention权重,具体做法是对 \(h_tWe\) 进行softmax,其中W是待学习的权重参数
- 兴趣进化层:在兴趣抽取层之上再堆叠一层GRU,使用第一层GRU的输出作为输入,与第一层GRU的的区别在于更新门的输出u需要乘上attention权重,通过attention机制控制每一步GRU隐含向量的更新
- 将兴趣进化层GRU最后一步的输出与其他特征embedding做concat,送入多层简单DNN拟合真实click
FwFM (Field-weighted Factorization Machines) 【2018】
- FFM的变种,减少了参数,对于特征域之间的交互使用同一的强度参数
ONN【2018】
- 同一个特征,不同的operation拥有不同的embedding表示
FGCNN(Feature Generation by Convolutional Neural Network)【2019】
- 通过CNN提取特征组合,与原始特征concat送入DNN
DSIN (Deep Session Interest Network)【2019】
- 用户在单个session内的行为比较明确、清晰,不同session之间的兴趣可能区别比较大
- DSIN主要包括session划分层、session兴趣提取层、session兴趣交互层、session兴趣激活层
- session划分层:原文中使用30分钟作为间隔划分session,划分得到K个session,每个session里T个行为,每个行为d维向量
- session兴趣提取层:对每个session,加上bias encoding偏置项后,使用多头自注意力提取session内部兴趣(T*d),最后通过pooling得到d维向量
- session兴趣交互层:通过bi-LSTM对提取层得到的K个session向量进行交互,每个session的隐状态是两个方向LSTM隐状态的向量和
- session兴趣激活层:通过注意力机制(ActivationUnit)将target item和K个提取层向量以及K个交互层向量做交互,得到2*d维向量
- 最后将激活层向量与其他特征进行concat送入常规dnn全连接层,得到最终的输出
FiBiNET 【微博2019】
- 通过Squeeze-Excitation Net 引入特征重要性
- 通过Bilinear-Interaction 进行显式特征交叉
- Squeeze结构:对特征embedding做pooling,做法是对每个特征的各个维度求均值或最大值,把nk压缩成n1
- Excitation结构,即把Squeeze结构输入到两层神经网络,分别把维度从n缩减到n/r, 再从n/r提升到n(r是超参数)
- 用Excitation得到的n维向量作为权重,对n*k的特征向量做加权,送入后续网络
- Bilinear-Interaction: 结合内积与哈达玛积(双线性交叉),两个特征的双线性交叉结果为 \(p_{ij}=v_iW \odot v_j\)
- 对所有特征对进行双线性交叉,送入后续多层神经网络,得到最终输出
- 双线性映射是由两个向量空间上的元素,生成第三个向量空间上一个元素之函数,并且该函数对每个参数都是线性的
FLEN【美团2019】
- 在FM中,在反向传播时,不同特征的隐向量容易相互靠近,形成梯度耦合,在FFM中引入场的概念,可以缓解梯度耦合问题,但参数量太大(隐向量太多)
- FLEN中通过Field-Wise Bi-Interaction Component来缓解上述问题
CAN【阿里2020】
- TODO
- 将item的参数作为item和user特征交互MLP的网络参数,user参数(以及参数的power)作为输入,得到交互结果送入DNN
DeepMatch
DSSM【2013】
- 双塔结构,有很多变种
YoutubeDNN【2016】
- 使用item_id embedding替换item侧tower
NCF【2017】
- 对item embedding和user embedding做多层DNN的融合
SDM【阿里2019】(Sequential Deep Matching Model)
- 将当前session交互的item和7天内交互的item分别作为短期和长期兴趣序列
- 短期序列经过LSTM、多头自注意力、以及与user embed的注意力加权得到短期兴趣输出向量(由于序列较短,所以操作更复杂)
- 长期序列经过预处理得到id、cate、shop等多个集合,每个集合与user embed做注意力加权,再拼接后经过dense层得到长期兴趣输出
- 长短期兴趣通过fusion gate融合,门控参数由长短期兴趣和user embed的加权和的sigmoid输出决定
- 最终得到的融合兴趣输出在训练和serving端的使用与其他DeepMatch结构相似
- 实际使用过程中,由于只用到序列特征,对新用户效果不好
MIND【阿里2019】
- 用户多兴趣表示、动态路由、胶囊网络
- item序列经过多兴趣抽取层产出多个兴趣表示胶囊,胶囊向量分别与用户静态属性concat之后,经过多层relu隐层得到用户的多兴趣向量表示
- 训练:上一步产生的多兴趣表示与目标item(下一个交互的item)做attention加权之后(作者提出直接hardmax收敛更快),得到最终的的用户向量表示(这个表示在serving的时候不会计算,因为serving不会有目标item信息),送入sampled_softmax层
- 服务:将多兴趣表示分别取KNN,多个兴趣召回融合的时候,对每一个item取最高的内积相似度
- 动态路由与胶囊网络:
- 胶囊是新式的神经元,相对于普通的神经元,胶囊里存储的是向量而不是标量
- 在普通神经元网络中,上下两层网络的参数是由反向传播训练得到的,而在胶囊网络中,上下两层的参数是由动态路由算法迭代得到的,下面详细解释动态路由
- 在每一次迭代中,先对下层胶囊中的向量进行线性空间变换,将其映射到上层胶囊所在的空间(即乘以一个可以学习的矩阵,对于标准的动态路由,每个上下层胶囊对都有一个对应的矩阵参数)
- 对每个上层胶囊,可以通过路由logits(初始化为0,每轮迭代的最后更新)进行下层映射向量的attention加权求和,\(z_j=\sum w_{ij}S_{ij}c_i^l\),其中w是attention权重(通过路由logits进行softmax得到的)
- 最后,对于上一步得到的z,通过一个非线性函数squash(类似传统神经元中的非线性激活函数)得到这一轮迭代新的胶囊向量,\(c_j=\frac{n_j^2}{1+n_j^2} \frac{z_j}{n_j}, n=\|z_j\|\),其中n是z的二范式
- squash函数的后一部分是简单的进行标准化,变成长度为1的向量,前一部分是把向量长度转换到0~1之间,这样,胶囊里的向量方向可以表达某种特征,向量长度可以表示具有某种特征的程度或者其存在的概率
- 将下层映射之后的向量与上层向量做内积,得到cosine相似度,用于更新logits,\(b_{ij}+=(c_j^h)^TS_{ij}c_i^l\),其中b是路由logits,c是胶囊向量,S是矩阵参数,上标h,l表示上下层,下表i,j表示每层的第几个胶囊
- 在标准版本的动态路由中,b都被初始化为0,这样迭代开始时,向量是平均路由的,一般经过3轮迭代,胶囊向量会收敛,可以作为下一层输出
- B2I 动态路由
- 胶囊网络在语义上很适合从用户行为序列聚合出多兴趣点表示,但是标准的胶囊网络是用来处理的图像数据的,不太适用于推荐场景,所以作者提出了B2I (Behavior to Interest)动态路由,与标准的动态路由有以下三点区别
- 共享的双线性矩阵参数:一方面用户行为序列是变长的,使用固定的矩阵更通用,另一方面,作者希望兴趣向量能够映射到同一个空间内,而不同的映射矩阵达不到这个要求
- 随机初始化路由:由于共享矩阵参数,如果将b都初始化为0,那么所有的兴趣胶囊向量将会一模一样,所以在这里MIND采用了随机初始化的路由logits(指softmax之前的值,也就是b)
- 动态兴趣数:由于每个用户的兴趣点数量不一,作者提出了一个启发式的兴趣胶囊数量公式,\(max(1,min(K,log_2(|I_u|)))\),其中\(|I_u|\)是用户行为序列的长度,这样可以节约计算和存储资源
图神经网络
GCN
GraphSAGE
- 相对于GCN的直推式(transductive)学习,GraphSAGE是归纳式的(inductive),即拥有对新节点的泛化能力,这对于推荐场景中新的用户和item表示很关键
- 通过学习一个对邻居顶点聚合的函数来产生目标顶点的embedding向量,经过多层聚合,来获得K阶邻居的信息
- 非监督学习需要进行采样,正样本可以采用random walk,负样本可以随机采样,正负样本得到的向量与目标向量内积之后进行sigmoid激活,然后与1/0进行binary交叉熵计算,求和得到最后的loss
多任务
ESMM
- 直接训练CTR和CTCVR任务,通过pCTCVR=pCTR*pCVR,间接得到pCVR,解决样本选择性偏差和样本稀疏性问题
MMOE【Multi-gate Mixture of Experts】
- 单门MOE:多个专家塔(输入为原始输入,输出为多维向量表示),一个门控结构,门控网络以原始输入作为输入,输出为专家数量维的logits,用softmax进行归一化,随后与专家塔的向量输出进行加权求和,作为上层多任务tower的输入
- MMOE:专家塔和上层多任务部分完全一致,区别在于为每一个任务配备一个门控结构,这样每一个上层任务塔获得专家信息的权重会不一样,从而实现不同任务对于专家信息的选择性利用
PLE【Progressive Layered Extraction,腾讯2020】
- CGC: PLE的单层版本,最底层是每个任务特有的专家网络以及共享专家网络,对每一个任务,通过门控单元控制自己的专家模块和共享模块的输入,得到加权输出,最后经过简单MLP得到单个任务的输出
- 门控单元:以原始输入作为输入,输出为任务独有专家和共享专家数量维的logits,用softmax进行归一化
- PLE:叠加多层CGC的版本
超长兴趣序列建模
MIMN TODO
SIM TODO
粗排
交叉特征蒸馏
- 由于粗排一般使用双塔结构,所以不能使用交叉特征和某些context特征(比如召回源),同时粗排模型本身使用的特征和结构都比较简单,可以用精排模型对粗排模型进行蒸馏
- 相关工作Privileged Features Distillation for E-Commerce Recommendations(https://arxiv.org/abs/1907.05171?context=cs.IR)