技术实现 | 多目标优化及应用

156 篇文章 31 订阅
订阅专栏
77 篇文章 7 订阅
订阅专栏

转载

作者:韩信子@ ShowMeAI
专栏: 推荐与广告计算 http://www.showmeai.tech/tutorials/50
地址: ShowMeAI知识社区
 


一图读懂全文

 推荐,搜索,计算广告是互联网公司最普及最容易商业变现的方向,也是算法发挥作用最大的一些方向,前沿算法的突破和应用可以极大程度驱动业务增长,这个系列咱们就聊聊这些业务方向的技术和企业实践。本期主题为多目标学习优化落地(附『实现代码』和『微信数据集』)

一、多目标优化介绍

1.1 什么是多目标优化场景

多目标排序是推荐排序系统中常见的技术实现,在很多推荐与排序常见中,有多个业务目标,找到一种综合排序方法使得多个目标都达到整体最优,能有最好的总体收益。

1.2 为什么需要多目标优化

为什么需要多目标排序呢,在实际互联网的推荐系统产品中,大多数用户反馈都不是直接评分,而是各式各样的隐式反馈,比如说用户的点击、收藏、分享、观看时长、下单购买等。 在评估用户满意度与设定优化目标时,可能有一些偏差:

偏差 | 评价用户满意度 VS 设定优化目标; 1-2

  • 全局偏差/Global bias:不同目标表达不同的偏好程度
    • 电商场景中,购买行为表达的偏好高于点击浏览和收藏
    • 新闻场景中,浏览时长超过20s这个行为表达的偏好高于点击
    • 短视频场景,完播行为表达的偏好高于点击
  • 物品偏差/Item bias:单个目标衡量不全面
    • 信息流产品中,标题党增加点击率,但降低满意度
    • 短视频场景中,悬念设计提升完播率,但需要观看下一个引发用户更多操作的不满
    • 自媒体资讯产品,鼓励转发率,可能会提升『转发保平安』等恶性操作
  • 用户偏差/User bias:⽤户表达满意度的⽅式不同
    • 信息流产品中,用户有 深度阅读、点赞、收藏 等不同表达满意的方式
    • 短视频场景中,用户有 点赞、收藏、转发 等不同表达满意的方式

下图为部分互联网产品下,用户包含信息反馈的行为路径。

互联网产品用户信息反馈的行为路径; 1-3

在上述众多互联网业务中,工程师优化和提升的目标可能是多个,比如,短视频推荐任务,既要点击率又要完播率;电商排序,既要点击率又要转化率。

多个优化和提升的目标; 1-4

1.3 多目标优化的难点

多目标优化的主要技术实现是在推荐系统的『排序』环节完成,如下所示的信息流推荐中,排序环节影响最终展示结果,进而对目标效果影响最为直接。

多目标优化的难点; 1-5

排序环节多使用CTR预估(click through rate prediction)技术来完成,业界有非常成熟的机器学习与深度学习技术方法与方案。但是,应用在多目标学习优化中,有五大难点:

CTR预估应用于多目标学习的五大难点; 1-6

① 部分目标数据稀疏,模型准确率低。 比如在电商产品中,用户下单行为显著稀疏于点击行为,下单的标签正样本数量和比例都偏小
② 在线服务计算量⼤。 通常多目标优化的模型有着更为复杂的模型结构,在线预估时,计算复杂度也更高;实时推荐任务需要有短响应时间和高并发支撑的稳定性,技术复杂度高一些。
③ 多个目标间重要性难以量化。 在追求点击率又追求完播率的短视频中,这两个target如何量化权衡重要度?
④ 分数融合的超参难以学习。 很多建模方案中,我们会量化得到不同的目标score,但最终融合时,涉及到的融合计算超参数不容易通过业务直接敲定,也没有合适的方法让模型学习
⑤ Label较为模糊。 很多业务中,连标签本身也是模糊的,比如资讯类产品中的阅读时长多长算长?

1.4 多目标vs多任务

实际技术解决方案中,有几个非常相似的概念,分别是 多任务、多目标、多类别,他们的定义和关联如下图所示:

多目标 VS 多任务; 1-7

在我们这里提到的推荐多目标优化中,其实不同的目标也对应不同的 task。 比如电商场景下,在推荐的排序阶段进行CTR建模,对同一输入样本同时预估点击率、转化率多个目标,在这个场景下,我们认为多目标多任务优化可以采用同一套方法。

二、多目标学习与共享参数

多任务多目标学习的实现,我们现在多采用『共享』机制完成,可以在不同任务的模型参数特征共享两方面做设计。

多任务多目标学习的共享参数; 1-8

  • 模型架构方面:在深度学习网络中可以共享embedding特征,或者共享中间层的某些隐藏单元,也可以是模型某一层或者最后一层的结果,并且共享之外的部分各自独立。在模型的设计中,层间关系自由组合搭配。
  • 特征组合方面:多个任务可以采用不同的特征组合,有的特征只属于模型架构的某个部分,有些特征整个模型都可以使用。

