多任务,训练
转载自:关于多任务学习中的均衡loss方法之一
相关代码:https://github.com/Mikoto10032/AutomaticWeightedLoss/blob/master/AutomaticWeightedLoss.py
相关论文:
Multi-task learning using uncertainty to weigh losses for scene geometry and semantics
Auxiliary tasks in multi-task learning
1. loss平衡
我们借鉴了任务不确定性对Multi-task Loss加权方法,对已上线的多目标模型,加入动态加权机制。
这里的不确定性指任务依赖型不确定。例如,我们有一份包含了学生复习时间、期中成绩、期末成绩的数据,通过期中成绩预测期末成绩和通过复习时间预测期末成绩这两个任务具备不同的难度,也即有不同的不确定性。那么如何量化这个不确定性呢。假设根据数据 d 训练出任务 t 的模型为 f ,当输入为 x 时,模型对应的输出为 f(x) ;考虑了任务不确定性后,模型的输出为 {f(x) ,σ^2 } ,这个 σ 为数据 d 所自带的方差,用于描述模型在数据上的不确定性。而模型将会以无监督学习的方式学习此方差。
经过推导[9],我们可以得到损失函数:
可以看出,在每个任务的损失函数中将会学习一个噪声参数。且此方法可以接受多任务(回归或分类均可),并统一不同损失的尺度。这样,我们就可以直接对其相加得到总损失,得到:
任务不确定性加权的Multi-task Loss,通过把原本的Loss除以 σ^2 ,在一定程度上对任务带来的不确定性消除。而 log(σ^2 ) 起到正则化的作用,防止网络为了最小化Loss而把 σ 预测成很大的值。加上了这个类似正则化项后,只有在原本Loss足够大的时候,σ 值才会增加。通过这种方式,网络就具备了学习任务不确定性的能力。直观上来看,σ 越大,任务的不确定性越大,则任务的权重越小,即噪声大且难学的任务权重会变小。
该方法仅增加了个位数的待训练参数,且不会引入额外的权重超参。同时,仅需要对模型中的Loss函数进行改写既可实现。
在兴趣点预估的MTL时,我们尝试了以任务不确定性对Multi-task Loss进行加权的方法。实践表明,其能帮助模型更好地联合优化Ctr任务与Dwell任务,在业务指标(人均点击、停留时长)上均带来了正向收益。
2. 实测
整个方法的实现上还是很简单的。实测发现,没有很大的提升。