CSCNN:新一代京东电商广告排序模型
扫描二维码
随时随地手机看文章
分享嘉宾:刘鹄 京东 算法工程师
编辑整理:李沛欣
出品平台:DataFunTalk
本次分享主要包括以下内容:
-
背景介绍
-
CTR模型的优化方向
-
基于视觉信息的CTR广告预测
-
我们的工作:CSCNN
-
效果展示
京东搜索广告依托于京东和京准通的数字营销平台实现搜索场景下的流量变现,每天帮助数百万的广告主触达数亿的京东用户。
1. 京东9NAI平台
京东广告算法团队主要做京东电商平台下全场景的广告流量变现,包括的业务线包括搜索、推荐、站外、线下、品牌,360营销等等。用到的主要的模型,除了CTR模型,还有CVR、出价、图像、创意模型等,这些都依赖于京东自研的9NAI的机器学习平台。该平台拥有离线训练,离线预估,线上inference、 模型的发版等功能。整个平台的内核基于TensorFlow框架搭建,并根据业务进行了性能优化,离线训练的调度则基于k8s开发。
2. 电商环境下优化ECPM的主要方式
在京东搜索广告的直观的展示界面,当用户搜索Query为"连衣裙"时,前序模块会召回n个广告,都是和连衣裙的Query强相关、符合Query约束的商品。
ECPM排序的主要工作是n个广告内部顺序的精排。在广告场景下,排序的指标就是平台的营收。
具体来看,作为CPC广告,广告主为每次点击支付确定的出价bid。因此每次展现平台所获得的价值,就等于用户点击广告的概率再乘以这次点击的出价,即ECPM ( effective cost per mile,千次展示期望收入 )。但是有时需要考虑Query下所有展现给用户的商品对平台带来的总价值,即此时需要优化所有展现给用户广告ECPM的和。但由于用户Query为"连衣裙"时,用户的下拉深度有限,所以该问题是有约束的优化:在用户看到有限深度广告的前提下,极大化用户对平台的总营收。
如果展现给用户广告之间的CTR条件独立,可以通过贪婪方式求解优化,即:按ECPM从大到小依次展现给用户,这样Query下的整体收入最高。
而ECPM中的第二项bid是由广告主给出的。假如用ECPM的序作为训练和预估的指标的话,广告主可能通过调bid来hack模型系统。为避免这种情况,我们一般在离线时采用AUC作为训练和评估指标,通过训练CTR排序效果更好的模型,来间接提升线上ECPM排序和线上收入。
CTR ( Click-Through-Rate ) 即在建模展现这条广告的情况下,用户点击的概率。在搜索的场景下,该概率可以描述成依赖于4个不同类型输入的函数:
-
Query:描述用户搜索意图。
-
用户侧特征:描述用户的兴趣、偏好。
-
商品侧特征:描述这个商品是否优质。
-
context特征:描述用户搜索时属于怎样的场景,是上班的时候搜的还是周末搜的,此时是否有活动。
1. 特征工程与提取数据
特征工程主要包括以下几点:
多模态信息建模:
-
人工特征:一般在构建CTR模型的初期,会花很多精力做人工特征,比如说ID类的或者是实数的特征。通过构建有区分性的特征来优化模型的效果。
-
文本特征:描述细粒度Query中的用户意图。
-
用户侧特征:对用户和商品之间关系的建模。比如说对用户序列进行建模,或者是对用户和商品之间的交互关系做图表示建模。
-
图像特征:它和前面的信息源的模态不同,但在多媒体的场景下,图像一般是和文字一起构建完整的商品信息展现给用户,所以这部分的建模也很有必要。
特征的交叉:FM 、FFM、DCN等替代繁重手工特征交叉的方法。
解决过拟合问题:解决特征长尾稀疏时,embedding的过拟合问题。
2. 对CTR模型做目标函数刻画
度量学习问题:之前给出的搜索场景不是很适合做pointwise的模型,主要的原因在于在搜索的场景下,候选集很有限。比如说搜连衣裙的时候, n个商品都是连衣裙,并不需要区分用户点击连衣裙商品和鞋子商品的概率的高低,因为它没有可比性。所以在搜索场景下,做得更多的是在小候选集下的优化过程,此时需要做一些Query下的AUC的训练和预估。
Selection bias 问题:主要描述的是在电商场景下会出现一些训练集和测试集不一致的情况。测试集指的就是线上预估的集合,因为在线上召回几百个商品,要对这几百个商品进行排序的情况下,因为实际上一页展现的商品有限,可能最终展现给用户只有头部的这几个有label的商品。所以在离线评估的时候,只能评估这几个商品的使用情况,但是在线上Serving的时候需要对整体进行排序,就要解决Selection bias的问题。
长期回报问题:在上一页PPT中给出了一些简单的假设,是当上下的商品没有耦合关系的情况下,可以做贪婪CTR模型。如果有耦合关系,可能就要对搜索词下的整个用户对电商平台产生的回报,即加和的Reward ( 长期回报 ) 建模。
3. 结合系统架构的工作
Online Learning:线上系统中数据分布式是时变的。工程上的传统方式是做定期重启的全量训练。但由于数据量大,训练很慢,依然会导致训练和预估存在时间/分布的gap。online-learning是一种很有用的方向,通过流式的数据预处理和训练,使模型紧跟线上分布,解决时变带来的gap。
线上分布式serving:由于单机内存的限制,线上模型的体积会受到约束。我们通过分布式和模型并行支持TB型的模型的加载,同时保证模型各部分参数版本一致性。放开了线上内存的限制,增加模型的表达能力。
线上gpu serving:放开线上计算复杂度的限制,有助于使用更深的更复杂的模型结构来增加模型的表达能力。
所以说从整体上来看,本研究所探讨的使用视觉信息提升排序模型效果的工作,主要还是集中在第一部分——特征和数据建模中多模态的建模。通过优化这些图像的特征建模,能够得到商品侧更好的展现效果,进而提升用户对于商品的点击率。
03
基于视觉信息的CTR广告预测
1. 视觉信息在商品展现中给人呈现的印象
Intuition:在整个搜索版面中,每个商品都是图文结合的。商品主图的版面很大,有很强的视觉冲击力,而且主图中会包含很多细节信息,比如说材质、纹理、款式等,这些信息是难以通过title、ID类特征或者是一些属性信息体现出来的,只能通过图像来提取这些细节信息进行建模。而且在训练的过程中,只对这些ID类特征进行辨别,可能还会遇到一些稀疏或者冷启动的问题。假如使用CNN来提取图像特征的话,更有可能来避免这些事情来提升模型的泛化性。
2. 使用图像建模的瓶颈
工程实现较为困难:此前用到的一些点击率预估模型都是比较简单的MLP的模型,他们其实训练和serving都是非常快的。但是加上CNN之后,训练会出现性能瓶颈,导致模型更新周期更长;serving也会出现非常严重的性能瓶颈,可能会直接影响线上服务的时迟。
建模效果收益有限:
在使用图像特征之前,我们已经提了很多的商品侧的特征,传统建模方式不能完全保证从图像中来获取到的是增量细节信息。假如只提取到一些和已有属性或者类目重复的信息,那么引入CNN直接建模图像的意义就很小了。
和传统图像的任务不同,例如检测分割或者是分类问题的监督信号非常强,但点击率预估是一个监督信号很弱的场景。用户点或者没点二分类场景中,本身就是包含了一定的random noise。在这种监督信号不强、有噪的情况下,训练好CNN是困难的。
3. 问题的解决
下面,我们主要针对这两点做了一些已有方法的调研。
-
固定提取embedding图像:不做二阶段的训练,从而规避前述问题。但是固定的CNN提取出来的特征,无法保证和已有的属性、类目信息不产生交叠,因此CNN提供的增量信息有限。
-
端到端的CNN和CTR模型联合的训练:绝大多数工作还都是在做离线的评估,很少有做工业级数据的线上serving。所有工作都直接将传统用于图像分类的CNN直接拼入CTR模型中,并没有做任何结构的改进以适配当下问题 ( 后续会说明传统CNN解决CTR问题的不足 )。
-
pre-training:使用图像分类/只基于图像的CTR问题,做pre-training。以期获得二阶段更好的效果。
04
我们的工作:CSCNN
1. 研究的出发点:CTR模型建模本身存在的问题
传统使用CNN引入图像信息的模式,属于Late Fusion。这种方法从CNN提取出embedding,再和已有的特征一起参与 CTR的模型建模,本身就存在一些问题。
-
信息浪费:在建模图像之前,模型通过类目等id类特征就已经知道这个商品是连衣裙了。而这些视觉先验现在还没有加到CNN的建模中来,即这部分的信息被浪费了。假如知道这些先验,CNN的任务就会更简单些。换句话说,CNN的任务应该是:在知道该商品为连衣裙类目的情况下,提取出连衣裙相关的特征、捕获连衣裙的细节。假如能把已有的视觉先验加到CNN的输入中,CNN的训练和 serving效果都会更好。
-
包含与类目无关的信息:如果把这些有视觉先验的信息提前告诉CNN,它就有可能避免提取到一些与类目无关的信息。对于连衣裙图片,可能背景中有一些和类目相关性不高的物品。我们可以根据类别先验,避免将背景噪声耦合进来。
综上,我们整体的方向就是通过已有的图像之外的视觉先验,帮助CNN的学习。
2. SENet作为特征再校准模块的作用
前期的调研中,我们发现SENET的思想和我们有些类似。做图像的同学都比较清楚,SENET是被插在每个卷积操作的Feature map之后,有点类似于Self-attention的小模块。首先把它的空间的尺度给压掉,得到c维的向量,再做c维向量内部的交互,得到c维的 scale乘到c维的feature map上。
举个例子,我有c个Feature map ( 特征图 ),通过内部的交互来决定哪个特征图应该加强,哪个应该减弱。这是一种类似self-attention ( 自注意力机制 ) 的 Feature map recalibration ( 特征图再校准 ) 的问题。在点击率预估的问题中,recalibration就有点像做特征选择。可以认为这c个特征图是表示图像不同方面的信息,通过自注意力机制的方式去进行选择。但是有没有可能把这些类目的信息或者是从其他地方得到的视觉先验加进来,做一些基于视觉先验的特征选择呢?答案是肯定的。
3. 类目特定的卷积神经网络:CSCNN
Category Specific CNN ( 类目特定的卷积神经网络 ),具体的操作方式和SENET稍微有点类似。
还是以连衣裙特征提取任务为例,当给定类目是连衣裙时,可以把连衣裙的embedding加到 channel-wise attention ( 通道域注意力机制 ),以及 spatial-wise attention ( 空间域注意力机制 ) 的过程中。这种方式相当于为输入的feature map提取和 category有关的channel和spatial feature ( 空间特征 )。或者说是在卷积的每一层之后,通过引入category的信息做category specific的 feature recalibration。进而实现category specific的图像特征的抽取和图像特征选择。
这种逐层引入 category ( 类目特征 ) 的视觉先验到 CNN里面的方法,可以认为是在CNN逐层提取越来越抽象信息的过程中,不停地加入类目相关的特征选择。最终CNN提取出来的视觉信息就是一种类目相关的信息,或者说是把很大的图像信息抽取问题特化成小类目下的图像特征抽取问题,进而简化CNN的学习任务。
具体来讲,上面是具体的channel-wise attention ( 通道域注意力机制 ) 的实现方式。和SENET很类似的部分是在这里——通过Feature map来做一些average pooling ( 平均池化 ) 和 max pooling ( 最大池化 ),得到C维的向量。而后又拼上category embedding,从而相当于在前半部分得到全局的图像特征表示。经过全连接,得到类目特定的通道域侧的加权系数。平均池化和最大池化这两路加起来,经过sigmoid函数来得到通道加权系数,加权后得到channel的refined-feature map ( 提纯特征图 )。类似地还做了category-specific Spatial Attention module ( 类别特定的空间域注意力机制模型 ),它的方式就是把channel 的这一维average pooling或者max pooling掉,再拼上同样大小的category embedding,经过卷积的方式,提取到 spatial的加权系数,最后得到spatial的refined CNN Feature Map。通过这两种不同的模块,我们在卷积的过程中,在每个feature map后,都做了类目先验相关的特征抽取 ( 特征选择 ) 以提升CNN的学习效果。
3. 用9NAI进行的工程实现
再介绍一下为了解决前面说到的一些工程实现的问题,和对应的加速方法。
这张图是模型系统的简化图。从右下角开始看,特征通过线上feature dump下来。由于线上预估时实际上没有用到图像,所以这部分特征里也是没有图像的。
经过对相同商品ID及其图像特征的离线拼接,特征中就同时包含了图像特征、类别特征等三部分的特征,融到一起得到了一个端到端的带CNN的 CTR 预估训练模型。
端到端训练之后,会产生这样一个问题:CNN部分线上serving缓慢。我们采用了一种空间换时间的加速方式。具体是我们先对全站商品的CNN embedding进行离线预估,形成词表,把这个词表和模型的其他部分一起加载到线上的系统中,线上就可以直接通过商品的ID来查到商品的embedding。
之所以这样做,是因为统计发现广告主更换商品主图的频次很低。每天更新模型,每天使用最新的 CNN产出线上用的Lookup Table ( 查找表 ),对这种低频变化的主图是稳定可靠的。在线上通过20G的查找表,我们在CPU的机器上实现了20毫秒以内的tp99 ( 99%以内网络需求的最低延时 )。
4. 离线训练加速
加入CNN之后,原来可能一天能训练好的模型需要数天时间才能训练好,CNN在这部分的离线计算瓶颈比较大。
具体进行离线加速的方式包括两部分:
-
按照商品的主图进行聚合。我们将至多25个对应同商品的不同的请求聚合 ( 他们可能是来自不同用户的,但是他们看到或者点击了相同的商品 )。这批聚合了的请求在训练的过程中由于图像是相同的,所以CNN这部分只用forward和backward一次。这种方式在不影响离线训练效果的情况下,能极大提升离线训练效率。
-
单机4卡的同步更新。做这件事情的主要意义是可以节省CNN梯度回传的次数,4GPU只回传一次梯度,节省了 PS框架下server传输成本,进而提升离线训练速度。最终在百亿规模的训练集上我们可以在24小时内完成离线训练。
05
接下来介绍整个算法以及工程架构在线上和公开数据集上的实际效果。
1. 算法模型在公共数据集中的效果
在公开数据集的实验用了比较简单的CTR模型,来检验图像特征提取的这部分究竟起到多大的作用。这里没有看它和CTR模型的耦合,基本只关注图像。以亚马逊的数据集为训练集,每个子类里边都有几十类的商品,采用AUC评估指标,主要的对比方法分成以下几种:
-
不依赖于图像的方法;
-
依赖图像的方法;
-
在图像之外加入类别信息的视觉先验的方法。
和我们最接近的方法是SCA,它是在image caption ( 图像描述 ) 方向的工作,在卷积的后几层加入空间域和通道域的注意力机制。
对比之后发现,加入图像信息相比不加图像有非常大的AUC提升。通过Fintune ( 迁移学习 ) 的方法也比非Fintune的方法好,主要的考虑是来自于非迁移学习的方法可能提取出来的特征可能和已有的特征是有关系的,所以做迁移学习效果更好一些。
这三种方法就是加入类别信息的方法。虽然已有工作也加入了类别、视觉先验,但是他们都采用了late fusion的方式:CNN并不知道这些类别的先验,CNN提取了特征之后,再和这些类别、视觉先验进行耦合建模。
后两种方法都将类别先验加到了CNN里。SCA虽然是在图像描述中取得很好的效果,但是由于它无法很好地加到每一层的卷积后,对于简化CNN学习效果并没有我们好。我们在所有的指标上都大幅领先了state-of-the-art。
我们进一步回答了category specific模块对所有的CNN架构、注意力机制的普适性。无论是CNN-F还是inception,SE还是一些spatial attention的模块,加入了我们的category specific机制都可以得到一致的效果提升。
2. 算法模型在工业数据集中的效果
工业数据相比于公开数据有很大的不同,主要有两大特点:
-
数据量非常大:150亿的数据,3000多类别数,还包含各种各样已有的人工提取的特征。
-
工业数据的特点:长尾、稀疏。
这里我画了几个特征的例子。比如Query这个特征,有90%的Query出现的次数不足10次。在这种非常稀疏的场景下,特征泛化性差,过拟合和冷启问题严重。
我们的建模基础——CTR model是三层的DCN的模型,提取图像信息的网络采用了Res18的网络。我们在它的基础上进一步增加了category specific 模块。
研究发现,在基础的模型下,加入这种固定的CNN embedding已经有了一些提升效果,但并不是很大。在加入了Fintune迁移学习之后,得到了进一步的提升。再加入CBAM的模块,以类似self-attention的方式来决定哪些特征应该加强或者减弱,整个模型效果又得到一点点提升。但主要的提升还是来自于最后的CSCNN,通过加入类目特定的视觉先验来帮助CNN的学习。目前CSCNN已经在京东搜索广告上全量,每天服务数亿用户和数百万广告主。
嘉宾介绍:
刘鹄
京东 | 算法工程师
刘鹄,清华大学自动化系硕士。目前就职于京东,搜索广告排序模型方向负责人。工作曾在CVPR,NIPS,KDD等顶级会议发表。
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!