2.1 典型的一些参数共享机制

典型的参数共享机制; 1-9

① 参数的硬共享机制 (基于参数的共享,Parameter Based)

基于参数的共享是多目标学习最常用的方法。在深度学习的网络中,通过共享特征和特征的embedding以及隐藏层的网络架构,在最后一层通过全连接+softmax的方式来区分不同任务,最后做一个线性融合来实现多目标排序。

② 参数的软共享机制 (基于约束的共享,Regularization Based)

参数的软共享机制,每个任务都有自己的参数和模型结构,可以选择哪些共享哪些不共享。最后通过正则化的方式,来拉近模型参数之间的距离,例如使用 L2 进行正则化。

2.2 多目标优化的4种结果

实际多目标优化,在采用共享机制设计的各种模型结构后,可能有『Well Done』、『还不错』、『不理想』、『无法接受』 这 4 种不同的结果:

多目标共同学习的4种结果; 1-10

  • Well Done』:最好的状态,所有share任务实现共同提升。
  • 还不错』:其次的状态,所有任务不降低,至少一个任务提升。如果是 主任务 + 辅助任务 的搭配,能够实现牺牲辅助任务达到主任务提升的效果,也是 well done。
  • 不理想』:跷跷板现象,任务有涨有跌。
  • 无法接受』:负迁移现象,所有任务都不如从前。

三、多目标学习两大优化方向

为了能够更好地『共享参数』,让同个模型中多个任务和谐共存、相辅相成、相得益彰,研究界有两大优化方向,分别是:

① 网络结构优化,设计更好的参数共享位置与方式

② 优化策略提升,设计更好的优化策略以提升优化 Loss 过程中的多任务平衡

两大优化方向; 1-11

优化方向1:网络结构设计。网络结构设计方向思考哪些参数共享,在什么位置,如何共享等。

优化方向2:优化方法与策略。多目标优化策略从loss与梯度的视角去思考任务与任务之间的关系。平衡loss体量(Magnitude),调节loss更新速度(velocity),优化Gradient更新方向(direction)。在微观层面缓解梯度冲突,参数撕扯,在宏观层面达到多任务的平衡优化。

四、优化方向1:网络结构优化

4.1 总体思想与演进思路

网络结构设计是目前多任务研究和应用的主要焦点,它主要思考哪些参数共享,在什么位置,如何共享。优秀合理的共享网络结构对于最终效果提升作用巨大。

近年来网络结构设计经历了 Share Bottom --> MMoE  PLE 的典型结构变迁,重要的业界顶尖企业研究人员发表的多任务网络结构设计论文包括:

  • Share Bottom:早期一直在使用的方式,参数共享(hard或者soft)的方式来对多任务建模。
  • 2018 Google MMOE:将hard的参数共享变成多个 expert,通过门控来控制不同loss对每个expert的影响。
  • 2019 Google SNR:借助简单的 NAS(Neural Architecture Search),对 Sub-Network 进行组合,为不同目标学习各自的网络结构。
  • 2020 腾讯 PLE:在 MMOE 的基础上增加了各任务独有的 Expert。

网络结构优化 Architectures; 1-12

下图中对早期的Share Bottom,MMoE,PLE三种典型网络结构及对应的动机和公式做了总结。

  • Shared Bottom-->  MMoE:MMoE将shared bottom分解成多个Expert,然后通过门控网络自动控制不同任务对这些Expert的梯度贡献。
  • MMoE --> PLE:PLE在MMoE的基础上又为每个任务增加了自有的Expert,仅由本任务对其梯度更新。

Share Bottom,MMoE,PLE; 1-13

三种典型网络结构的公式; 1-14

4.2 核心论文与典型网络结构

我们来具体看一下论文中典型的网络结构:

1)MMoE:Google KDD 2018,现CTR建模多任务学习标配 [1]

Google《Modeling task relationships in multi-task learning with multi-gate mixture-of-experts》提出的 MMoE 几乎成为各家互联网公司做多任务多目标学习排序的标配结构。 在 Google 这篇 paper 中,研究人员通过人工控制两个任务的相似度,测试和研究不同网络结构的表现效果。

MMoE 结构设计中的 Multi-gate 对于任务差异带来的冲突有一定的缓解作用,即使在多任务之间的的相关性不高的情况下,也有不错的效果。 MMoE 中不同的 expert 负责学习不同的信息内容,然后通过 gate 来组合这些信息,通过不同任务 gate 的 softmax 的热力分布差异,来表明expert对不同的目标各司其责,从而提升了效果。

Modeling task relationships in multi-task learning with multi-gate mixture-of-experts; 1-15

论文中大规模推荐系统数据集实验结果如下,MMoE 相对于 share bottom 的方式,各指标都有明显的提升:

Modeling task relationships in multi-task learning with multi-gate mixture-of-experts; 1-16

MMoE核心代码参考

