论文链接:https://arxiv.org/pdf/1711.02257.pdf
之前讲过了多任务学习,如简单的shared bottom,都存在一个问题:多个任务的loss如何融合?简单的方式,就是将多个任务的loss直接相加:
但实际情况是,不同任务loss梯度的量级不同,造成有的task在梯度反向传播中占主导地位,模型过分学习该任务而忽视其它任务。此外,不同任务收敛速度不一致的,可能导致有些任务还处于欠拟合,可有些任务已经过拟合了。当然,我们可以人工的设置超参数,如:
由于各任务在训练过程中自己的梯度量级和收敛速度也是动态变化的,所以很显然这样定值的w做并没有很好的解决问题。作者提出了一种可以动态调整loss的w的算法——GradNorm:
从上图可知,GradNorm 是以平衡的梯度作为目标,优化Grad Loss,从而动态调整各个任务的w。
那下面我们就来看看Grad Loss是怎么样的:
Gradient Loss被定义为所有task在当前时间t“真实gradient和target gradient norm的L1正则”相加之和。
解释一下这个式子:
- W是什么:要对那些变量取gradient呢?为了方便起见,作者选取了最后一层shared layer的weights。
- G(i)W(t): task i梯度l2标准化的值。
- GW(t): 平均gradient norm。
- ri(t): task i的相对反向训练速度。
- a: 额外的参数。
伪代码: