推荐-精排-多任务模型

本文探讨了多任务建模中的关键问题,如任务差异、样本损失加权、共享底层数结构以及其他复杂网络结构如MMOE。强调了信息选择的重要性,并介绍了如何处理任务之间的负迁移和跷跷板现象。同时,提到了特征选择和多任务模型在服务中的应用,如CTR和时长预测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高阶交叉特征

GBDT+LR模型

Factorization Machines(FM)

Field-aware Factorization Machines(FFM)

wide&deep

Deep & Cross Network(DCN)

xDeepFM模型

FNN模型(FM+MLP=FNN)

PNN模型(Product-based Neural Networks)

DeepFM模型

CAN

attention

DIN KDD’18

阿里妈妈盖坤团队发表在KDD’18上的文章
参考链接:https://blog.csdn.net/u012328159/article/details/123043033

transform

多任务

多任务建模中需要注意的问题

1、如果子任务差异很大,往往导致多任务模型效果不佳。
2、不同任务的loss大小不一样,需要调整loss的权重。

shared-bottom

优点:这种结构本质上可以减少过拟合的风险。浅层参数共享,互相补充学习,任务相关性越高,模型的loss可以降低到更低。
缺点:但是效果上可能受到任务差异和数据分布带来的影响。如果任务没有好的相关性时,这种Hard parameter sharing会损害效果。

其他结构

1、shared-bottom
2、两个任务的参数不共用,但是通过对不同任务的参数增加L2范数的限制;
3、对每个任务分别学习一套隐层然后学习所有隐层的组合。
和shared-bottom结构相比,这些模型对增加了针对任务的特定参数,在任务差异会影响公共参数的情况下对最终效果有提升。
缺点就是模型增加了参数量所以需要更大的数据量来训练模型,而且模型更复杂并不利于在真实生产环境中实际部署使用。

样本Loss加权

保证一个主目标的同时,将其它目标转化为样本权重,改变数据分布,达到优化其它目标的效果。
优点
模型简单,仅在训练时通过梯度乘以样本权重实现对其它目标的加权。
模型上线简单,和base完全相同,不需要额外开销。
在主目标没有明显下降时,其它目标提升较大。
缺点
本质上并不是多目标建模,而是将不同的目标转化为同一个目标。样本的加权权重需要根据AB测试才能确定。

ESMM

ESMM(Entire Space Multi-Task Model)
阿里。shared-bottom结构。任务之间有先后关系。cvr任务在训练时只能利用点击后的样本,而预测时,是在整个样本空间,这样导致训练和预测样本分布不一致,即样本选择性偏差。同时点击样本只占整个样本空间的很小比例,比如在新闻推荐中,点击率通常只有不到10%,即样本稀疏性问题。

AITM

MMOE(MOE)

MMOE(Multi-gate Mixture-of-Experts)
MOE(One-ga te Mixture-of-Experts)
在这里插入图片描述

google,KDD2018 Research Track。
优点:不同任务对应的门控网络可以学习到不同的Experts 组合模式,因此模型更容易捕捉到子任务间的相关性和差异性。
缺点:存在跷跷板现象。为什么会存在跷跷板现象?任务被某些任务主导。为什么会被某些任务主导?任务之间的loss不同。
1、MMOE中所有的Expert是被所有任务所共享的,这可能无法捕捉到任务之间更复杂的关系(虽然理论上限是ple),从而给部分任务带来一定的噪声。
2、不同的Expert之间没有交互,联合优化的效果有所折扣。(极端情况,a任务更新expert1,a任务更新expert2、3)

每个experts都相同的特征和网络结构的情况下,为什么会对每个task的贡献度不一样?
1、初始化的时候每个网络的初始状态是随机的,都不相同。如果数据确实存在多个专家的模式,那么在训练学习过程中就会倾向于每个expert去学成那种模式。2、对每个task的贡献度是gate 决定的,所有任务共享experts,但是每个任务都有单独的gate。3、学习的label也不一样。
2、OMOE所有task共用一个gate,有什么用呢?不同task(i)的差异还是要通过最后的tower(i)去学吗?
3、任务相关性:经验称,如果任务相关度非常高,则OMoE和MMoE的效果近似,但是如果任务相关度很低,则OMoE的效果相对于MMoE明显下降。那么在拿到一个多任务模型训练之前,如何判定目标之间的相关程度呢。
1、根据经验,比如点击和观看相关,点击和点赞不相关?2、用皮尔森系数进行判断。

十字绣网络

Cross-stitch Networks for Multi-task Learning

闸式网络

sluice network

ple(cgc)