class MMoE_Layer(tf.keras.layers.Layer):
def __init__(self,expert_dim,n_expert,n_task):
super(MMoE_Layer, self).__init__()
self.n_task = n_task
self.expert_layer = [Dense(expert_dim,activation = 'relu') for i in range(n_expert)]
self.gate_layers = [Dense(n_expert,activation = 'softmax') for i in range(n_task)]

def call(self,x):
# 构建多个专家网络
E_net = [expert(x) for expert in self.expert_layer]
E_net = Concatenate(axis = 1)([e[:,tf.newaxis,:] for e in E_net]) # 维度 (bs,n_expert,n_dims)
# 构建多个门网络
gate_net = [gate(x) for gate in self.gate_layers] # 维度 n_task个(bs,n_expert)

# towers计算:对应的门网络乘上所有的专家网络
towers = []
for i in range(self.n_task):
g = tf.expand_dims(gate_net[i],axis = -1) # 维度(bs,n_expert,1)
_tower = tf.matmul(E_net, g,transpose_a=True)
towers.append(Flatten()(_tower)) # 维度(bs,expert_dim)

return towers

2)SNR:Google AAAI 2019,对MMoE的改进工作 [2]

Google这篇《SNR: Sub-Network Routing forFlexible Parameter Sharing in Multi-Task Learning》paper 的思路与网络自动搜索(NAS)接近,通过动态学习产出多任务各自采用的 sub-network。研究思路是希望在更相似的任务下能学习到共享多一些的结构。

SNR: Sub-Network Routing for Flexible Parameter Sharing in Multi-Task Learning; 1-17

3)PLE :腾讯 RecSys 2020, 改进MMoE,结构简单效果好 [3]

腾讯这篇《Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendations》paper 提出 PLE,主要是在 MMoE 的基础上,为每个任务增加了自己的 specific expert,仅由本任务对其梯度更新。

如下图所示,在 Share Bottom 的结构上,整个共享参数矩阵如同质量较大的物体,在梯度更新的环节,两个 Loss 反向计算的梯度向量分别是  和 ,是这个物体受到的两个不同方向不同大小的力,这两个力同时来挪动这个物体的位置,如果在多次更新中两个力大概率方向一致,那么就能轻松达到和谐共存、相辅相成。反之,多个力可能出现彼此消耗、相互抵消,那么任务效果就会大打折扣。

Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendations; 1-18

MMoE 通过『化整为零』,把一个共享参数矩阵化成多个结合 gate 的共享 Expert,这样不同的loss在存在相互冲突的时候,在不同的 expert 上,不同 Loss 可以有相对强弱的表达,那么出现相互抵消的情况就可能减少,呈现出部分 experts 受某 task 影响较大,部分 experts 受其他task主导,形成『各有所得』的状态。而PLE增加了spcific experts,能进一步保障『各有所得』,保证稳定优化。

PLE :化整为零,各有所得; 1-19

最终的paper实验结果如下

Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendations; 1-20

阿里的业务下,对 CTR、CVR、R3 这3个指标进行多目标优化,对于 single task 的相对提升结果如下表。其中 Share-Bottom 出现了翘翘板现象,而 PLE 实现了多目标共赢的结果。

阿里业务实践 | CTR、CVR、R3多目标优化; 1-21

PLE核心代码参考

class PleLayer(tf.keras.layers.Layer):
'''
@param n_experts: list,每个任务使用几个expert。[3,4]第一个任务使用3个expert,第二个任务使用4个expert。
@param n_expert_share: int,共享的部分设置的expert个数。
@param expert_dim: int,每个专家网络输出的向量维度。
@param n_task: int,任务个数。
'''
def __init__(self,n_task,n_experts,expert_dim,n_expert_share,dnn_reg_l2 = 1e-5):
super(PleLayer, self).__init__()
self.n_task = n_task

# 定义多个任务特定网络和1个共享网络
self.E_layer = []
for i in range(n_task):
sub_exp = [Dense(expert_dim,activation = 'relu') for j in range(n_experts[i])]
self.E_layer.append(sub_exp)

self.share_layer = [Dense(expert_dim,activation = 'relu') for j in range(n_expert_share)]
# 定义门控网络
self.gate_layers = [Dense(n_expert_share+n_experts[i],kernel_regularizer=regularizers.l2(dnn_reg_l2),
activation = 'softmax') for i in range(n_task)]

def call(self,x):
# 特定网络和共享网络
E_net = [[expert(x) for expert in sub_expert] for sub_expert in self.E_layer]
share_net = [expert(x) for expert in self.share_layer]

# 【门权重】和【指定任务及共享任务输出】的乘法计算
towers = []
for i in range(self.n_task):
g = self.gate_layers[i](x)
g = tf.expand_dims(g,axis = -1) #维度 (bs,n_expert_share+n_experts[i],1)
_e = share_net+E_net[i]
_e = Concatenate(axis = 1)([expert[:,tf.newaxis,:] for expert in _e]) #维度 (bs,n_expert_share+n_experts[i],expert_dim)
_tower = tf.matmul(_e, g,transpose_a=True)
towers.append(Flatten()(_tower)) #维度 (bs,expert_dim)
return towers

