计算广告中的CTR
CTR预测是计算广告中的一项重要任务.
所谓CTR就是根据用户的特征来估计用户点击广告的概率
用于CTR是一项分类任务,主要用于预估是否点击.并且所得到的用户特征数据,广告数据等多为离散型数据.
最基本的模型是采用LR模型.
FFM(Field-aware Factorization Machine for CTR Prediction)
论文中先给定了目标函数的形式:
首先引出了一个已有模型degree-2 polynomial mappings(Poly2)$^{[1,2]}$.
POLY2
原作者展示了2阶多项式的映射能有效的捕获特征结合的信息.
形式如下:
这里关键是采用了$h(j_1,j_2)$用来考虑将每对特征作为一个新的特征.一般的$h(j_1,j_2)$形式如下:
其中B是用户给定的参数
可见这里的计算复杂度为:$O(\overline{n}^2)$,其中$\overline{n}$是平均每个实例的非零元素个数.
Factorization Machine
FM$^{[3]}$被提出用来隐式地学习每个特征的潜向量$w$.
每个潜向量包含k个潜因子,其中k是用户给定的参数.那么,特征结合的效果通过潜向量的内积来建模.
此时,计算复杂度变为了$O(\overline{n}^2k)$,其中k是潜向量的潜因子个数
为了降低计算复杂度,原文进行了重写(化简),
其中
化简方法在原文中有
此时的计算复杂度降为了$O(\overline{n}k)$
原文解释了为什么FM效果比Poly2好
Poly2学习的是两个共现的特征的参数,而FM学习的是各自特征的参数w,并且可以从没有共现过的两个特征也能从其他的对中学习到它们之间的关系.
FFM
本文所提出的方法.也是借鉴于PITF$^{[4]}$的方法.
这里提出了一个域(field)的概念,[4]中的应用场景是推荐系统涉及到的field仅3个(User,Item和tag).而这里由于是应用于CTR,所以将会考虑更多的field. 所谓的field就是由feature group而成的. 比如特征男、女就是属于field Gender.
其中$f_1,f_2$分别是$j_1,j_2$所在的field
如果f是域(field)的个数,那么FFM的变量个数为nfk,其计算复杂度为$O(\overline{n}^2k)$
此时的w_{j,f}不仅能反映出自身特征j的效果还能反映出与其一同作用的域的效果。
总结
上述的$\phi_{Poly2},\phi_{FM},\phi_{FFM}$都可以代入到我们一开始提到的目标函数中去,并由此求解该目标函数的问题.这里用到的优化方法是SG方法,具体看原文吧
参考文献
- Training and testing low-degree polynomial data mappings via linear SVM
- Fast mathods for kernel-based text analysis
- Factorization machines
- Pairwise interaction tensor factorization for personalized tag recommendation
DeepFM
之前提过的FM,FFM都是2阶的特征交互(features interaction),然而有时候二阶的交互可能是不够的,需要更高阶的交互.由此,将特征交互分为低阶特征交互和高阶特征交互.低阶一般就是指二阶交互.而传统的方法,要实现高阶交互比较麻烦,要手工提取要交互的特征.而这里提出的DeepFM则结合了深度学习不需要手动提取,就能实现自动的高阶交互.另外DeepFM共享输入给低阶的FM层和高阶的FM层,将两者结合共同实现CTR的预测.
深度学习往往能挖掘隐藏的数据,当然在处理高阶特征交互时,也能发掘隐藏的高阶特征交互,这些都是难以用手动实现,所以说深度学习带来了极大的方便.
总体模型图:
预测模型的形式:
其中$\hat{y}∈(0,1)$
FM Component
结构:
对应于总体模型图的左半部分
这里的FM部分不仅用到了2阶的交互,还使用了一阶的交互(黑线).这里使用了一个Addition unit 和一系列Inner Product unit来进行运算。
形式为:
我觉得这里$V_i,V_j表达有问题,我觉得它想表达的是V_{j_1},V_{j_2}$,这里w∈$R^d$,$V_i∈R^k$
下图是FM原论文中,关于上述二阶特征交互部分的化简公式.这也就等于前一篇论文中的$\phi_{FM}$的形式.
Deep Component
结构:
对应于总体模型图的右半部分.
实际上就是一个前馈神经网络。
总结
另外还要注意的是,在总体模型结构中,可以看到,FM Component和Deep Component是共享embeding的输出的.
一般把embedding层前的数据长度叫field size,而embeding后的叫feture size.
xDeepFM
这篇论文的主要的贡献是结合了显式的特征整合和隐式的特征合.
xDeepFM一方面能显式地学习到某个有界阶内的特征交互,另一方面能隐式地学习任意的低阶或高阶的特征交互.
本文定义了一个概念——位(bits),比如向量$V_i=[v_{i1},v_{i2},…,v_{in}]$,这里$v_{i1}$就是一个位(bit).而在我们使用DNN模型来进行高阶的特征交互的时候,是进行位层面上的特征交互.而传统的FM进行的是向量层面上的特征交互.
本文提出的显式地学习向量层面上的高阶特征交互.
本文将上述提到的显式的高阶特征交互模块与隐式的特征交互模块以及传统的FM模块结合得到全新的模型xDeepFM.
embedding层
一直记得李沐的话,模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡.这里要用的DNN,显然是复杂模型,而我们的raw_input往往是离散的,所以需要经过一层embedding来稠密化.
embedding层的作用就是将对应的域里的离散数据映射到一个稠密的低维实值向量中去.而域往往分为univalent和multivalent,两种形式,前者就是一般的特征embedding,而后者还要进行一步sum embedding.
隐式的高阶特征交互
这也就是我们前面在DeepFM中提到的DNN component,这一部分就是简单的前馈神经网络.像前面提到的那样,这种形式的特征整合是高阶的且仅仅是在bit层面上的整合(交互).
显式的高阶特征交互
在文献[1]中提出了一种Cross Network(CrossNet)其结构如上图所示.它旨在显式地建模高阶的特征交互.与经典的全连接不同的是,这里的隐层是通过下式来计算的:
其中$w_k,b_k,x_k∈R^{mD}$是权重,偏置和k层的输出.这里认为CrossNet学习的是特定的高阶特征交互,其中CrossNet中的每个隐层$x_0$的标量乘积.
推导:
其中标量$α^1=x_0^Tw_1+1$是$x_0$的线性回归.$x_1$是$x_0$的标量乘积.
CrossNet的问题是:(1)输出的形式受限,每层都是$x_0$的标量倍.(2)交互是以位的方式出现.
本文提出的方法——Compressed Interaction Network(CIN)
设计考虑了以下几点:
- 特征交互发生在向量层面上
- 高阶特征交互能被显式地计算.
- 随着交互地阶数增加网络复杂度不会呈指数增加.
考虑embedding vector为一个单位来实现向量层面上的交互.构造从embedding layer 输出的矩阵$X^0∈R^{m×D}$,其中$X^0$的第i行是第i个域的embedding 向量$e_i$.考虑CIN的第k层的输出是矩阵$X^k∈R^{H_k×D}$,其中$H_k$表示(embedding) feature vectors 在第k层的数量,并且令$H_0=m$.
每层有以下计算形式:
其中1≤h≤H_k,$W^{k,h}∈R^{H_{k-1}×m}$是第h层的特征向量的参数矩阵,$\circ$表示Hadamard product,举个例子就是$
可以看出$X^k来源于X^{k-1}和X^0$
可以看上图.(a)描述了Hadamard product(outer product).可以看到$X^k$与$X^0$ outer product之后,变成了一个$H_k×m×d$的形式,这被视为中间结果$Z^{k+1}$对应于公式中括号里那一步.
(b)描述了如何获得$X^{k+1}$,是通过将$Z^{k+1}$压缩回$X^k$的形状,也就是对应于W的乘积求和计算.将原来的$H_{k-1}$压缩成$X^k$的$H_{k}$
(c)是对整个CIN的整体图.
最后的操作是作用一个sum pooling在每个隐层的特征图上
得到一个pooling vector $p^k=[p_1^k,p_2^k,…,p_{H_k}^k]$,长度为$H_k$.
在CIN的输出前,往往会考虑来自各个层pooling vector的拼接,表示成:
其中$w^o$是回归参数.
结合成xDeepFM
loss函数可以用cross entropy.
参考文献
- Deep&Cross network for Ad Click Predictions
Neural Factorization Machines(NFM)
这篇论文是2017年的早于上一篇论文(2018年).比较简单的思想,就是在原来的FM的基础上引入非线性.
原来FM的预测公式为:
本文引入非线性以后的预测公式为:
前面的一阶特征交互形式与FM相同不同的是这里用DNN来代替FM的二阶特征交互部分.
模型结构:
与之前的模型一样,要先通过一个embedding层.但这里不同的是这里的embedding vector构造成:$V=\{x_1v_1,…,x_nv_n\}$来表达输入特征向量x.也就是说,这里只要那些非零的特征才能映射到embedding vector。事实上这个过程就是FM的分解嵌入过程.
然后将其输入到Bi-Interaction Layer中.这一层说白了就是在实现FM的二阶特征交互的过程.
公式:
这里的$\odot$表示的对应元素相乘.
可以看到这里输入是有n个向量的,最终变成了一个向量.所以作者也称之为Bi-Interaction pooling.
这里为了化简上述公式,还是引用了FM中的化简方法得到:
其中这里的$v^2$表示$v\odot v$.所以说说白了还是FM的那一套.
不同的是,这里并没有直接拿来二分类.而是经过了多层的hidden layer.并且这里的hidden layer里的激活函数都是sigmoid.
隐层之后是一个预测层,这个预测层用来预测的是特征交互的值,而不是目标分类的值.
总的模型的预测公式为:
作者认为NFM是一种FM的泛化表达.
Deep Interest Evolution Network(DIEN)
原本的一些CTR模型直接从用户行为(user behavior)中提取潜在的用户兴趣.而本文认为,仅仅提取行为中的兴趣是不够的,应该提取行为序列中的带有时间的兴趣,或者说要获得兴趣轨迹.这里我的理解是,当用户点了一个商品之后,他可能会联想到一些其他要求或者其他物品,兴趣发生了转变,而转向其他广告.
DIEN中包含了两个关键的模块:
- 从显式的行为中提取潜在的时间化的兴趣
- 建模兴趣演化过程.
数据具有的特征:
- User Profile
- User behavior
- Ad
- Context
整体模型
带颜色的部分是该模型的重点.
首先是行为层,主要就是通过embedding layer提取行为数据的低维稠密特征.
然后是一个特征提取层,主要就是用GRU来学习行为数据中潜在的行为关系
最后是兴趣演化层,根据从GRU中提取得到的潜在行为特征状态来结合target Ad来得到它的行为特征.
我的理解:第二层相当于行为上下文的影响.第三层是在引入了广告特征之后,对行为的影响也包括上下文的影响.因为最后是否点击并不是仅仅跟行为有关,还跟你的上下文有关.
此外注意这边左侧的虚线框框,Auxiliary Loss,是应该是用来纠正仅依靠上下文的行为特征.这里h(t)为此时的隐行为状态,而e(t+1)是下一时刻的行为特征.而$\hat{e}(t+1)$是下一时刻负采样得到的不会响应点击的行为.
文中还提到兴趣进化层(Interest Evolution layer)中interest在变化中遵循的规律:
- interest drift:用户在某一段时间的interest会有一定的集中性。比如用户可能在一段时间内不断买书,在另一段时间内不断买衣服。
- interest individual:一种interest有自己的发展趋势,不同种类的interest之间很少相互影响,例如买书和买衣服的interest基本互不相关。
GBDT与LR融合提升广告点击率预估模型
CTR评估中的穿越问题
什么是评估穿越?
在拿到样本数据之后,做了必要的清洗和采样之后,我们会将样本分为训练集(train)和测试集(test)(有时还会再分一份作为validation),我们会在训练集上训练出模型,然后在测试集上对模型的效果进行评估,具体来说,我们会计算各种指标出来,例如准确率、召回率、AUC,MAP等等。我们之所以要将样本划分为训练集和测试集,主要目的就是希望在测试集上做评估,而不是在训练集上做评估,防止发生过拟合,进而使得评估结果更加准确。
评估穿越,指的就是由于样本划分不当,导致测试集中的信息“穿越”到了训练集中,导致评估结果会更偏爱过拟合的模型,从而导致评估结果不够准确。这么说比较抽象,下面我们以最常见的两种穿越为例,认识一下穿越究竟是怎么发生的。
时间穿越
拿到数据集后,需要将其按照一定比例分割为训练集和测试集,训练集用来训练模型,而测试集用来评测效果。要实现这个目的,最简单的实现方法,就是对于每条样本做一次随机选择,来判断将其放到训练集还是测试集。
但是这种实现方法,会导致一个问题,就是我们称之为“时间穿越”的问题。假设我们的样本数据包含了七月份和八月份的用户行为,按照上面的方法进行划分的话,划分的结果就是训练集和测试集中都可能含有七月和八月的数据,这样的数据在训练时没有问题,但是在预测评估时,会导致数据指标优于实际情况,例如,真的的AUC应该是0.7的话,那么在这样的数据集上评估出的结果就会大于0.7。
为什么呢?大家都知道训练集上训练出来的模型是不能在训练集上进行评估的,因为训练集上的评估结果会更偏好过拟合的模型,导致我们错误评估了模型的泛化能力。这就好比用来练习的试卷不能用来考试,因为这样会导致死记硬背的学生分数更高,而不是学习能力强的学生。类似的,在上面的例子中,由于训练集和测试集中都包含了七月和八月的数据,这就好像考试卷子中虽然没有包含练习试卷的题目,但是包含了非常相似的题目,也会导致我们错误判断一个学生的学习能力。究其根本原因,是因为在实际场景中,数据行为都是在快速变化的,相近时间内的行为存在一定的相似性,时间相差越远行为差异越大。这一点和一个稳定数据分布场景是完全不同的,如果数据分布在时间维度上是相对稳定的,那么时间因素就不是一个那么重要的因素,相互穿越带来的问题就会比较小。
会话穿越
以电商网站的推荐为例,用户在浏览一个商品时,某个推荐模块会为他推荐多个商品进行展现,用户可能会点击其中的某几个,其他的则不会点击。为了描述方便,我们将这些一次展现中产生的点击和未点击数据合起来称为一次会话(不同于计算机网络中会话的概念)。
在上面描述的样本划分方法中,一次会话中样本可能有部分被划分到训练集,另外部分会划分到测试集。这样的行为,我们称之为会话穿越。会话穿越的问题在于,由于一个会话对应的是一个用户在一次展现中的行为,所以是存在较高相关性的,穿越会带来类似上面提到的用练习题考试的问题;此外,会话本身是不可分割的,也就是说,在线上使用模型时,不可能让你先看到一次会话的一部分,然后让你预测剩余的部分,因为会话的展现结果是一次性产生的,一旦产生后,模型已经无法干预展现结果。这就好比说模拟考试时老师告诉你说是开卷的,于是你很开心地考了90分,但是到了真实考场上时,考试却是闭卷的,那么你可能只能得到70分。原因就在于你在模拟考试时利用了你在真实考试时无法利用到的信息。
穿越的本质
上面我们用两种类型的穿越,向大家介绍了穿越问题,但是这两种穿越,以及我们没有介绍到的其他类型的穿越,里面的核心问题是什么呢?
首先是一个信息泄露的问题。无论是时间穿越,还是会话穿越,其核心问题都在于在训练数据中的信息以不同方式、不同程度泄漏到了测试数据中。我在其他文章中也简单介绍过,机器学习本质上就是信息的游戏,信息的泄露必然会导致评估结果发生偏差。
其次是场景真实性的问题。上面的两种穿越问题中,线下训练测试的场景,都和线上真正预测未知数据的场景有着偏差,从而导致了评估结果的偏差。举个极端的例子,就好比慈溪在颐和园风平浪静的昆明湖训练水兵,然后去波涛汹涌的大海上和敌人打仗,焉有不败之理。
所以大家无论是在处理样本时,还是在处理特征时,需要对信息泄露和场景真实性问题加以注意,这两个问题可能会以各种形态出现在机器学习系统中,稍不留神可能就会被捉弄。