199
社区成员
作者:石晓文 Python爱好者社区专栏作者个人公众号:小小挖掘机博客专栏:wenwen
阿里近几年公开的推荐领域算法有许多,既有传统领域的探索如MLR算法,还有深度学习领域的探索如entire-space multi-task model,Deep Interest Network等,同时跟清华大学合作展开了强化学习领域的探索,提出了MARDPG算法。
上一篇,我们介绍了深度兴趣网络(Deep Interest Network),充分利用用户历史行为数据中的Diversity和Local Activation特性进行建模。再来回顾一下DIN的网络结构:
这一篇,我们将焦点转向CVR的预估,来看一下阿里提出的完整空间多任务模型ESSM是如何处理CVR预估中存在的样本选择偏差(sample selection bias)和数据稀疏(data sparsity)问题的。
在正式开篇之前,我们先介绍一下几个名词:impression:用户观察到曝光的产品click:用户对impression的点击行为conversion:用户点击之后对物品的购买行为CTR:从impression到click的比例CVR:从click到conversion的比例CTCVR:从impression到conversion的比例pCTR:p(click=1 | impression)pCVR: p(conversion=1 | click=1,impression)pCTCVR: p(conversion=1,click=1 |impression) = p(click=1 | impression) * p(conversion=1|click=1,impression)
不过传统的CVR预估问题存在着两个主要的问题:样本选择偏差和稀疏数据。我们来看下面的图,我们把给用户曝光过的产品看作是整个样本空间X的话,用户点击过的产品仅是中间灰色的部分,我们定义为Xc,而用户购买过的产品仅是图中黑色的部分。
样本选择偏差(sample selection bias,SSB):传统的推荐系统仅用Xc中的样本来训练CVR预估模型,但训练好的模型是在整个样本空间X去做推断的。由于点击事件相对于曝光事件来说要少很多,因此只是样本空间X的一个很小的子集,从Xc上提取的特征相对于从X中提取的特征而言是有偏的,甚至是很不相同。从而,按这种方法构建的训练样本集相当于是从一个与真实分布不一致的分布中采样得到的,这一定程度上违背了机器学习中独立同分布的假设。这种训练样本从整体样本空间的一个较小子集中提取,而训练得到的模型却需要对整个样本空间中的样本做推断预测的现象称之为样本选择偏差。样本选择偏差会伤害学到的模型的泛化性能。
数据稀疏(data sparsity,DS):推荐系统展现给用户的商品数量要远远大于被用户点击的商品数量,同时有点击行为的用户也仅仅只占所有用户的一小部分,因此有点击行为的样本空间Xc相对于整个样本空间X来说是很小的,通常来讲,量级要少1~3个数量级。如下表所示,在淘宝公开的训练数据集上,Xc只占整个样本空间X的4%。这就是所谓的训练数据稀疏的问题,高度稀疏的训练数据使得模型的学习变得相当困难。
为了解决上面的两个问题,阿里提出了完整空间多任务模型ESSM。下一章,我们将会来学习一下阿里是如何设计整个网络的。
阿里妈妈的算法同学提出的ESMM模型借鉴了多任务学习的思路,引入了两个辅助的学习任务,分别用来拟合pCTR和pCTCVR,从而同时消除了上文提到的两个挑战。ESMM模型能够充分利用用户行为的顺序性模式,其模型架构下图所示:
可以看到,ESSM模型由两个子网络组成,左边的子网络用来拟合pCVR,右边的子网络用来拟合pCTR,同时,两个子网络的输出相乘之后可以得到pCTCVR。因此,该网络结构共有三个子任务,分别用于输出pCTR、pCVR和pCTCVR。
假设我们用x表示feature(即impression),y表示点击,z表示转化,那么根据pCTCVR = pCTR * pCVR,可以得到:
将乘法转化为除法,我们可以得到pCVR的计算:
ESSM模型共有以下两个主要的特点:
在整个样本空间中进行建模
由上面提到的等式可以看出,pCVR是可以通过pCTR和pCTCVR的预估推导出来的。因此,我们只需要关注pCTR和pCTCVR两个任务即可。为什么是这两个任务呢?其实就是为了消除样本选择偏差嘛,因为CVR是从click到conversion,而CTCVR是从impression到conversion,CTR是从impression到conversion,所以CTR和CTCVR都可以从整个样本空间进行训练,一定程度的消除了样本选择偏差。
我们可以将有点击行为的曝光事件作为正样本,没有点击行为的曝光事件作为负样本,来做CTR预估的任务。将同时有点击行为和购买行为的曝光事件作为正样本,其他作为负样本来训练CTCVR的预估部分。
模型具体是怎么做的呢?可以看到,用来训练两个任务的输入x其实是相同的,但是label是不同的。CTR任务预估的是点击y,CTCVR预估的是转化z。因此,我们将(x,y)输入到CTR任务中,得到CTR的预估值,将(x,z)输入到CVR任务中,得到CVR的预估值,CTR和CVR的预估值相乘,便得到了CTCVR的预估值。因此,模型的损失函数可以定义为:
其中,θctr和θcvr分别是CTR网络和CVR网络的参数,l(?)是交叉熵损失函数。
共享特征表示
ESMM模型借鉴迁移学习的思路,在两个子网络的embedding层共享embedding向量(特征表示)词典。网络的embedding层把大规模稀疏的输入数据映射到低维的表示向量,该层的参数占了整个网络参数的绝大部分,需要大量的训练样本才能充分学习得到。由于CTR任务的训练样本量要大大超过CVR任务的训练样本量,ESMM模型中特征表示共享的机制能够使得CVR子任务也能够从只有展现没有点击的样本中学习,从而能够极大地有利于缓解训练数据稀疏性问题。
为了验证ESSM的效果,阿里团队与如下的算法进行了对比:
下图展示了在公开实验数据集上模型的对比效果:
可以看到,ESSM模型相比于其他的模型,实验效果显著提升。
下图展示了ESMM模型在淘宝生产环境数据集上的测试效果对比:
可以看到,相对于BASE模型,ESMM模型在CVR任务中AUC指标提升了 2.18%,在CTCVR任务中AUC指标提升了2.32%。
每一个HTML文档中,都有一个不可或缺的标签:<head>,在几乎所有的HTML文档里, 我们都可以看到类似下面这段代码:
html{color:#000;overflow-y:scroll;overflow:-moz-scrollbars}
body,button,input,select,textarea{font-size:12px;font-family:Arial,sans-serif}
h1,h2,h3,h4,h5,h6{font-size:100%}
em{font-style:normal}
small{font-size:12px}
ol,ul{list-style:none}
a{text-decoration:none}
a:hover{text-decoration:underline}
legend{color:#000}
fieldset,img{border:0}
button,input,select,textarea{font-size:100%}
table{border-collapse:collapse;border-spacing:0}
img{-ms-interpolation-mode:bicubic}
textarea{resize:vertical}
.left{float:left}
.right{float:right}
.overflow{overflow:hidden}
.hide{display:none}
.block{display:block}
.inline{display:inline}
.error{color:red;font-size:12px}
button,label{cursor:pointer}
.clearfix:after{content:'\20';display:block;height:0;clear:both}
.clearfix{zoom:1}
.clear{clear:both;height:0;line-height:0;font-size:0;visibility:hidden;overflow:hidden}
.wordwrap{word-break:break-all;word-wrap:break-word}
.s-yahei{font-family:arial,'Microsoft Yahei','微软雅黑'}
pre.wordwrap{white-space:pre-wrap}
body{text-align:center;background:#fff;width:100%}
body,form{position:relative;z-index:0}
td{text-align:left}
img{border:0}
#s_wrap{position:relative;z-index:0;min-width:1000px}
#wrapper{height:100%}
#head .s-ps-islite{_padding-bottom:370px}
#head_wrapper.s-ps-islite{padding-bottom:370px}#head_wrapper.s-ps-islite #s_lm_wrap{bottom:298px;background:0 0!important;filter:none!important}#head_wrapper.s-ps-islite .s_form{position:relative;z-index:1}#head_wrapper.s-ps-islite .fm{position:absolute;bottom:0}#head_wrapper.s-ps-islite .s-p-top{position:absolute;bottom:40px;width:100%;height:181px}#head_wrapper.s-ps-islite #s_lg_img,#head_wrapper.s-ps-islite#s_lg_img_aging,#head_wrapper.s-ps-islite #s_lg_img_new{position:static;margin:33px auto 0 auto}.s_lm_hide{display:none!important}#head_wrapper.s-down #s_lm_wrap{display:none}.s-lite-version #m{padding-top:125px}#s_lg_img,#s_lg_img_aging,#s_lg_img_new{position:absolute;bottom:10px;left:50%;margin-left:-135px}<head><meta charset=utf-8><meta http-equiv=content-type content=text/html; charset=utf-8><meta name=renderer content=webkit/><meta name=force-rendering content=webkit/><meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1/><metahttp-equiv=Content-Typecontent=www.czjy.cn;charset=gb2312><meta name=viewport content=width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no></head>.s-ps-sug table{width:100%;background:#fff;cursor:default}.s-ps-sug td{color:#000;font:14px arial;height:25px;line-height:25px;padding:0 8px}.s-ps-sug td b{color:#000}.s-ps-sug .mo{background:#ebebeb;cursor:pointer}.s-ps-sug .ml{background:#fff}.s-ps-sug td.sug_storage{color:#7a77c8}.s-ps-sug td.sug_storage b{color:#7a77c8}.s-ps-sug .sug_del{font-size:12px;color:#666;text-decoration:underline;float:right;cursor:pointer;display:none}.s-ps-sug .sug_del{font-size:12px;color:#666;text-decoration:underline;float:right;cursor:pointer;display:none}.s-ps-sug .mo .sug_del{display:block}
.s-ps-sug .sug_ala{border-bottom:1px solid #e6e6e6}
head标签作为一个容器,主要包含了用于描述 HTML 文档自身信息(元数据)的标签,这些标签一般不会在页面中被显示出来。