五、优化方向2:优化方法与策略

5.1 总体思想与演进思路

优化方法更多的考虑的是在已有结构下,更好地结合任务进行训练和参数优化,它从 Loss 与梯度的维度去思考不同任务之间的关系。在优化过程中缓解梯度冲突,参数撕扯,尽量达到多任务的平衡优化。

优化方法与策略 Optimization Strategy; 1-22

目前各式各样的多任务多目标优化方法策略,主要集中在3个问题:

优化方法与策略 3个问题; 1-23

1)Magnitude(Loss量级)

Loss 值有大有小,取值大的 Loss 可能会主导,如图所示,需要处理这个问题。典型的例子是二分类任务 + 回归任务的多目标优化,L2 Loss 和交叉熵损失的 Loss 大小与梯度大小的量级和幅度可能差异很大,如果不处理会对优化造成很大干扰。

2)Velocity (Loss学习速度)

不同任务因为样本的稀疏性、学习的难度不一致,在训练和优化过程中,存在 Loss 学习速度不一致的情况。如果不加以调整,可能会出现某个任务接近收敛甚至过拟合的时候,其他任务还是欠拟合的状态。

3)Direction(Loss梯度冲突)

不同任务的 Loss 对共享参数进行更新,梯度存在不同的大小和方向,相同参数被多个梯度同时更新的时候,可能会出现冲突,导致相互消耗抵消,进而出现跷跷板、甚至负迁移现象。 这也是核心需要处理的问题。

5.2 核心论文与典型方法介绍

针对上述3大核心问题,近年来典型的研究子方向和优秀的产出方法如下图表:

典型研究方向 & 优秀方法产出; 1-24

典型研究方向 & 优秀方法产出; 1-25

1)Uncertainty Weight [4]

简单的多任务学习往往是把所有 Loss 进行联合优化,通常需要需要手动调节他们的 weights。典型的  Function 如下:

然而这种方式通常存在如下问题

模型最后学习效果对于 weights 非常敏感,否则很难同时收获对于多个任务都比较优的模型。同时手工调节这些 weights 也是非常费时费力的工作。 这篇paper提出直接建模单个任务中的uncertainty,然后通过uncertainty来指导权重的调节。

 为直接建模的uncertainty,是一个可学习的参数。 总 Loss 设计成这样的形式,模型优化过程中会倾向于惩罚高 Loss 而低\sigma 的情况(如果一个任务的 Loss 高,同时 \sigma 又小的话,这一项就会很大,优化算法就会倾向于优化它)。

 背后的含义是: Loss 大的任务,包含的uncertainty也应该多,而它的权重就应该小一点。 这样优化的结果就是往往 Loss 小(『相对简单』)的任务会有一个更大的权重。例如在分类 + 回归的多目标优化任务中,回归任务 Loss 大,Uncertainty Weight给予小权重,整体效果可能是有帮助的。

Uncertainty Weight核心代码参考

from keras.layers import Input, Dense, Lambda, Layer
from keras.initializers import Constant
from keras.models import Model
from keras import backend as K

# 自定义loss层
class CustomMultiLossLayer(Layer):
def __init__(self, nb_outputs=2, **kwargs):
self.nb_outputs = nb_outputs
self.is_placeholder = True
super(CustomMultiLossLayer, self).__init__(**kwargs)

def build(self, input_shape=None):
# 初始化 log_vars
self.log_vars = []
for i in range(self.nb_outputs):
self.log_vars += [self.add_weight(name='log_var' + str(i), shape=(1,),
initializer=Constant(0.), trainable=True)]
super(CustomMultiLossLayer, self).build(input_shape)

def multi_loss(self, ys_true, ys_pred):
assert len(ys_true) == self.nb_outputs and len(ys_pred) == self.nb_outputs
loss = 0
for y_true, y_pred, log_var in zip(ys_true, ys_pred, self.log_vars):
precision = K.exp(-log_var[0])
loss += K.sum(precision * (y_true - y_pred)**2. + log_var[0], -1)
return K.mean(loss)

def call(self, inputs):
ys_true = inputs[:self.nb_outputs]
ys_pred = inputs[self.nb_outputs:]
loss = self.multi_loss(ys_true, ys_pred)
self.add_loss(loss, inputs=inputs)
return K.concatenate(inputs, -1)

2)GradNorm [5]

Gradient normalization方法的主要思想是:

  • 希望不同的任务的 Loss 量级是接近的
  • 希望不同的任务以相似的速度学习

Gradnorm: Gradient normalization for adaptive loss balancing in deep multitask networks》这篇paper尝试将不同任务的梯度调节到相似的量级来控制多任务网络的训练,以鼓励网络以尽可能相同的速度学习所有任务。

GradNorm; 1-26

Gradient normalization具体实现方式如下

Gradnorm: Gradient normalization for adaptive loss balancing in deep multitask networks; 1-27

gradnorm在单个batch step的流程总结如下

