1 简介
2 多任务权重自动训练
论文:Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics
多任务不同的loss调参比较麻烦,如何能够使参数自动训练,公式推到请详见论文
假设有两个损失L1和L2,可以这样设计权重公式,a和b可以自动训练
a = torch.zeros((1,)).cuda()
a.requires_grad = True
b = torch.zeros((1,)).cuda()
b.requires_grad = True
#把权重和模型参数组到一起,使用优化器训练
params = ([p for p in modle.parameters()] + [a] + [b])
optimizer = torch.optim.Adam(params, lr=, betas=, eps=, weight_decay=)
调参经验
多任务的权重非常重要,尤其是dataset分开的时候,可以和单任务的loss做比较,训练过程可能需要动态调整loss
GradNorm自适应loss平衡的梯度归一化
现状和解决目标
多任务学习有利用多个监督信号提高模型效果的能力,同时单个多任务模型一次输出多个任务预估指,可以显著降低维护多个模型的投入。因此在实际工业场景中,多任务模型应用很广泛。
但是多个任务同时训练会面临如下问题:
1、多个任务对应的loss可能偏差比较大,如同时训练回归任务和分类的任务的loss可能存在数量级差异;部分任务主导训练过程,该任务的梯度下降较快,模型容易朝该任务的梯度方向收敛。
2、不同的任务的学习难度可能不一样。点击和(自动)播放等动作可能当前展示展示内容直接影响;给主播送礼或者下单成交,甚至留存等动作用户的决策过程更复杂,影响因素更多,预估难度可能更大,收敛速度更低。
3、多个任务的重要度可能会发生变化:随着业务的变化,任务的重要度可能发生变化,如业务初期面临数量要求,可能关注点击等任务,后期跟注重质量,可能关注实际转化等任务;不同的样本对不同的任务有不同的影响。所以任务重要度需要能自适应的调节。
我们希望不同任务都能合理有效的自己收敛到最优值。所有任务都能收敛到最优值是理想状态,实际情况可能很难达到,尤其是多个任务是不相关任务。
权重自适应调节平衡不同的任务的收敛速度,有助于不同的任务收敛到最优值。最终如何评估权重自适应调节进一步研究。
解决方案
《GradNorm: Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks》提出多任务权重的自适应调节的方法,希望多个任务的loss下降处于平衡状态。降低loss下降速度快的速度。提高loss下降速度快的速度。
每个任务的loss线性加权得到所有的任务的loss,我们希望动态调整每个任务权重。即控制了权重w就控制了不同任务的重要度。
如何调整 w ?我们希望学习速度快的任务的权重 w小,学习慢的任务的 w。学习快慢取决于梯度。所以我们需要知道权重w和梯度之间的关系。
baseline可以计算每个任务的梯度,直接norm每个任务的梯度作为权重。gradNorm更进一步,通过当前 t 训练到的loss Li(t) 与初始loss的比值计算累计任务的变化快慢 ri(t)。
扩展
累计任务的变化快慢 ri(t) 收到初始化参数的影响较大,可以通过逐步累积的方法降低初始化参数的影响。