罗清:对比学习在快手推荐排序的应用
分享嘉宾:罗清 快手 高级算法工程师
编辑整理:吴祺尧 加州大学圣地亚哥分校
出品平台:DataFunTalk
导读: 推荐系统存在数据分布偏差与数据稀疏的问题,主要体现在群体兴趣与用户个性化的差异不易捕捉、部分反馈信号稀疏、负反馈不灵敏等。而对比学习可以在一定程度上缓解上述问题,提高推荐质量,带来更好的内生态和用户体验。今天分享的主题是对比学习在快手推荐场景的应用探索。
今天的介绍会围绕下面四点展开:
- 背景
- 最新研究进展
- 对比学习在快手的应用
- 总结&思考
01背景
首先我们要明确为什么推荐系统需要对比学习。
因为当前推荐系统存在多种bias现象、兴趣差异不易捕捉、负反馈不灵敏等,当然这些问题主要是数据稀疏和数据分布偏差导致的。如上图,虽然整体数据量并不少,但是对于每个user,或者item来说,还是过于稀疏。可以看到第四个视频明显更受欢迎,产生了流行度偏差。模型在训练的时候也更容易主导梯度。这些问题严重影响了用户体验,比如,推送的都是很相似的视频,用户点击了dislike,还会出现类似视频,所以解决这些问题可以带来更好的推荐质量。
解决数据稀疏问题的常用方法有数据降维(用更泛化的特征)和减少模型参数等。但是这两个方法会损失一定的有用信息。解决数据分布偏差问题的常用方法有IPW和重采样。但是IPW需要计算高方差的概率,使得它在稀疏数据中的稳定性和准确性存在一定限制。
对比学习的优势在于:
- 通过挖掘数据本身蕴含的标签信息,缓解数据稀疏的问题;
- 通过样本增广拟合数据的真实分布,缓解数据分布偏差问题;
- 通过自监督信号抽取数据中包含的通用知识,为主任务提供有效的信息。
总的来说,对比学习通过挖掘自身数据的信息来为模型提供额外信号,从而带来信息增益,以此缓解数据稀疏和数据分布偏差的问题。
假设在没有任何先验知识的情况下来分辨上图两组图片,可以通过图片自身蕴含的特征来判断出猫和猫是一类,而猫和狗是不同类别。
对比学习也是类似的原理,它是一种自监督学习方法,用于在没有标签的情况下,通过让模型学习哪些数据相似或不同来学习数据集的一般特征。类比到上图中的例子,使用对比学习给模型输入一部分包含猫的图片和另一部分包含狗的图片,可以不使用任何图片标签的情况下使得模型学习猫的特征和狗的特征。随后再使用很少的标签信号对模型进行有监督训练即可得到很好的分类效果。
下面介绍一下对比学习的流程。
以图像领域的任务为例,上图是经典的SimCLR框架。首先输入一张图片,通过数据增广(裁剪、旋转等)得到两种不同的图片。随后它们分别经过一个encoder得到图片的表征,再经过线性头投影至同一向量空间中。最后,通过最大化空间中两个表征之间的相似度来学习更好的encoder表征。经过优化的表征可以被用于下游任务中,使用fine-tuning来提升模型在目标任务的效果。
对比学习有以下三个常见的研究方向:
- 如何构造代理任务
常见的有图像与增广图像、图像与文本、句子与句子、句子与情感进行对比学习。在不同应用场景下,我们可以构造相应的代理任务来达到自监督学习的目的。
- 如何防止模型坍塌
模型坍塌即特征经过encoder后得到的embedding都会聚类至空间的一个点上。解决这一问题的常见方法有采集更多的负样本(使用memory bank)、使用非对称的模型结构(网络一个分支包含线性头而另一分支不使用线性头)以及非对称的梯度更新。
- 如何增广样本
常用的方法有裁剪、旋转、mask、shuffle、dropout等。这里的增广样本其实对于防止模型坍塌也是非常重要的一环,因为增广的样本不能让模型太难学,也不能太简单,所以实践中会采用多种增广来尝试。
对比学习一般采用InfoNCE作为损失函数,其来源于Contrastive Predictive Coding任务,目标是最大化当前item和上下文c的互信息,使用的方法是利用NCE最大化互信息的下界估计。
NCE是一种近似的最大似然估计,它通过对噪音样本的分布估计来推断真实分布。在softmax计算中,分母的归一化项计算开销大。NCE将多分类任务转化为每个样本与标签的二分类任务来避免归一化的计算开销。如果负样本的数量趋近于无穷大,那么NCE就是最大似然估计。所以在对比学习中,采样的负样本数量越多,效果越好。
对比学习最终学习的理想表征需要满足alignment与uniformity两个性质。
前者代表着相似样本在学习的向量空间中距离尽可能小,后者代表着样本表征在学习的向量空间中的分布尽可能均匀。
02 最新研究进展
下面介绍对比学习最新的研究进展。
- 对比学习在CV领域的研究
首先,由于对比学习在使用越大的batch size得到的效果越好,但是受限于GPU的内存限制,无法使得batch size无限增大,而MoCo提出了memory bank的设计,它将样本的表征保存在一个字典中作为之后batch的负样本。
此外,MoCo的encoder采用了动量更新,保证embedding更新的稳定性。
随后Google提出了SimCLR框架,它舍弃了memory bank的结构,认为采用数据增广和加入线性头的方法就足以保证对比学习的模型效果。实际上,MoCo的改进版本也采用了这一策略,发现最终的效果比SimCLR更优。SimSiam采用了非对称的网络结构,创造性地提出在对比学习框架中不需要引入负样本,也不需要采用动量更新的方法优化encoder,而仅仅需要在没有线性头的分支加入stop gradient就可以达到防止模型坍塌,同时取得很好的性能的目的。
- 对比学习在NLP领域也有部分实践
Bert在NLP领域应用广泛,但是它学习到的句子表征在向量空间内倾向于产生坍塌现象。这是因为输入语料存在大量高频词,所以语义的高阶表征容易被高频词主导,使得很多句子的高阶语义特征在空间中十分相近。对比学习可以很好地解决这一问题。
美团提出了ConSERT,发现在数据增广方法中,feature cutoff和shuffle在对比学习中最有效。SimCSE发现仅仅使用dropout就可以有效地解决语义坍塌的问题,且其性能优于ConSERT。出现这一现象的原因在于ConSERT集中在Embedding layer和Pool layer的扰动上,而SimCSE在网络结构中加入了扰动,所以这启发了我们在做数据增广时不仅需要考虑特征层面,也要考虑模型层面的增广。
- 对比学习在推荐系统领域的研究进展
阿里巴巴借鉴了MoCo的思路,加入了memory bank来减少曝光偏差。相较于将曝光未点击的样本作为负样本,他们认为memory bank中存储的负样本更加符合全局的样本分布。在此基础之上,他们还提出了多意图对比学习推荐系统Multi-CLRec,在全局的memory bank的基础之上加入了意图层面的memory bank。在负采样时,他们不仅从全局memory bank中选取负样本,还在所有不同意图的memory bank中抽取负样本。
美团提出了S^3-Rec模型,首先使用设计的自监督训练目标对模型进行预训练,然后根据推荐任务对模型进行微调。此工作的主要新颖之处在预训练阶段,我们基于MIM的统一形式精心设计了四个自监督的辅助任务:item与attribute的对比学习、sequence与item的对比学习(通过将sequence中的一个item进行mask操作来实现)、sequence与attribute的对比学习以及sequence与segment子序列的对比学习。因此,S^3-Rec能够以统一的方式来表征不同粒度级别或不同形式数据之间的相关性,并且也可以灵活地适应新的数据类型或关联模式。通过这样的预训练方法,可以有效地融合各种上下文数据,并学习属性感知的上下文化的数据表示。
ICL认为用户在点击商品时存在多种意图,但这些意图都是隐性的,潜藏在用户行为序列里,我们如果利用好它就能提高推荐的效果。核心思路就是从用户的行为序列里面学习用户隐式意图的分布函数,然后构造对比学习任务,同一类的拉近,不同类的拉远。具体地,ICL对用户的行为序列经过一个encoder后得到表征,并将所有表征进行K-means聚类操作。如果一个行为序列位于其中一个聚类空间中, 拉近该user到他聚类中心的距离,拉远到其他聚类中心的距离。每次迭代优化后的表征将会在新的循环中重新进行K-means聚类得到新的意图类。对比学习子任务辅助推荐主任务,最终在实验中得到了不错的效果。
CauseRec结合了因果推断的思想。它认为用户的行为序列中存在部分噪声信息,所以它希望判断行为序列中的item是否可以被替代。进一步,它分别将可替代的item与不可替代的item进行mask操作,使用对比学习的思想将mask可替代item的序列作为正例,mask不可替代item的序列作为负例。可替代性是通过该item与用户的兴趣表征以及target item的相关性排名来进行定义。
03 对比学习在快手的应用
下面介绍对比学习在快手的应用。
快手的推荐场景是短视频,可以获取的监督信号有观看时长、喜欢(like)、dislike、收藏、转发等。之前的做法是对每一种反馈信号都预估一次,最后将预测结果经过线性加权的方式进行打分排序。但是,由于不同类型的标签分布不一致,且它们的量纲也有一定差异,所以线性加权并不合适。业界通用的做法是使用各类反馈信号的rank值,但是这一做法丢弃了每一类预测分数之间的绝对值信息。最后,快手定义了短视频组合收益,其计算公式如上图所示。随后,我们借鉴了youtube的损失函数设计做了改进,它的好处在于数据兼容性较好,相比回归,模型的预估值在0到1之间。而且,相比回归任务,分类任务更加鲁棒。
上图展示了 快手排序模型的整体框架 。其中绿色框中的排序模型可以使用不同的base模型进行加载。框架中加入了三个辅助任务:user和item之间的辅助对比学习任务、user和user之间的辅助对比学习任务和user的正例子序列和负例子序列的辅助对比学习任务。
第一个辅助任务的设计初衷是消除热门商品的bias。在推荐场景中,曝光偏差会形成马太效应,热门视频更容易被曝光。5%的热门item占据了大部分曝光量以及一半的消费时长。同时,这导致长尾视频学习不充分。如果我们使用用户打分随机曝光item,那么由于侯选池所含item数量众多,曝光的item大概率不符合用户兴趣,从而影响用户体验。如果我们计算曝光概率,采用IPW进行去偏,由于IPW存在计算不准确、不稳定的问题,去偏效果并不能保证。所以,我们采用对比学习通过负样本采样与增广的方法来拟合样本的无偏分布,这种做法既轻量又高效。
我们采用user点击或者有正反馈的item作为正样本。由于我们希望避免正样本稀疏所带来的梯度淹没的问题,我们额外加入了正样本增广,这相当于增加了正样本在所有样本中的重要性比例。负样本采样选用了全局负采样+In-batch负采样相结合的方法,借鉴了MoCo的做法使用一个memory bank存储item的表征实现负样本的增广。全局的负采样更符合样本分布,但是它的时间复杂度较大,所以我们加入了In-batch负采样减少复杂度,以部分有偏的代价换取计算效率。
第二个辅助任务旨在挖掘用户兴趣差异。这一任务提出来源于用户行为序列建模存在的难点:
- 任务的信号单一,数据稀疏
- 大众兴趣的item协同信号较强
所以,这就导致单个用户的兴趣很容易被大众兴趣带偏。我们可以利用“不同用户的兴趣不同”的先验知识,使用自监督信号,从不同的角度去观察同一个用户(即数据增广),使其兴趣空间的表征是相似的。
具体地,我们使用sequence encoder得到用户序列的表征和用户经过增广后的序列表征,增广的方式一般采用mask、shuffle和sample。通过对比学习拉近同一个用户两个行为序列表征的距离,拉远不同用户的行为序列表征距离。
值得注意的是,在不同增广方式中,mask可以避免行为序列被局部信息主导;shuffle从时序性触发,对行为序列做随机打乱操作;sample考虑用户长期行为,使用不同的权重采样方法,在长期行为序列上随机采样。在快手的实践中,在排序阶段我们一般注重用户即时兴趣,所以会使用mask的方法进行数据增广;在召回阶段我们侧重于用户长期兴趣,所以使用sample的方法做增广。
第三个辅助任务旨在挖掘用户细粒度的兴趣反馈信号。在快手的推荐场景下,用户的正反馈种类很多,如点击、长播、喜欢、订阅、转发、下载、收藏等,而用户的负反馈仅仅只有显式的“hate”和隐式的短播。
总而言之,我们的推荐场景的负反馈稀疏,特征和信号都极不充分。由于正反馈样本数量相对较多,这就导致它们容易主导训练梯度;此外,正反馈信号很多情况下反应灵敏,但负反馈信号不敏感,并且由于即使是负反馈也是通过推荐系统挑选出来的,正负反馈的序列相似度比较大,不易区分。所以,我们构建了对比辅助任务,来捕捉单个用户的多种反馈子序列的差异性。
我们借鉴了CV领域对比学习的想法,文章作者提出将相邻视频帧的表征距离拉近,将间隔较大的两个视频帧的表征距离拉远。相似地,我们在序列层面考虑,将用户正反馈序列表征和用户正反馈增广序列的表征距离拉近,将用户正反馈序列表征和用户负反馈的序列表征距离拉远,增加正负反馈的区分度。由于显示的“hate”负反馈信号较为稀疏,我们采用负反馈序列增广的方法,将短播引入负反馈样本中,增加负反馈特征覆盖。
值得注意的是,由于短播噪声比较大,在负反馈序列增广的过程中,我们需要谨慎地设计策略来挑选合适的短播负反馈引入负样本中。
另外我们在辅助任务上使用了target-attention的方法来构建更细粒度的对比任务。学习的是在item的维度下,正负反馈的对比。粒度更细,同时增加了特征交叉,增强了模型能力。具体地,我们将target item的embedding作为query,用户的行为序列表征作为key和value,实现在考虑target item特征下用户行为序列表征的对比学习。
上述框架在排序实验中人均app时长提升了0.46%,hate率降低了8.92%。由于在快手推荐场景下,一次推全的平均效果提升通常为0.1%,那么引入对比学习辅助任务的确带来了很显著的效果提升。在召回实验中,人均app时长提升了0.2%。在离线实验中,由于我们的对比学习框架适用于任何base模型,我们选取SASRec作为基准模型,发现加入对比学习后在HR@20指标上提升了23%,HR@50指标上提升了16%,在NDCG@20指标上提升了28%。
04 总结&思考
总结来说,在使用对比学习做推荐排序时,我们加入了user-item辅助任务进行热门去偏、user-user辅助任务进行用户兴趣差异挖掘和正负反馈对比辅助任务来挖掘用户细粒度兴趣反馈信号。
综上所述, 我们创新性地设计了一种多粒度自监督训练框架 ,这是快手也是业界的首次提出和落地。此外,这一对比学习框架易于推广,可以运用在如推荐、内容生产、商业化等领域。该框架还具有易复用可插拔的优点,可以根据业务和模型特点进行改造,用于召回、排序等不同阶段。具体地,在召回阶段我们就不需要采用第三个辅助任务来挖掘用户细粒度兴趣,因为召回阶段更加关注正反馈信号。
在具体实践过程中,我们得出以下三点经验:
- 负例越多越好。
- 正例是非常重要的,所以我们需要注意正例在样本中的权重。具体地,可以对正例进行增广,防止在梯度更新时正样本的梯度被大量负样本淹没。
- 多种增广方法各有优势。比如,在排序阶段我们更倾向使用mask,而在召回阶段更多使用sample。
05 Q&A
Q:对比学习和pair-wise建模有什么区别?
A:Pair-wise旨在学习排序层面两个item的相对次序,而对比学习的目的是学习正负样本直接的表征相似度。
Q:短视频组合收益公式中各参数的具体含义是什么?
A:每一项表示一个item是否被收到一类正反馈。如果item得到了相应的正反馈信号那么就取1,反之则取0。公式中的参数a,b是超参数。
Q:行为序列少的用户会被采样到吗?
A:会。我们需要保证采样的序列符合样本的分布,从而尽可能保证分布的无偏性。
Q:模型的耗时是在什么数量级?
A:我们的排序模型使用在重排阶段,它的耗时较低,大约为40~50ms。值得注意的是,对比学习的辅助任务不参与inference,只在模型训练阶段使用。
Q:召回时使用对比学习框架后,有没有具体数据证明它对长尾item有效果提升?
A:我们做过相应的分析,发现在召回阶段对比学习对长尾item的效果提升十分明显。由于今天分享的主题是排序相关应用,所以没有展示召回阶段的结果分析。
Q:排序阶段的效果提升有没有可能是统计量随机误差导致的?
A:事实上,在相对效果提升层面不存在统计上的随机误差,因为在快手推荐场景下存在一个置信区间,一般为0.1%。而使用对比学习所带来的的增益已经超过了这一置信区间。
Q:组合收益公式为什么是加法而不是乘法?
A:因为在快手场景,点赞、评论、进入个人页等都是独立的,没有先点击再点赞的关系,所以我们采用的是加法,乘法一般用于这种有先后关系的场景。
Q:负采样和样本增广分别有什么作用?
A:样本增广的目的是让模型接受难度适中的输入来学习更好的向量表征。负采样需要考虑曝光偏差带来的影响,因为一般情况下我们任务曝光未点击的item为负样本,曝光且点击的样本为正样本,使用我们的负采样方法可以使用未曝光的样本。
Q:模型更新的粒度是什么样的?训练数据有多大?
A:模型是根据数据流实时更新的,训练数据的体量是公司内部资产,不方便详细透露。
Q:如何离线验证对比学习的效果以及debias的效果?
A:离线实验中我们与当前state-of-the-art的模型进行对比,即在同一基准模型的基础上加入对比学习框架后观察实验指标的提升程度。我们不仅使用了快手的数据集,还在学术界最新的推荐数据集上做了对比实验,最终都观察到了效果的提升。针对长尾item,我们将数据中的长尾商品单独抽取出来进行指标的计算与对比,最后也得到了更优的效果。
Q:第三个辅助任务中正反馈的类型很多,那么在具体训练时有没有用到所有类型的正反馈?不同类型的正反馈的权重是一样的吗?
A:不同类型的正反馈的权重不一样。我们目前采用的正反馈类型有关注、喜欢和转发。我们会对这三种反馈按权重做随机采样,构造正反馈队列。相对地,由于负反馈较为稀疏,“hate”反馈是被全部采用的,对于”hate”反馈过少的,采用短播序列补充。
Q:In-batch负采样需要流式纠偏吗?
A:需要进行纠偏。由于In-batch负采样对长尾item存在偏差,所以我们在负采样时是按照曝光频率进行采样的。此外,为了进一步接近无偏性,还加入了全局负采样。
Q:针对全局负采样和In-batch负采样有没有做过消融实验验证效果吗?
A:因为这一想法参考了youtube的文章中提出的方法,所以我们没有进行消融实验,而是认为使用这一方法可以得到增益。
分享嘉宾:
你好请问“对比学习在快手推荐排序的应用”有文章原文吗?
原文地址: https://zhuanlan.zhihu.com/p/520181137