背景
做推荐算法肯定绕不开多目标,点击率模型、时长模型和完播率模型是大部分信息流产品推荐算法团队都会尝试去做的模型。单独优化点击率模型容易推出来标题党,单独优化时长模型可能推出来的都是长视频或长文章,单独优化完播率模型可能短视频短图文就容易被推出来,所以多目标就应运而生。
刚开始做多目标的时候,一般针对每一个目标都单独训练一个模型,单独部署一套预估服务,然后将多个目标的预估分融合后排序。这样能够比较好的解决推荐过程当中的一些负面case,在各个指标之间达到一个平衡,提升用户留存。但是同时维护多个模型成本比较高,首先是硬件上,需要多倍的训练、PS、和预估机器,这是一笔不小的开销(一个月保守百万左右吧),然后是各个目标的迭代不好协同,比如新上了一批好用的特征,多个目标都需要重新训练实验和上线,然后就是同时维护多个目标对相关人员的精力也是一个比较大的消耗。
可以通过排序优化算法排序学习LTR(Learning To Rank)方法优化Item的重要性来解决多目标打算解决的问题,但是由于工程实现、推荐框架调整等方面的困难,相关方法在实际应用中比较少。
排序学习可以理解为机器学习中用户排序的方法,首先推荐一本微软亚洲研究院刘铁岩老师关于LTR的著作,Learning to rank for information retrieval,书中对排序学习的各种方法做了很好的阐述和总结。排序学习是一个有监督的机器学习过程,对每一个给定的查询-文档对,抽取特征,通过日志挖掘或者人工标注的方法获得真实数据标注。然后通过排序模型,使得输入能够和实际的数据相似。常用的排序学习分为三种:PointWise,PairWise和ListWise。
多任务学习是目前处理多目标建模使用较多的方法,相较于多模型的融合,多任务学习能做到端到端的学习,同时能够节约建模的时间,因为多个模型可以同时建模。在多任务学习中,又可以细分成底层共享表示的优化和任务序列依赖关键的建模。在底层共享表示的优化中,以MMoE(Multi-gate Mixture-of-Experts)[1]和PLE(Progressive Layered Extraction)[2]两种网络结构较为常用。在任务序列依赖关系建模中,以阿里的ESMM[3]较为典型。
通过上述多任务学习训练一个模型预估多个目标,然后线上融合多个目标进行排序。多个目标融合的时候很多公司都是加权融合,比如更看重时长可能时长的权重就大些,更看重分享,分享的权重就大些,加权系数一般通过AB实验调整然后固定,这样带来的问题就是,当模型不断迭代的时候,这个系数可能就不合适了,经常会出现的问题是加权系数影响模型的迭代效率。具体多个目标怎么融合,这个里面机制发挥的空间比较大,这里不再赘述。
多目标建模的常用方法
一.多模型融合
多模型融合是指根据不同的任务单独训练不同的模型,最终根据最终的目标将各模型的结果相加或者相乘后进行融合排序。以CTR和CVR为例,最终的目标通常是CTCVR,因此,可以分别训练一个CTR模型和CVR模型,如下图所示:
通常在实际的任务中会根据不同任务的重要性,对该任务赋予不同的权重。这种方案最主要的优点是相对较为简单,每次单独训练一个模型,只需要调优该模型,不需要考虑其它目标。缺点也是很明显的,主要有如下的几个方面:
- 多个模型结果的融合,这里面涉及到超参数的选择,通常可以采取grid search的方案确定超参;
- 每次调优一个模型,而不更新组合并不一定会带来最终效果的提升;
- 没有考虑两个数据之间的关系,如上述的CTR与CVR之间存在顺序的关系;
二.多任务学习
对于多模型融合存在的问题,通过多任务学习能够在一定程度上解决这些问题,首先,在多任务学习中,由于将多个模型合并成一个模型,这样能够减少维护成本及减少资源;对于数据较为稀疏的任务,通过多任务学习的方式,能够提高模型的效果;
共享Embedding 多塔结构
底层共享embedding,三个目标三个独立的塔,NN层各个目标完全独立的。点击模型使用全量有效曝光样本进行训练,时长模型和完播率模型使用点击样本进行训练。经过多次迭代,这个结构上线后大盘PV和时长都有一定提升,每一个目标单独来看,点击指标基本微降,时长和完播率指标提升较多。
在底层共享表示优化中,目前业界主流的多目标建模的网络结构是MMoE[1]和PLE[2]两种,其中MMoE的网络结构如下图c所示:
在上图a中是Shared-Bottom model,任务A和任务B共享部分的网络结构,假设这部分的共享网络结构由$f(x)$表示,$h^A(f(x))$表示的是任务A的输出,$h^B(f(x))$表示的是任务B的输出,综上,Shared-Bottom Model可由下式表示:
$$yk=h^k(f(x))$$
通过在底层共享网络,能够起到互相补充学习的作用,上层的任务之间相关性越高,对于模型的学习也会越充分,但是,如果上层的任务之间的相关性很差,这种情况对于最终的效果却是起到了抑制的作用,即上面提到的负迁移现象,这也是多任务学习难以训练的一个原因。在很多的图像相关的任务中,就存在这样的结构,以人脸检测任务为例,在人脸检测任务中包括了三个方面的目标,分别为face classification,bounding box regression和facial landmark localization,这三个任务可以共享底层的CNN网络,以MTCNN[4]模型为例,其中的O-Net的网络结构如下图所示:
最终的损失函数为:
$$min\Sigma^N_(i-1)\Sigma_(j\in{det,box,landmark})\alpha_j\beta^j_iL_i^j$$
其中,$\alpha_j$和$\beta_i^j$是两个超参中是根据经验值确定的,$L_i^j$表示的是第$j$个任务的损失函数。