GradNorm核心代码参考

class GradNorm:
def __init__(self,
device,
model,
model_manager,
task_ids,
losses,
metrics,
train_loaders,
test_loaders,
tensorboard_writer,
optimizers,
alpha=1.):

super().__init__(
device, model, model_manager, task_ids, losses, metrics,
train_loaders, test_loaders, tensorboard_writer)

self.coeffs = torch.ones(
len(task_ids), requires_grad=True, device=device)
optimizer_def = getattr(optim, optimizers['method'])
self.model_optimizer = optimizer_def(
model.parameters(), **optimizers['kwargs'])
self.grad_optimizer = optimizer_def(
[self.coeffs], **optimizers['kwargs'])

self.has_loss_zero = False
self.loss_zero = torch.empty(len(task_ids), device=device)
self.alpha = torch.tensor(alpha, device=device)

def train_epoch(self):
"""
训练1轮
"""
self.model.train()
loader_iterators = dict([(k, iter(v))
for k, v in self.train_loaders.items()])
train_losses_ts = dict(
[(k, torch.tensor(0.).to(self.device)) for k in self.task_ids])
train_metrics_ts = dict(
[(k, torch.tensor(0.).to(self.device)) for k in self.task_ids])
total_batches = min([len(loader)
for _, loader in self.train_loaders.items()])
num_tasks = torch.tensor(len(self.task_ids)).to(self.device)

relative_inverse = torch.empty(
len(self.task_ids), device=self.device)
_, all_branching_ids = self.model.execution_plan(self.task_ids)
grad_norm = dict([
(k, torch.zeros(len(self.task_ids), device=self.device))
for k in all_branching_ids])

pbar = tqdm(desc=' train', total=total_batches, ascii=True)
for batch_idx in range(total_batches):
tmp_coeffs = self.coeffs.clone().detach()
self.model.zero_grad()
self.grad_optimizer.zero_grad()
for k, v in self.model.rep_tensors.items():
if v.grad is not None:
v.grad.zero_()
if v is not None:
v.detach()

# 对每个task, 计算梯度,反向传播, 累计gradients norms
for task_idx, task_id in enumerate(self.task_ids):
data, target = loader_iterators[task_id].next()
data, target = data.to(self.device), target.to(self.device)

# do inference and accumulate losses
output = self.model(data, task_id, retain_tensors=True)
for index in all_branching_ids:
self.model.rep_tensors[index].retain_grad()
loss = self.losses[task_id](output, target)
weighted_loss = tmp_coeffs[task_idx] * loss

weighted_loss.backward(retain_graph=False, create_graph=True)
output.detach()

# GradNorm relative inverse training rate accumulation
if not self.has_loss_zero:
self.loss_zero[task_idx] = loss.clone().detach()
relative_inverse[task_idx] = loss.clone().detach()

# GradNorm accumulate gradients
for index in all_branching_ids:
grad = self.model.rep_tensors[index].grad
grad_norm[index][task_idx] = torch.sqrt(
torch.sum(torch.pow(grad, 2)))

# calculate training metrics
with torch.no_grad():
train_losses_ts[task_id] += loss.sum()
train_metrics_ts[task_id] += \
self.metrics[task_id](output, target)

# GradNorm calculate relative inverse and avg gradients norm
self.has_loss_zero = True
relative_inverse = relative_inverse / self.loss_zero.clone().detach()
relative_inverse = relative_inverse / torch.mean(relative_inverse).clone().detach()
relative_inverse = torch.pow(relative_inverse, self.alpha.clone().detach())

coeff_loss = torch.tensor(0., device=self.device)
for k, rep_grads in grad_norm.items():
mean_norm = torch.mean(rep_grads)
target = relative_inverse * mean_norm
coeff_loss = coeff_loss + mean_norm.mean()

# GradNorm optimize coefficients
coeff_loss.backward()

# optimize the model
self.model_optimizer.step()

pbar.update()

for task_id in self.task_ids:
train_losses_ts[task_id] /= \
len(self.train_loaders[task_id].dataset)
train_metrics_ts[task_id] /= \
len(self.train_loaders[task_id].dataset)

train_losses = dict([(k, v.item())
for k, v in train_losses_ts.items()])
train_metrics = dict([(k, v.item())
for k, v in train_metrics_ts.items()])
pbar.close()
return train_losses, train_metrics

3)DWA [6]

End-to-End Multi-Task Learning with Attention》这篇paper中直接定义了一个指标来衡量任务学习的快慢,然后来指导调节任务的权重。

用这一轮loss除以上一轮loss,这样可以得到这个任务loss的下降情况用来衡量任务的学习速度,然后直接进行归一化得到任务的权重。当一个任务loss比其他任务下降的慢时,这个任务的权重就会增加,下降的快时权重就会减小。是只考虑了任务下降速度的简化版的Gradient normalization,简单直接。

4)PCGrad [7]

PCGrad是Google在NIPS 2020《Gradient surgery for multi-task learning》这篇paper里提出的方法,PCGrad指出MTL多目标优化存在3个问题:

