多任务总结

多任务综述

 Wang Y, Lam H T, Wong Y, et al. Multi-Task Deep Recommender Systems: A Survey[J]. arXiv preprint arXiv:2302.03525, 2023.(推荐看第五小节:挑战与未来方向)

定义:

多任务学习(MTL)是在一个统一的模型中学习相关任务,以实现任务之间的相互改进,考虑到任务之间的共享知识。

优点:

一方面,通过跨多个任务利用数据和知识,MTDRS 可以实现任务之间的相互增强。另一方面,它具有更高的计算和存储效率。

挑战:

1.MTDRS 必须有效和高效地捕获有用的信息和任务之间的相关性。

解决问题1的部分文章:

Ding, Ke, et al. "MSSM: A Multiple-level Sparse Sharing Model for Efficient Multi-Task Learning." Proceedings of the 44th International ACM SIGIR Conference on Research and Development in Information Retrieval. 2021.

Li P, Li R, Da Q, et al. Improving multi-scenario learning to rank in e-commerce by exploiting task relationships in the label space[C]//Proceedings of the 29th ACM International Conference on Information & Knowledge Management. 2020: 2605-2612.

2.数据稀疏。

3.独特的顺序依赖,即建议中跨任务的用户操作的顺序模式,比如现有曝光点击再有收藏,点击和收藏所处的样本空间不一样。

解决问题3的部分文章:

Multi-Scale User Behavior Network for Entire Space Multi-Task Learning

Modeling the Sequential Dependence among Audience Multi-step Conversions with Multi-task Learning in Targeted Display Advertising(有源码)

多任务的主要缺点(迭代模型的方向):

  • 负迁移(Negative Transfer):针对相关性较差的任务,使用shared-bottom这种硬参数共享的机制会出现负迁移现象,不同任务之间存在冲突时,会导致模型无法有效进行参数的学习,不如对多个任务单独训练。
  • 跷跷板现象(Seesaw Phenomenon):针对相关性较为复杂的场景,通常不可避免出现跷跷板现象。多任务学习模式下,往往能够提升一部分任务的效果,但同时需要牺牲其他任务的效果。即使通过MMOE这种方式减轻负迁移现象,跷跷板问题仍然广泛存在。

负迁移就是两个任务都变差,跷跷板就是其中一个任务好,另外一个任务差,好的任务是牺牲差的任务得来的。

用到的数据:

全球速卖通搜索系统 Dataset_数据集-阿里云天池 (aliyun.com)

第一列在数据处理中会去掉。

MMoe论文大纲

在多任务学习中,我们的目标是建立一个能同时学习多个目标和任务的单一模型。然而,常用的多任务模型的预测质量往往对任务之间的关系敏感。因此,研究任务特定目标和任务间关系之间的建模折衷是非常重要的。

MMoE :  显式地学习从数据中建立任务关系模型。通过在所有任务之间共享专家子模型来调整混合专家(MoE)结构以适应多任务学习,它允许自动分配参数以捕获共享任务信息或任务特定信息,从而避免了为每个任务添加许多新参数的需要。同时还有一个门控网络来训练以优化每个任务。

门控的作用:将不同权重的专家组合在一起,允许不同的任务对专家进行不同的利用。

实际中:多任务学习模型并不总是在所有任务上都优于相应的单任务模型。事实上,许多基于 DNN 的多任务学习模型对诸如数据分布差异和任务之间的关系等因素很敏感。来自任务差异的固有冲突实际上会损害至少一些任务的预测,特别是当模型参数在所有任务之间广泛共享时。

实验结论:为了验证我们的方法在不同水平的任务相关性(皮尔逊相关系数)的数据,我们首先应用它到一个合成的数据集,我们控制任务相关性。结果表明,当任务相关性较小时,该方法的性能优于基线方法

1)对于所有模型,相关性较高的数据的性能都优于相关性较低的数据。

2) 在两个任务完全相同的极端情况下,MMoE 模型和 OMoE 模型之间的性能几乎没有差异; 然而,当任务之间的相关性降低时,OMoE 模型的性能明显下降,而 MMoE 模型的下降程度小。因此,在低相关情况下建立任务特定门来模拟任务差异是至关重要的。

3)就平均性能而言,两种 MoE 模型在所有场景中都优于共享底部模型。

在实验的数据集中,两个任务的相关性:

1)实验一:0.1768

2)实验二:0.2373

Ple论文大纲

论文:Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations

