gradnorm论文地址:https://arxiv.org/abs/1711.02257
gradnorm是一种优化方法,在多任务学习(Multi-Task Learning)中,解决 1. 不同任务loss梯度的量级(magnitude)不同,造成有的task在梯度反向传播中占主导地位,模型过分学习该任务而忽视其它任务;2. 不同任务收敛速度不一致;这两个问题。
从实现上来看,gradnorm除了利用label loss更新神经网络的参数外,还会使用grad loss更新每个任务(task)的损失(loss)在总损失中的权重 w w w。
引言
以简单的多任务学习模型shared bottom为例,两个任务的shared bottom结构如下,输出的两个tower分别拟合两个任务。

针对这样的模型,最简单的方法就是每个任务单独计算损失,然后汇总起来,最终的损失函数如下:
l o s s ( t ) = l o s s A ( t ) + l o s s B ( t ) loss(t) = loss_{A}(t)+loss_{B}(t) loss(t)=lossA(t)+lossB(t)
但是,两个任务的loss反向传播的梯度量级可能不同,在反向传播到shared bottom部分时,梯度量级小的任务对模型参数更新的比重少,使得shared bottom对该任务的学习不充分。因此,我们可以简单的引入权重,平衡梯度,如下:
l o s s ( t ) = w A × l o s s A ( t ) + w B × l o s s B ( t ) loss(t) =w_{A}\times loss_{A}(t)+w_{B}\times loss_{B}(t) loss(t)=wA×lossA(t)+wB×lossB(t)
这样做并没有很好的解决问题,首先,如果loss权重 w w w在训练过程中为定值,最初梯度量级大的任务,我们给一个小的 w w w,到训练结束,这个小的 w w w会一直限制这一任务,使得这一任务不能得到很好的学习。因此,需要梯度也是不断变化的,更新公式如下:
l o s s ( t ) = w A ( t ) × l o s s A ( t ) + w B ( t ) × l o s s B ( t ) loss(t) =w_{A}(t)\times loss_{A}(t)+w_{B}(t)\times loss_{B}(t) loss(t)=wA(t)×lossA(t)+wB(t)×lossB(t)
gradnorm就是用梯度,来动态调整loss的 w w w的优化方法。注意,阅读下面需要区分两种loss,1. label的loss,即用于更新权重的loss;2. grad的loss,即用于更新 w w w的loss。
gradnorm
想要动态更新loss的 w w w,最直观的方法就是利用grad,因为在多任务学习中,我们解决的就是多任务梯度不平衡的问题,如果我们能知道 w w w的更新梯度(这里的梯度不是神经网络参数的梯度,是loss权重 w w w的梯度),就可以利用梯度更新公式,来动态更新 w w w,就像更新神经网络的参数一样,如下,其中 λ \lambda λ沿用全局的神经网络学习率。
w ( t + 1 ) = w ( t ) + λ β ( t ) w(t+1) = w(t)+\lambda\beta (t) w(t+1)=w(t)+λβ(t)
我们的目的是平衡梯度,所以 β \beta β最好是梯度关于