① 方向不一致,导致撕扯,需要解决
② 量级不一致,导致大gradients主导,需要解决
③ 大曲率,导致容易过拟合,需要解决

解决办法如下

  • 先检测不同任务的梯度是否冲突,冲突的标准就是是否有 negative similarity;
  • 如果有冲突,就把冲突的分量 clip 掉(即,把其中一个任务的梯度投影到另一个任务梯度的正交方向上)。

Gradient surgery for multi-task learning; 1-28

论文中的算法步骤如下

Gradient surgery for multi-task learning; 1-29

PCGrad核心代码参考

class PCGrad(optimizer.Optimizer):

def __init__(self, optimizer, use_locking=False, name="PCGrad"):
"""
optimizer优化器
"""
super(PCGrad, self).__init__(use_locking, name)
self.optimizer = optimizer

def compute_gradients(self, loss, var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
grad_loss=None):
assert type(loss) is list
num_tasks = len(loss)
loss = tf.stack(loss)
tf.random.shuffle(loss)

# 计算每个任务的梯度
grads_task = tf.vectorized_map(lambda x: tf.concat([tf.reshape(grad, [-1,])
for grad in tf.gradients(x, var_list)
if grad is not None], axis=0), loss)

# 计算梯度投影
def proj_grad(grad_task):
for k in range(num_tasks):
inner_product = tf.reduce_sum(grad_task*grads_task[k])
proj_direction = inner_product / tf.reduce_sum(grads_task[k]*grads_task[k])
grad_task = grad_task - tf.minimum(proj_direction, 0.) * grads_task[k]
return grad_task

proj_grads_flatten = tf.vectorized_map(proj_grad, grads_task)

# 把展平的投影梯度恢复原始shape
proj_grads = []
for j in range(num_tasks):
start_idx = 0
for idx, var in enumerate(var_list):
grad_shape = var.get_shape()
flatten_dim = np.prod([grad_shape.dims[i].value for i in range(len(grad_shape.dims))])
proj_grad = proj_grads_flatten[j][start_idx:start_idx+flatten_dim]
proj_grad = tf.reshape(proj_grad, grad_shape)
if len(proj_grads) < len(var_list):
proj_grads.append(proj_grad)
else:
proj_grads[idx] += proj_grad
start_idx += flatten_dim
grads_and_vars = list(zip(proj_grads, var_list))
return grads_and_vars

5)GradVac [8]

GradVac是Google在ICLR 2021《Investigating and improving multi-task optimization in massively multilingual models》这篇paper里提出的方法,作为PCGrad的改进应用在多语种 机器翻译任务上。

对比PCGrad,我们看看GradVac的做法

  • PCGrad只是设置了一个下界。让两个任务的cosine相似度至少是大于等于0的,不能出现负数。这个下界非常容易达到。
  • 两个任务的真实相似度,其实是会逐渐收敛到一个水位。这个值可以认为是两个任务的真实相似度。
  • 两个任务的Gradinet相似度,应当去靠近这个相似度,而不是只满足PCGrad设置的下界。

Investigating and improving multi-task optimization in massively multilingual models; 1-30

六、总结

总结一下,本文提到了多目标多任务场景下的优化方法,主要包含 网络结构优化 和 优化方法和策略提升两方面,最终目标都是希望缓解任务间的冲突和内耗,尽量优化提升所有业务目标。要构建一个promising的共赢多任务多目标解决方案,一些经验tips如下:

经验Tips | 构建共赢多任务多目标解决方案; 1-31

  • 1)首先关注业务场景,思考业务目标优化重点,进而确定多任务的组合形式
    • 主任务 + 主任务:解决业务场景既要又要的诉求,多个任务都希望提升
    • 主任务 + 辅任务:辅助任务为主任务提供一些知识信息的增强,帮助主任务提升 2.考虑不同任务间的重要度和相似性,考虑清楚辅助任务和主任务的关系;
  • 2)实际训练过程中,可以训练优化其中1个任务,观察其他任务的loss变化
    • 其他任务loss同步下降,则关联性较强
    • 其他任务loss抖动或有上升趋势,要回到业务本身思考是否要联合多任务训练
  • 3)网络结构选择MMoE或者PLE
  • 4)训练过程中关注Loss的量级,如果不同任务之间差异很大,注意约束和控制
  • 5)训练过程的优化策略,可以尝试PCGrad等方法对梯度进行调整,并观察效果