摘要:通过在 SOTA MTL 模型中的大量实验,我们观察到一个有趣的跷跷板现象,即一个任务的性能通常是通过损害其他任务的性能来提高的。为了解决这些问题,我们提出了一种新颖的共享结构设计的渐进分层抽取(PLE)模型。PLE 明确地将共享组件和任务特定组件分离开来,采用渐进式路由机制逐步提取和分离更深层次的语义知识,提高了联合表示学习和任务间信息路由的效率。我们将 PLE 应用于复杂相关和正常相关的任务,从双任务案例到现实世界中的腾讯视频推荐数据集中的多任务案例,该数据集包含10亿个样本。结果显示,在不同的任务相关性和任务组规模下,PLE 的表现明显优于最先进的 MTL 模型。

模型思想概括:

1.显式地将共享专家和任务特定专家分离开来,以避免有害的参数干扰。

2.引入多层次专家和门控网络来融合更抽象的表示。

3.采用一种新的渐进分离路由算法对专家之间的交互进行建模,实现复杂关联任务之间更有效的知识传递。

ple目的:解决跷跷板现象。

指出mmoe的缺点:MMOE 利用门限网络将基于输入的底层专家组合起来处理任务差异,但忽视了专家之间的分化和互动。

 一些细节

CGC(Customized Gate Control) 定制门控

PLE将共享的部分和每个任务特定的部分显式的分开,强化任务自身独立特性。把MMOE中提出的Expert分成两种,任务特定task-specific和任务共享task-shared。保证expert“各有所得”,更好的降低了弱相关性任务之间参数共享带来的问题。

网络结构如图所示,同样的特征输入分别送往三类不同的专家模型(任务A专家、任务B专家、任务共享专家),再通过门控机制加权聚合之后输入各自的Tower网络。门控网络,把原始数据和expert网络输出共同作为输入,通过单层全连接网络+softmax激活函数,得到分配给expert的加权权重,与attention机制类型。

MMOE是希望让expert网络可以对不同的任务各有所得,则PLE是保证让expert网络各有所得。

PLE就是上述CGC网络的多层纵向叠加,以获得更加丰富的表征能力。在分层的机制下,Gate设计成两种类型,使得不同类型Expert信息融合交互。task-share gate融合所有Expert信息,task-specific gate只融合specific expert和share expert。

 MMOE、PLE原论文中介绍的模型均是使用同样的原始特征输入各个不同的expert,也输入给第一层的gate。最顶层的Tower网络中则均是由一个gate融合所有expert输出作为输入。

输入:

输入是将分类特征通过embedding转换为嵌入向量,将数值型特征通过linear(全连接层)转化为指定维度向量,之后将两个处理过的向量concat作为input输入。

ple门控:

share_gates[i]=torch.nn.Sequential(torch.nn.Linear(input_dim, shared_expert_num + task_num * specific_expert_num), torch.nn.Softmax(dim=1))

 每个专家都会有一个门控出来的标量,针对不同任务和共享层的分数都是不一样的。

ple共享门控:如果ple只有一层,则不需要输出共享门控。

任务门控:

尺寸:torch.Size([2048, 1, 8])

如果ple是多层的,比如两层,则每层的专家的架构相同,里面的隐藏单元数(512)相同。

    mix_ouput=torch.cat(task_output+share_output,dim=1)#torch.Size([2048, 8, 512])
    gate_value = task_gates[i][j](task_fea[j]).unsqueeze(1)    #torch.Size([2048, 1, 8])
    task_fea[j] = torch.bmm(gate_value, mix_ouput).squeeze(1)  #2  * torch.Size([2048, 512])

最终通过门控的输出: 

  1. torch.bmm(gate_value, mix_ouput):这是一个批量矩阵乘法(batch matrix multiplication)操作。gate_value 是门控值的概率分布,它的形状通常是 (batch_size, num_experts),其中 batch_size 表示批次大小,num_experts 表示专家的数量。mix_ouput 是不同专家的输出(通常是特征表示),它的形状通常是 (batch_size, num_experts, feature_dim),其中 feature_dim 表示特征维度。

  2. torch.bmm 操作将 gate_valuemix_ouput 进行批量矩阵乘法,对每个样本进行加权求和,得到了每个样本的任务特征。

mmoe门控:

self.gate = torch.nn.ModuleList([torch.nn.Sequential(torch.nn.Linear(self.embed_output_dim, expert_num), torch.nn.Softmax(dim=1)) for i in range(task_num)])

 专家个数,每组专家获得相同的值。

mmoe架构图

每个expert0都有八个小专家,每个小专家的架构:

一共两个塔,其中一个的架构:

一共两个门,门的架构:

总体代码:

