一文汇总:推荐系统中多任务学习的优化思路
多任务学习是推荐系统中非常常见的一个问题。推荐系统中,经常要对多个目标进行预测,比如点击率、转化率、观看时长等等。将这些任务联合学习,希望通过不同的监督信息,互相增强各自目标的拟合能力。但是同时,不同目标之间又不一定是正向关系,可能存在负向迁移问题,存在跷跷板现象。因此,如何最好的发挥多任务学习的作用,达到各个任务联合最优,一直是一个推荐系统领域的核心研究问题。
这篇文章就给大家汇总一下,推荐系统中常见的多任务学习解决思路。整体可以分为参数共享/私有方式、梯度平衡、表征学习优化等几个方面。
1.参数共享/私有方式
不同任务之间如何进行参数的共享,哪些参数又该作为该任务的私有参数,这个方面一直是多任务学习中的一个核心研究点。最早的文章由谷歌等机构发表在KDD2018 Modeling task relationships in multi-task learning with multi-gate mixture-of-experts,这篇文章提出了一种基于门控的多专家网络(MMoE),解决多任务学习问题。在底层网络中,有多个并行的NN网络,每个NN网络就是一个expert。每个任务的预测使用这些expert的加权求和得到,权重由一个门控网络根据输入样本生成。通过这种方式,各个expert是参数共享的,能够最大限度共享各个任务的信息,同时通过gate针对不同任务侧重各自的expert,实现一定程度的参数隔离,缓解各个任务之间的负向影响。
SNR: Sub-Network Routing for Flexible Parameter Sharing in Multi-Task Learning(AAAI 2019)是谷歌提出的另一篇多任务学习网络结构。SNR相比MMoE更加灵活,主要体现在把各个Expert拆成了更细的粒度,把每个专家拆成多层,每层之间都能进行路由,使得NN网络的任务间共享私有机制更加灵活。
Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations(RecSys 2020)是腾讯在2020提出的一种多专家网络结构。之前的多专家网络所有Expert都是各个任务共享的,只靠Gate控制各个任务对于各个expert的使用程度,仍然比较容易出现跷跷板现象。为了缓解这个问题,PLE提出了在网络中加入组个每个任务独立,不和其他任务共享的参数。通过这种方式,让每个任务有自己独立的参数空间,大幅缓解了多任务学习中的跷跷板现象。
2.梯度平衡
由于不同任务的数据分布不同,各个任务在反向传播时的梯度也不同。这就可能出现,某些任务的梯度非常大,把学习过程主导了,导致其他任务学习不好的情况。为了解决这类问题,一些工作专门研究如何设计更好的优化器,平衡各个任务之间的梯度。
MetaBalance: Improving Multi-Task Recommendations via Adapting Gradient Magnitudes of Auxiliary Tasks(WWW 2022)提出了一种梯度平衡的方法。本文面临的问题是,引入辅助任务提升主任务,但是辅助任务梯度过大导致主导了训练,反而影响了主任务效果的问题。为了解决这个问题,文中采用范数来约束辅助任务的梯度,让辅助任务梯度的范数和主任务尽可能一致。范数的计算采用滑动平均的方法,计算历史累积范数的滑动平均值,防止单次范数计算波动较大。通过,直接约束范数的结果可能并不是最优的梯度更新方式,因此文中还引入了一个系数,融合范数约束前后的梯度。
AdaTask: A Task-Aware Adaptive Learning Rate Approach to Multi-Task Learning(AAAI 2023)提出了在Adam、Adagrad等优化器中,引入考虑多任务之间梯度大小的信息,让这些优化器在多任务学习的优化中平衡不同任务的梯度大小。整体的实现思路为,原来大Adagrad等方法会根据历史梯度信息调整每个参数的学习率。本文的AdaTask在此基础上,增加了一个任务维度,也就是每个任务、每个参数,根据历史梯度信息调整下一步的学习率。
3.表征学习优化
多任务联合学习的一个核心目的,就是为了让利用多个任务的目标,共同更新底层表征,提升底层表征的表达能力,进而提升各个任务的效果。在谷歌的文章Can Small Heads Help? Understanding and Improving Multi-Task Generalization(WWW2022)中,提出了一个多任务表征学习的矛盾点。一般多任务学习都由共享参数和私有参数两部分组成,如果私有参数量太小,就会导致存在负向迁移的各个任务之间效果互相影响,降低整体多任务学习的效果。如果私有参数量太大,模型的自由度很高,底层表征就无法学到兼容各个任务的信息了。
为了解决这个问题,本文提出了在每个任务的原始输出head基础上,增加一个小的输出head,这个小的输出head也拟合对应的任务,作为辅助塔。其目的是缩小私有head参数的参数量,以此实现让底层表征必须抽取出多任务共享的信息,进而提升多任务底层表征的泛化能力。