参考文献

  • [1] Ma J, Zhao Z, Yi X, et al. Modeling task relationships in multi-task learning with multi-gate mixture-of-experts[C]//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2018: 1930-1939.
  • [2] Jiaqi Ma, Zhe Zhao, Jilin Chen,et al. SNR: Sub-Network Routing forFlexible Parameter Sharing in Multi-Task Learning[C]//The Thirty-Third AAAI Conference on Artificial Intelligence (AAAI-19).2019: 216-223
  • [3] Tang H, Liu J, Zhao M, et al. Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendations[C]//Fourteenth ACM Conference on Recommender Systems. 2020: 269-278.
  • [4] Kendall A, Gal Y, Cipolla R. Multi-task learning using uncertainty to weigh losses for scene geometry and semantics[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 7482-7491.
  • [5] Chen Z, Badrinarayanan V, Lee C Y, et al. Gradnorm: Gradient normalization for adaptive loss balancing in deep multitask networks[C]//International Conference on Machine Learning. PMLR, 2018: 794-803.
  • [6] Liu S, Johns E, Davison A J. End-to-end multi-task learning with attention[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2019: 1871-1880.
  • [7] Yu T, Kumar S, Gupta A, et al. Gradient surgery for multi-task learning[J]. arXiv preprint arXiv:2001.06782, 2020.
  • [8] Wang Z, Tsvetkov Y, Firat O, et al. Gradient vaccine: Investigating and improving multi-task optimization in massively multilingual models[J]. arXiv preprint arXiv:2010.05874, 2020.

MATLAB算法实战应用案例精讲-【智能优化算法】多目标算法性能评价指标
qq_36130719的博客
04-15 3894
在评估多目标优化算法的效果时,我们通常使用五个主要指标:GD(Generational Distance)、IGD(Inverted Generational Distance)、Hypervolume、Spacing和Spread。和是用于测量算法生成的解集合与真实前沿解之间的距离的指标。具体而言,GD测量了所有生成解与真实前沿解之间的平均欧几里得距离,而IGD测量了所有真实前沿解与生成解之间的平均欧几里得距离。这两个指标的目标是越小越好,即算法的生成解集合应该尽可能接近真实前沿解。
《MATLAB智能算法30个案例》:第9章 基于遗传算法的多目标优化算法
sinat_34897952的博客
07-13 4501
《MATLAB智能算法30个案例分析》是2011年7月1日由北京航空航天大学出版社出版的图书,作者是郁磊、史峰、王辉、胡斐。本书案例是各位作者多年从事算法研究的经验总结。书中所有案例均因国内各大MATLAB技术论坛网友的切身需求而精心设计,其中不少案例所涉及的内容和求解方法在国内现已出版的MATLAB书籍中鲜有介绍。《MATLAB智能算法30个案例分析》采用案例形式,以智能算法为主线,讲解了遗传算法、免疫算法、退火算法、粒子群算法、鱼群算法、蚁群算法和神经网络算法等最常用的智能算法的MATLAB实现。本书共
多目标优化算法设计源代码
12-14
多目标优化算法设计源代码,供大家学习研究使用
多目标优化方法级实例
06-13
该PPT主要讲述了多目标优化的一些方法,然后从应用的角度讲了一些多目标优化实例,并且给出了一定的源代码
多目标优化——Pareto最优及其相关智能算法(学习中,未完成)
最新发布
weixin_50478509的博客
07-24 2194
多目标优化研究因其不同目标函数之间存在冲突,无法实现每个目标函数都达到最优,由此给出几个定义:整个区域被分为可行区域与不可行区域,弧线为Pareto最优边界,A,B,C为Pareto最优解,且A,B都是互不支配的关系,我们在寻找最优解集时希望所得的结果可以落在最优边界上或者是接近于它,越靠近最优边界,说明我们找到的解越好。D,E,F为可行区域的三个解,显然,所以D和E是互不支配的关系,而对于F点来说,D和E都可以支配F,因为,也就是说D和E优于F。
多目标优化
热门推荐
withme的博客
04-24 4万+
多目标优化
多目标优化算法
09-14
多目标遗传优化算法用于化工过程建模,特别是在丙烯精馏塔和制乙烯上的应用。优化算法包含遗传算法和蚁群算法。
2024最新多目标优化算法:多目标指数分布优化算法(Multi-objective exponential distribution optimizer ,MOEDO)(提供MATLAB代码)
IT猿手
03-09 3630
MOEDO求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3),其中Viennet2 与Viennet3的目标数为3,其余测试函数的目标数为2,并采用4种评价指标(IGD、GD、HV、SP)进行评价对比。与IGD类似,GD也是通过计算算法生成的解集中每个解与真实前沿之间的距离,并对所有解的距离进行平均来评估算法的性能。HV值越大,表示算法生成的解集所占据的超体积越大,即解集的多样性和覆盖面积越好。
c语言实现多目标优化,MOPSO 多目标例子群优化算法
weixin_35326667的博客
05-23 1626
近年来,基于启发式的多目标优化技术得到了很大的发展,研究表明该技术比经典方法更实用和高效。有代表性的多目标优化算法主要有NSGA、NSGA-II、SPEA、SPEA2、PAES和PESA等。粒子群优化(PSO)算法是一种模拟社会行为的、基于群体智能的进化技术,以其独特的搜索机理、出色的收敛性能、方便的计算机实现,在工程优化领域得到了广泛的应用,多目标PSO(MOPSO)算法应用到了不同的优化领域[...
多目标优化算法学习笔记
weixin_48000166的博客
05-21 3091
MOEA 分类 按机制分配 基于分解 将子目标聚合成单目标 基于支配 基于Pareto的适应度分配 基于指标 基于指标评价候选解的性能 按决策分类 前决策 搜索前输入决策信息,产生一个解 后决策 提供一组解供决策者选择 independent sampling 每个目标赋予不同权值每次调整 criterion selection 分为k个子种群对不同目标进行优化,非凸函数难以找到最优 aggregation selection 对所取个体适应度进行选择,会丢失边缘解 pareto sampling 基于p
多目标优化(Comparison of Multiobjective Evolutionary Algorithms: Empirical Results)
07-02
详细的介绍多目标有化算法以及相应的测试函数,以及对比各种多目标优化算法(Comparison of Multiobjective Evolutionary Algorithms: Empirical Results)
多目标优化方法与原理
04-06
多目标优化方法与原理,详细的介绍了所有多目标优化问题1
多目标优化问题MOP
a999999123的博客
11-22 1万+
概念 多目标优化问题( multi-objective optimization problem,MOP)也称为向量优化问题或多准则优化问题。多目标优化问题可以描述为:在可行域中确定由决策变量组成的向量,它满足所有约束,并且使得由多个目标函数组成的向量最优化。 而这些组成向量的多个目标函数彼此之间通常都是互相矛盾的。 因此,这里的“优化”意味求一个或一组解向量使目标向量中的所有目标函数满足设计者的要求。 这些相互冲突的子目标,一个子目标的改善有可能会引起另一个或者另几个子目标的性能降低 , 也就是要同时使多
写文章

热门文章

  • 计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash)& 代码实现 与举例 51137
  • 一文概括常用图像处理算法 31157
  • latex中的对与错(对号√与叉号×)、空格 25089
  • ubuntu修改IP地址 24062
  • 【论文合集】Awesome Diffusion Models 3 20266

分类专栏

  • 论文笔记 147篇
  • Transformer系列 34篇
  • 半监督学习 15篇
  • 知识学习系列 156篇
  • 电脑操作系列 4篇
  • 经验分享 77篇
  • Attention系列 6篇
  • 数字图像处理 24篇
  • 代码阅读系列 37篇
  • Python常用代码 18篇
  • 笔记 3篇
  • 环境问题系列 2篇

最新评论

  • 【arXiv2303】Learning with Explicit Shape Priors for Medical Image Segmentation

    无尽、: 请问有tensorflow的代码吗

  • 【CVPR2023】CDDFuse: Correlation-Driven Dual-Branch Feature Decomposition for Multi-Modality Image Fus

    cailiao12: 运行test文件代码出不了结果,为啥

  • 【CVPR2023】CDDFuse: Correlation-Driven Dual-Branch Feature Decomposition for Multi-Modality Image Fus

    Z_zst: 我跑出来后做测试 但是生成的图片是灰度图 这个要怎样转成彩色的?

  • 超级文献下载工具scihub-cn,教您一行命令下载文献

    dragon_three: 你好作者能问下,输入命令之后显示结果跟你的一样,但是就是不会下载文件这是为什么?

  • 【CVPR2023】CDDFuse: Correlation-Driven Dual-Branch Feature Decomposition for Multi-Modality Image Fus

    Ruixxxa: 你好,请问你找到数据集了吗?

大家在看

  • 【Kubernetes】常见面试题汇总(二十三) 591
  • 基于SSM的学生请假管理系统(有报告)。Javaee项目。 538
  • 通过东方财富获取etf数据代码可用
  • 神仙级AI大模型入门教程(非常详细),从零基础入门到精通,从看这篇开始!
  • 【源码论文】基于小程序/安卓的校园理发预约平台uniapp-JAVA.VUE 1811

最新文章

  • 【论文笔记】利用扩散模型DDPM做变化检测change detection
  • 【NeurIPS 2023】PromptIR: Prompting for All-in-One Blind Image Restoration
  • 【IJCAI2022】Uncertainty-Guided Pixel Contrastive Learning for Semi-Supervised Medical Image Segmentat
2024年1篇
2023年93篇
2022年202篇
2021年20篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司网站优化公司哪家专业优化网站流量的软件下载镇江好的婚纱摄影网站优化泸州清镇网站优化哪家网站优化服务好高港网站优化哪家好百度seo网站优化价格南昌网站优化步骤企业网站 文库优化免费网站优化哪个好濮阳知名网站优化地址专业网站优化公司优化网站效果好网站优化一般什么价位怒江网站优化费用安阳企业seo网站优化推荐阳谷网站优化方案十堰网站关键词优化汉口全网营销公司哪家网站优化好下城区网站优化排名平台seo优化提高网站收录遂宁网站建设优化网站标题优化的要点是什么网站上线前SEO优化中国武汉网站优化资讯郁南网站seo优化公司合肥放心的网站优化武汉专业网站优化推广阜宁百度网站优化软件册亨网站优化推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化