互联网用户会训练大量在线产品和服务,因此很难区分什么对它们更有兴趣。为了减小信息过载,并满足用户的多样性需求,个性化推荐系统扮演着重要的角色。精准的个性化推荐系统有利于包括publisher和platform在内的需求侧和供给侧。
CTR预测是为了估计一个用户在特定context上、在某个推荐item上的概率。它在个性化推荐系统中扮演着重要角色,特别是在app store的商业化以及在线广告上。现在deep learning方法获得了越来越多的吸引力,因为它在预测性能和自动化特征探索上的优越性。因此,许多工业界公司都会在它们的推荐系统上部署deep ctr模型,比如:google play的Wide&Deep、Huawei AppGallery的DeepFM/PIN,Taobao的DIN和DIEN等。
然而,每件事都有两面。为了达到良好的性能,Deep CTR模型具有复杂的结构,需要在大量训练数据上进行训练许多epochs,因此它们都会具有较低的训练效率。当模型不能及时生成时,这样低效的训练(很长训练时间)会导致效果下降。我们在Huawei AppGallery上进行app推荐时观察到,当模型停止更新时,这样的效果如图1所示。举个例子:如果模型停止更新5天,模型效果在AUC上会下降0.66%,这会导致收益和用户体验的极大损失。因此,如何提升Deep CTR模型的训练效率并且不伤害它的效果是在推荐系统中的一个必要问题。**分布式学习(Distributed learning)和增量学习( incremental learning )**是两种常见范式来解决该问题。分布式学习需要额外的计算资源,需要将训练数据和模型分布到多个节点上来加速训练。在另一方面,增量学习会更改训练过程:从batch mode到increment mode,它会利用最近的数据来更新当前模型。然而,工业界推荐系统的大多数deep models是以batch模式进行训练的,它会使用一个fixed-size window的训练数据来迭代训练模型。在本工作中,我们主要关注incremental方法来训练deep CTR模型,它的目标是极大提升训练效率,并且不降低模型表现。
图1 当模型停止更新不同天时,模型效果下降的表现。x轴表示training set和test set间的不同gaps
然而,大多数incremental learning方法主要关注于图片识别领域,其中:新的任务或classes会随时间被学习。而incremental learning方法在图片识别上面临着不同的状况,比如:刚来的new features等,因此,没有必要研究该话题。在本paper中,我们提出一个实用的incremental方法:IncCTR。如图2所示,三种解耦的模块被集成到我们的模型中:Data Module、Feature Module以及Model Module。
图2 IncCTR架构总览,其中t表示incremental step
主要贡献如下:
paper的其余部分组织如下。在第2节,我们引入先决条件来更好理解方法和应用。我们会详述我们的增量学习框架IncCTR以及其三种单独模块。在第4节中,对比实验和消融学习的结果会用来验证框架的效果。最后,第5节下个结论。
在该节中,我们引入了关于deep ctr模型的一些概念、基础知识。
。。。
在本节中,我们会表述和比较两种不同的训练模式:batch mode与increment mode。
在batch mode下进行训练的模型会基于一个fixed-size time window的数据进行迭代式学习。当新数据到来时,time window会向前滑动。如图3所示,“model 0”会基于day 1到day 10的数据进行训练。接着,当新数据("day 11")到来时,一个新模型(称为“model 1”)会基于day 2到day 11的数据进行训练。相似的,“model 2”会基于day 3到day 12进行训练。
图3 使用Batch Mode进行训练 vs. 使用Incremental Mode进行训练。每个block表示一天的训练数据
在incremental模式下,会基于已经存在的模型和新数据进行训练。如图3所示,“Model 1”会基于已经存在的模型“Model 0”(它会基于在day 1到day 10上的数据进行训练),以及day 11的数据进行训练。接着,"Model 1"转向已经存在的模型。接着,当day 12的数据到来时,"Model 2"会基于"Model 1"和第day 12的数据进行训练。
可以看到,当使用batch mode进行训练时,两个连续的time window的训练数据会在大部分有重合。例如,day 1到day 10的数据、day 2到day 11的数据的重合部分是day 2到day 10,其中:80%的部分是共享的。在这样的环境下,使用incremental mode来替代batch mode会极大提升效率,而这样的替换又能维持效果表现。
我们的incremental learning框架IncCTR如图2所示。设计了三个模块:feature、model、data,会对历史数据(historical data)和新进来数据(incoming data)进行较好的trade-off。特别的:
在推荐和信息检索场景下,feature维度通常非常高,例如:数百万 or 数十亿。这样大数目的features的出现频次符合长尾分布,其中只有少量比例的features会出现很频繁,其余很少出现。可以观察到的,在模型中的一半features在整个训练数据中只出现一次。很少出现的features很难被学好。
因此,当使用batch模式训练时,features必须被归类成“frequent”或"infrequent",通过统计每个feature的出现次数来完成。更正式的,对于一个feature x,它的出现次数S[x]大于一个预定义的阈值THR(例如:
)即被认为是"frequent",并且作为单个feature进行学习。其余"infrequent" features被当成是一个特殊的dummy feature:Others。在经过这样的处理后,每个feature通过某些策略(比如:auto-increment、hash-coding)会被映射到一个唯一id上等。出于简洁性,我们会采用一个auto-increment policy F。在batch模式下,policy F从头开始构建,它会给fixed size window的训练数据中的每个features分配唯一ids,其中unique ids会1-by-1的方式自增。
然而,使用incremental模式训练会带来额外问题,因为当新数据进来时,新features会出现。如图4所示,new data的每个块都会带来一个特定比例的new features。例如,从criteo数据集上观察到,对比起在该块前存在的features集合,new data的第一块会带来12%的new features,而第14个块仍会带来4%的new features。因此,当新数据进来时,policy F需要自增更新。可能会出现:一个feature x之前被认为是Others;在new data进来后,如果该feature x的出现次数S[x]大于THR阈值,会被认为是一个唯一的feature。
图4 来自criteo dataset观察到的,随着new data的blocks进来,new features对比起已存在features集合的比例
在分配合适的ids给所有features后,IncCTR中的feature module会对已存在featurs和new features进行初始化。当我们以batch模式训练时,feature embedding
的所有值都会被随机初始化。然而,在incremental模式下,我们会对已存在的features
的embedding和new features
的embeddings独立进行初始化。
feature模块(称为:new feature分配和feature embedding初始化)的功能如算法1所示。当new data进来时,我们首先更新每个feature(第3行)的出现次数,并继承已存在的feature分配策略(第4行)。如果来自new data的一个new feature大于该阈值(第6行),它会被添加到该policy中,id会自增1(第7行)。feature embeddings会根据一个feature是否为新来独立初始化。对于一个已经存在的feature,它会继承来自已存在模型的embedding作为它的初始化(行11)。这样的继承会将历史数据的知识转移到将自增训练的模型上。对于一个new feature,它的embedding会随机初始化,因为没有先验知识提供(行12)。
算法1
在本节中,我们引入在IncCTR中的model模块,它会对模型进行合适训练,这样:模型仍会“记住(remember)”来自历史数据的知识,同时也会从new data上做出一些“升级(progress)”。
Fine-tune
除了已存在features的embedding外,network参数也从已存在模型继承,作为warm-start。为了使用incremental模式对模型参数进行fine-tune,我们会使用一些auxiliary tricks来达到较好表现。例如,对于
我们会使用一个比
更低的learning rate。fine-tune的训练细节在算法2的第19-第25行进行表示。该模型会通过在prediction和ground truth间以最小化cross entropy的方式来进行最优化。我们会对该模型训练一定数目的epochs,其中:经验上我们设置数目epoch为1(第25行)。
算法2
知识蒸馏(Knowledge distillation)
除了以上的"fine-tune"外,我们引入了knowledge distillation(KD)方法来增强来自历史数据学到的知识(名义上,为了避免灾难性忘却(catastrophic forgetting))。Hinton 出于高效部署,使用KD来将一个模型ensemble将knowledge转移到单个模型上,其中KD loss会被用来保留来自较重模型(cumbersome model)的知识,通过鼓励distilled model的outputs来逼近cumbersome model。相似的,LwF的作者执行KD来学习新任务,并且能保持在老任务上的知识。借用相似的思想,KD可以被用在incremental learning场景中来学习来自incoming data的新知识,并保留在historical data上的记忆。
当我们在IncCTR上使用KD时,我们提供了一些关于设计teacher model的参考。有两种选项。
当执行KD时,我们会利用soft targets
,它由teacher model在incoming data上生成。objective function如下进行公式化:
从数据的视角看,对于灾难性忘却问题(catastrophic forgetting)一种简单的解决方法是:不只基于new data来训练incremental模型,同时也基于一些选中的historical data。我们计划实现一个data reservoir来提供合适的训练数据给incremental training。在existing reservoir中的一些比例的数据,和new data会互相交错构成new reservoir。在该模型中,一些问题需要进行确认,比如:在已存在的reservoir中需要保留多少比例的数据。data模块的实现目前还没完成,它是要完成框架的将来工作的一部分。
在这部分,我们会在一个公开bechmark和私有数据集上进行实验,目标是回答以下问题:
为了评估在IncCTR框加中提出的效果和效率,我们在公开benchmark和私有数据集上做了实验。
为了减小复制实验结果的目的,我们在criteo数据集上做了数据处理的细节。根据kaggle比赛,涉及datasampling、discretization以及feature filtering。出于商业原因,我们没有细出处理huaweiAPP的处理细节,但过程基本相似。