GradNorm: Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks
Loss Balancing in Deep Multitask Networks)
论文翻译
目前在进行基于ResNet的多任务学习,在训练过程中,出现了数据不平衡,参数共享存在一些问题。现在想加入一些基于loss改变的算法思想。论文地址
摘要
深度多任务网络,是一个神经网络产生多个预测输出,可以提供比单任务对应物更好的速度和性能,但很难正确训练。我们提出了一种梯度归一化 (GradNorm) 算法,该算法通过动态调整梯度幅度来自动平衡深度多任务模型中的训练。我们表明,对于各种网络架构、回归和分类任务以及合成和真实数据集,与单任务网络、静态基线和其他自适应多任务损失相比,GradNorm 提高了准确性并减少了跨多个任务的过度拟合平衡的问题。 GradNorm 也匹配或超过了穷举网格搜索方法的性能,尽管只涉及单个不对称超参数 α。因此,曾经是一个繁琐的搜索过程,每次添加的任务都会产生指数级的计算量,现在可以在几次训练运行中完成,而不管任务数量如何。最终,我们将证明梯度操纵使我们能够很好地控制多任务网络的训练动态,并且可能是释放多任务学习潜力的关键之一。
简介
计算机视觉中的单任务学习在深度学习中取得了很大的成功,许多单任务模型现在在执行各种任务时的精度达到或超过人类。然而,用于全场景理解的终极视觉系统必须能够同时高效地执行多种不同的感知任务,尤其是在嵌入式系统的有限计算环境中例如智能手机、可穿戴设备和机器人/无人机。这样的系统可以通过多任务学习来实现,其中一个模型在多个任务之间共享权重,并在一次前向传递中进行多次推理。这样的网络不仅是可扩展的,而且这些网络中的共享特征可以导致更强大的正则化并因此提高性能。在理想的极限下,我们因此可以拥有多任务网络的两全其美:更高的效率和更高的性能。
一般来说,多任务网络很难训练;需要适当平衡不同的任务,以便网络参数收敛到对所有任务有用的强大的共享功能。迄今为止,多任务学习中的优化方法在很大程度上试图通过操纵网络的前向传递(eg:通过构建特征之间的显式统计关系(Long & Wang,2015)或优化多任务网络架构(Misra 等,2016)等,但这些方法忽略了一个关键的见解:任务不平衡阻碍了正确的训练,因为它们表现为反向传播梯度之间的不平衡。例如,一个在训练过程中占主导地位的任务,必然会通过引入具有相对较大量级的梯度来表达这种主导地位。我们的目标是通过调整多任务损失函数直接修改梯度幅度,从而从根本上缓解此类问题。
在实践中,通常假设多任务损失函数在单任务损失
L
i
L_{i}
Li,
L
=
∑
i
w
i
L
i
L=\sum_iw_iL_i
L=∑iwiLi是线性的,其中总和
L
L
L运行在所有 T 个任务上。在我们的例子中,我们提出了一种自适应方法,因此
w
i
w_i
wi可以在每个训练步骤
t
t
t中变化:
w
i
=
w
i
(
t
)
w_i = w_i(t)
wi=wi(t)。损失函数的这种线性形式便于实现梯度平衡,因为
w
i
w_i
wi非常直接且线性地耦合到来自每个任务的反向传播梯度幅度。然后面临的挑战是在每个训练步骤t 中找到每个
w
i
w_i
wi 的最佳值,以平衡每个任务对最佳模型训练的贡献。为了优化梯度平衡的权重
w
i
(
t
)
w_i(t)
wi(t),我们提出了一种简单的算法,当来自任何任务的反向传播梯度太大或太小时时,该算法会惩罚网络。当任务以相似的速度训练时,就会达到正确的平衡;如果任务
i
i
i的训练速度相对较快,那么它的权重
w
i
(
t
)
w_i(t)
wi(t)应该相对于其他任务的权重
w
j
(
t
)
∣
j
≠
i
w_j(t)|_{j \ne i}
wj(t)∣j=i减少,来调节对其他任务的影响。我们的算法类似于批量归一化 (Ioffe & Szegedy, 2015),但有两个主要区别:(1) 我们跨任务而不是跨数据批进行归一化。(2)我们使用速率平衡作为预期目标来通知我们的规范化。我们将展示这种梯度归一化(以下称为 GradNorm)可提高网络性能,同时显着减少过拟合。
我们对多任务学习的主要贡献如下:
- 一种有效的多任务损失平衡算法,可直接调整梯度幅度。
- 一种匹配或超过非常昂贵的详尽网格搜索程序的性能方法,但只需要调整单个超参数。
- 直接梯度交互的演示提供了一种控制多任务学习的强大方法。
相关工作
多任务学习早在深度学习出现之前就被引入(Caruana,1998 年;Bakker &Heskes,2003 年),但深度网络中强大的学习特征及其出色的单任务性能已经重新引起人们的兴趣。虽然我们的主要应用领域是计算机视觉,但多任务学习在其他多个领域也有应用,从自然语言处理 (Collobert & Weston, 2008; Hashimoto et al., 2016; Søgaard & Goldberg, 2016) 到语音合成(Seltzer& Droppo,2013 年;Wu 等人,2015 年),从非常特定领域的应用程序,例如流量预测(Huang 等人,2014 年)到非常通用的跨域工作(Bilen& Vedaldi,2017 年)。在课程学习的背景下也探索了多任务学习(Graves 等人,2017 年),其中任务的子集随后基于局部奖励进行训练;我们在这里探索了相反的方法,根据全局奖励(例如总损失减少)联合训练任务。
多任务学习非常适合计算机领域,其中进行多个稳健的预测是对于完整的场景理解至关重要。深度网络已被用于解决多个视觉任务的各种子集,从3-task网络(Eigen & Fergus,2015;Teichmann 等,2016)到更大的子集,如UberNet(Kokkinos,2016)。通常,单个计算机视觉问题甚至可以被定义为多任务问题,例如在 Mask R-CNN 中进行实例分割(He 等人,2017)或 YOLO-9000 中进行对象检测(Redmon & Farhadi,2016)。特别值得注意的是在多任务模型中寻找明确的方法来利用任务关系的丰富而重要的工作。聚类方法已经显示出超越深度模型的成功(Jacob等人,2009 年;Kang 等人,2011 年),而诸如深层关系网络(Long & Wang,2015 年)和交叉网络(Misra 等人,2016 年)让深层网络能够搜索任务之间有意义的关系,并学习在它们之间共享哪些特征。 (Warde-Farley et al., 2014) 和 (Lu et al., 2016) 中的工作使用标签之间的分组来搜索可能的学习架构。也许与当前工作最相关的是(Kendall 等人,2017 年)使用联合似然公式根据每个任务的内在不确定性推导出任务权重。
The GradNorm 算法
定义和准备
对于一个多任务损失函数 L ( t ) = ∑ w i ( t ) L i ( t ) L(t) = \sum w_i(t)L_i(t) L(t)=∑wi(t)Li(t),我们计划学习函数 w i ( t ) w_i(t) wi(t)具有一下目标:
- 我们通过推断它们的相对大小,将不同任务的梯度范数放在一个共同的尺度上。
- 动态调整梯度范数,以便不同的任务以相似的速率训练。为此,我们首先定义相关量,首先我们将要操纵所考虑的梯度。
- W W W:我们实际应用GradNorm的全网络子集的权重 W ⊂ ω W \subset \omega W⊂ω, W W W通常选择共享层最后一层的权重,以节约计算成本。
-
G
W
(
i
)
(
t
)
=
∣
∣
▽
W
w
i
(
t
)
L
i
(
t
)
∣
∣
2
G_{W}^{(i)}(t) = || \bigtriangledown_{W}w_i(t)L_{i}(t)||_2
GW(i)(t)=∣∣▽Wwi(t)Li(t)∣∣2:
通过最后一层共享层的 W W W的每个任务的损失函数 w i ( t ) L i ( t ) w_i(t)L_i(t) wi(t)Li(t)的2范数,作为每个任务的梯度幅度表示。 - G ‾ W ( t ) = E t a s k [ G W ( i ) ( t ) ] \overline{G}_W(t) = E_{task}[G_{W}^{(i)}(t)] GW(t)=Etask[GW(i)(t)]:计算每个任务的梯度幅度,算一个均值,得到某次训练的梯度平均幅值。
对于每个任务 i i i,我们也定义了各种训练速率:
- L ~ i ( t ) = L i ( t ) / L i ( 0 ) \tilde{L}_i(t) = L_{i}(t)/L_{i}(0) L~i(t)=Li(t)/Li(0):对于任务 i i i在 t t t时刻的loss比。网络最开始随机预测,此时loss最大,记为 L ( 0 ) L(0) L(0),然后以任务 i i i在 t t t时刻的 L ( t ) / L ( 0 ) L(t)/L(0) L(t)/L(0)作为任务 i i i的逆训练速率(每个任务的时间都是一样,所以这里只表现出loss之比)。
-
r
i
(
t
)
=
L
~
i
(
t
)
/
E
t
a
s
k
[
L
~
i
(
t
)
]
r_i(t) = \tilde{L}_i(t) / E_{task}[ \tilde{L}_i(t)]
ri(t)=L~i(t)/Etask[L~i(t)]:
任务 i i i的相对逆向训练速率。
有了上述定义,我们现在完成对 GradNorm算法的描述。
1、在我们的经验中,
W
W
W的选择会导致GradNorm 在NYUV2网络上,训练时间会增加仅5%。
2、网络中必须有稳定的初始化,
L
i
(
0
)
L_i(0)
Li(0)被直接使用。当
L
i
(
0
)
L_i(0)
Li(0)在初始化的时候是被严重依赖时,我们会使用一个理论上的初始loss代替,eg:对于
L
i
L_i
Li的CE loss across C 的分类,我们会使用
L
i
(
0
)
=
l
o
g
(
C
)
L_i(0) = log(C)
Li(0)=log(C).
The GradNorm的平衡梯度
如3.1所述,GradNorm对于梯度量级应该建立一个相同的尺度,同时也应该平衡不同任务的训练速度。
通过
G
‾
W
(
t
)
\overline{G}_W(t)
GW(t)确定相对梯度大小,任务
i
i
i的逆向训练速率
r
i
(
t
)
r_i(t)
ri(t)被使用在梯度平衡速率上,根据公式,如果
r
i
(
t
)
r_i(t)
ri(t)的值越大,那么任务
i
i
i的梯度就越高,因此需要让任务
i
i
i更加快速的训练,因此我们对于每个任务设计的梯度范数是相似的:
G
W
(
i
)
→
G
‾
W
(
t
)
∗
[
r
i
(
t
)
]
α
G_{W}^{(i)} \rightarrow{\overline{G}_{W}(t) *[r_i(t)]^{\alpha}}
GW(i)→GW(t)∗[ri(t)]α,
其中
α
\alpha
α是一个额外的超参数,
α
\alpha
α含义是使有些任务调整到常见的训练速率上,如果任务的复杂性非常不同,导致任务之间的学习速度不相同,则应该使用更高的值强制执行,来达到训练速率的平衡,当任务之间相似性较大时,使用较低的
α
\alpha
α值。当
α
=
0
\alpha = 0
α=0时,将强制使每个任务的梯度等同于每个任务梯度的平均值,在第5节,将详细介绍如果调整
α
\alpha
α。
上述公式给出了每个梯度范数的目标,现在更新损失权重
w
i
(
t
)
w_i(t)
wi(t)来移动梯度,为每个任务制定对此目标的规范。针对于每个任务,在真实的梯度范数
G
W
(
i
)
(
t
)
G_{W}^{(i)}(t)
GW(i)(t)和目标梯度范数
G
‾
W
(
t
)
∗
[
r
i
(
t
)
]
\overline{G}_{W}(t) *[r_i(t)]
GW(t)∗[ri(t)],GradNorm利用L1范数来计算损失函数
L
g
r
a
d
L_{grad}
Lgrad。
对所有的任务求和,具体公式如下:
L
g
r
a
d
(
t
;
w
i
(
t
)
)
=
∑
i
∣
G
W
(
i
)
−
G
‾
W
(
t
)
∗
[
r
i
(
t
)
]
α
∣
1
L_{grad}(t;w_i(t)) =\sum _{i}|G_{W}^{(i)}-\overline{G}_{W}(t)*[r_i(t)]^{\alpha}|_{1}
Lgrad(t;wi(t))=∑i∣GW(i)−GW(t)∗[ri(t)]α∣1
对所有的任务进行求和,有了 Grad Loss,可以利用Grad Loss对
w
i
(
t
)
w_i(t)
wi(t)进行求导,为了防止
w
i
(
t
)
w_{i}(t)
wi(t)为0,可以将
G
‾
W
(
t
)
∗
[
r
i
(
t
)
]
α
\overline{G}_W(t)*[r_i(t)]^{\alpha}
GW(t)∗[ri(t)]α作为一个固定的常数,
w
i
(
t
)
w_{i}(t)
wi(t)直接控制每个任务的梯度幅度,计算
▽
w
i
L
g
r
a
d
\bigtriangledown_{w_i}L_{grad}
▽wiLgrad,是根据制定的更新标准,去更新每个
w
i
w_i
wi,在更新每一步后,我们重新调整权重
w
i
(
t
)
w_i(t)
wi(t),(不知道做没做归一化)。,为了利用与全局训练神经网络的学习率的关系,会对
∑
i
w
i
(
t
)
=
T
\sum_{i}w_i(t)=T
∑iwi(t)=T进行重整。
T
T
T是任务总数。
样例
为了在一个简单的、可解释的系统上说明 GradNorm,我们为多任务网络构建了一个常见的场景:训练具有相似损失函数但不同损失尺度的任务。在这种情况下,如果我们天真地选择 wi(t) = 1。