Customized Gate Control (CGC) Model
2020腾讯。主要解决的问题:解决负迁移,跷跷板现象。
优点:考虑了不同Expert之前的交互。
缺点:

star

任务之间做隔离

信息选择

包括特征选择,高层特征选择、隐层选择。
为什么要信息选择?针对同一个样本不同的任务起决定性的特征也不一样。不同任务在提取特征时不能一视同仁。

cea

多任务的使用

1、serving时需要一个打分公式:比如CTR * log(时长) 或者w1 * CTR + w2 * log(时长),或者一个LTR的模型,优点是可以手工调权在不同的业务期实现不同的目标。
2、做时长跟点击率的多目标模型,loss相差的量级?
label变换:时长的label最好先去log,log后目标更符合正态分布,同时loss量级也更小和稳定。loss调权:多个目标的loss,简单点就是把loss加权重调到同一量级,一般就比较work了。loss量级一致不代表梯度量级一致,还是可能出现某个task梯度主导训练的问题,这个可以看一看多目标优化的一些文章,基于梯度动态调整loss权重 和帕累拖的一些方法。

### 使用 OR-Tools 实现生产调度与订单拆分优化 为了实现生产调度与订单拆分优化,可以利用 Google 的 OR-Tools 库来构建模型并求解。具体来说,通过定义机器、作业以及时间窗口等约束条件,能够有效地解决复杂的程问题。 #### 定义数据结构和输入参数 首先需要准备一些基本的数据结构用于表示不同类型的实体及其属性: ```python from ortools.sat.python import cp_model def create_data_model(): """创建数据模型.""" data = {} # 假设有三个机器和六个任务 machines_count = 3 jobs = [ [(0, 5), (1, 2)], # Job 0 has two tasks. [(0, 13), (2, 5)], # Job 1 has two tasks. [(0, 4), (1, 7)] # Job 2 has two tasks. ] all_machines = range(machines_count) all_jobs = range(len(jobs)) data['machines'] = [[task[0] for task in job] for job in jobs] data['durations'] = [[task[1] for task in job] for job in jobs] data['all_machines'] = all_machines data['all_jobs'] = all_jobs return data ``` 这段代码初始化了一个简单的例子,其中包含了多个工作(job),每个工作由一系列的任务组成,而这些任务将在不同的机床上执行[^1]。 #### 构建模型 接下来就是基于上述数据建立实际的数学规划模型了。这里采用的是CP-SAT Solver来进行求解: ```python model = cp_model.CpModel() data = create_data_model() horizon = sum([sum(job) for job in data['durations']]) intervals_per_resources = [[] for _ in data['all_machines']] starts = {} # start time of each operation ends = {} # end time of each operation for i in data['all_jobs']: for j in range(len(data['machines'][i])): machine_for_task = data['machines'][i][j] duration_for_task = data['durations'][i][j] suffix_for_names = f'job_{i}_task_{j}' start_var = model.NewIntVar(0, horizon, 'start_%s' % suffix_for_names) end_var = model.NewIntVar(0, horizon, 'end_%s' % suffix_for_names) starts[(i, j)] = start_var ends[(i, j)] = end_var intervals_per_resources[machine_for_task].append( start_var.IntervalVar(start=start_var, size=duration_for_task, end=end_var, is_present=True, name=suffix_for_names)) # 创建不相交约束以确保同一时刻只有一个操作占用某台机床 disjunctive_constraints = [] for m in data['all_machines']: disjunctive_constraints.append(model.AddNoOverlap(intervals_per_resources[m])) # 添加目标函数最小化最大完成时间(Cmax) obj_var = model.NewIntVar(0, horizon, 'makespan') for i in data['all_jobs']: last_end_time = max([ends[i, t] for t in range(len(data['machines'][i]))]) model.Add(obj_var >= last_end_time) model.Minimize(obj_var) ``` 此部分实现了对各个任务之间关系的描述,并设置了使整个流程尽可能短的目标——即所谓的“最小化最大完工时间”[^4]。 #### 解决方案解析 最后一步是从求得的结果中提取有用的信息: ```python solver = cp_model.CpSolver() status = solver.Solve(model) if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE: print('Solution:') for i in data['all_jobs']: for j in range(len(data['machines'][i])): print(f'Job {i}, Task {j}: Start at {solver.Value(starts[(i,j)])}') else: print('No solution found.') ``` 以上展示了如何使用 OR-Tools 来处理生产调度中的典型场景之一:多工序单件流车间作业计划问题。对于更复杂的情况比如考虑库存水平变化的影响或是允许提前期的存在,则可能还需要引入额外的状态变量或修改现有的约束条件[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值