#mmoe     ----froward
categorical_x = categorical_fields
numerical_x = numerical_fields
categorical_emb = embedding(categorical_x)  #torch.Size([2048, 16, 128])
numerical_emb = numerical_layer(numerical_x).unsqueeze(1)  #torch.Size([2048, 1, 128])
emb = torch.cat([categorical_emb, numerical_emb], 1).view(-1, embed_output_dim)   #torch.Size([2048, 2176])  作为输入
gate_value = [gate[i](emb).unsqueeze(1) for i in range(task_num)]         #2  * torch.Size([2048, 1, 8])   门的值
fea = torch.cat([expert[i](emb).unsqueeze(1) for i in range(expert_num)], dim = 1)  #torch.Size([2048, 8, 256])   #输入通过专家之后的值
task_fea = [torch.bmm(gate_value[i], fea).squeeze(1) for i in range(task_num)]    #torch.Size([2048, 256])   #门控结果和专家之后做

results = [torch.sigmoid(tower[i](task_fea[i]).squeeze(1)) for i in range(task_num)]  #2*torch.Size([2048])

在实验对比中:保证mmoe和ple专家数量对齐:

mmoe任务专家都是8个小专家,共享专家也是8个。门控输出也是8

ple共享专家是4个,每个任务都是独立的4个小专家。任务对应的门控输出是8,若两层CGC,则共享层的门控输出是12。

其他模型

 Ding, Ke, et al. "MSSM: A Multiple-level Sparse Sharing Model for Efficient Multi-Task Learning." Proceedings of the 44th International ACM SIGIR Conference on Research and Development in Information Retrieval. 2021.

在很多MTL甚至是SOTA模型里,往往将所有的输入feature都输入给所有的task,本文注意到可能有一些feature本身对某些task是无助甚至有害的,因此从特征输入层面就做一层筛选。

Jiaqi Ma, Zhe Zhao, Jilin Chen, Ang Li, Lichan Hong, and Ed H Chi. 2019. Snr: Sub-network routing for flexible parameter sharing in multi-task learning. In Proceedings of the AAAI Conference on Artificial Intelligence, Vol. 33. 216–223.

在很多工业落地时候,多任务和多场景都可以尝试:

多场景定义:

多场景也有论文叫做多域,一般所说的多场景指的是业务场景。那为什么要研究多场景呢?基于一个假设:在不同场景下,用户的爱好/行为规律有一定差异,但一定程度上也是相似的。为了学习这个差异,若给每个场景单独设计一个模型,会带来极大的成本,并且小场景也难以训好;为了学习这个相似,若直接混合所有场景训练一个模型,会导致小场景完全被大场景覆盖。因此,多场景的目的就是:求同存异

有几个比较接近的概念:多场景、多任务、跨域。这几个方向都涉及到一些共性与特性的研究,因此它们存在通用的模型结构,比如mmoe。细节上有一些区别:多场景多是强调样本来自多个场景,任务默认是同一个任务。多任务一般是样本来自一个场景。而跨域更倾向给每个域安排一个模型,在公共user和item上互通emb。基于现在推荐常用的emb+mlp框架,特征提取层+预测层,多场景更偏向前面的特征提取层,多任务更偏向后面的预测层。

以下是多场景的论文(均有源码):

emcdr :Cross-Domain Recommendation: An Embedding and Mapping Approach

ptupcdr:Personalized Transfer of User Preferences for Cross-domain Recommendation(有源码)

tmcdr :Transfer-Meta Framework for Cross-domain Recommendation to Cold-Start Users

调参经验:

1.Seed在小数据集上有着重要作用,用于参数初始化,可以选取合适的seed;大数据集上偏稳定,所以作用不大,但也可固定seed,看模型效果。

2.确定epoch,是根据损失函数的值,画出损失函数曲线图进行人工确认或者运用早停法。进而再确定auc。

3.batch_size在大数据集上尝试1024,2048等,都可以尝试。看看loss的下降情况,再选用效果更好的值。

batch_size太小,收敛得慢,导致网络收敛不稳定,可能准确率来回震荡,因此需要把基础学习速率降低一些。

Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。但可能模型的泛化能力会下降,每个batch更接近当前的训练数据集,而不是测试数据集。

4.学习率。适配batch_size,一般10-3,10-4。如果增加了学习率,那么batch size最好也跟着增加,这样收敛更稳定。
 

提升性能,但不能解决多任务的缺点(已知抽取更多的信息是可以提升模型性能):

1.将input的向量变为二维,而后运用CNN替换mlp,抽取更多的信息;

2.input 在进行embedding时,将维度增加,进而保留更多的信息;

3.5.在多任务中,一般来说中间专家层层数越多,或者数量越多,所得精度越高。;

4.塔的mlp也可以修改;

5.能用ple就别用mmoe;

开源的多任务代码:

Multitask-Recommendation-Library/models at main · easezyc/Multitask-Recommendation-Library (github.com)

yuangh-x/2022-NIPS-Tenrec (github.com)

shenweichen (浅梦) (github.com)

部分参考资料:

工业界多场景方案汇总 - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值