论文标题:GradNorm: Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks(深度多任务网络中自适应损失平衡的梯度归一化研究)
发表时间:2017
领域:多任务学习损失函数优化
发表期刊:
相关代码:无
数据集:无
深度多任务网络,即一个神经网络产生多个预测输出,可以比单任务网络提供更好的速度和性能,但正确的训练具有挑战性。我们提出了一种梯度归一化(GradNorm)算法,通过动态调整梯度大小来自动平衡深度多任务模型的训练。我们表明,对于各种网络架构,对于回归和分类任务,以及合成和真实数据集,与单任务网络、静态基线和其他自适应多任务损失平衡技术相比,GradNorm提高了准确性,并减少了跨多个任务的过拟合。GradNorm也匹配或超过穷举网格搜索方法的性能,尽管只涉及单个不对称超参数α。因此,曾经是一个乏味的搜索过程,为每个添加的任务产生指数级的计算,现在可以在几次训练运行中完成,而不管任务的数量。最终,我们将证明梯度操纵使我们对多任务网络的训练动态有很大的控制,并可能是释放多任务学习潜力的关键之一。
计算机视觉中的单任务学习在深度学习方面取得了很大的成功,许多单任务模型现在在各种任务中的表现达到或超过人类的精度。然而,一个能够实现完整场景理解的终极视觉系统必须能够同时有效地执行许多不同的感知任务,特别是在嵌入式系统的有限计算环境中,如智能手机、可穿戴设备和机器人/无人机。这样的系统可以通过多任务学习来实现,其中一个模型在多任务任务中共享权重,并在一次向前传递中进行多个推断。这些网络不仅是可扩展的,而且这些网络内的共享特征可以诱导更鲁棒的正则化,从而提高性能。在理想的极限下,我们可以拥有多任务网络的最佳状态:更高的效率和更高的性能。
一般来说,多任务网络很难训练;不同的任务需要得到适当的平衡,以便网络参数收敛到对所有任务都有用的鲁棒共享特征。
确实很难训练,因为你也不知道最合适的权重参数,完全是在瞎猫碰死耗子
迄今为止,多任务学习的方法在很大程度上试图通过操纵网络的正向传递来找到这种平衡(例如,通过构建特征之间的显式统计
关系或优化多任务网络架构
),但这些方法忽略了一个关键的见解:任务的不平衡阻碍了适当的训练,因为它们表现为反向传播的梯度之间的不平衡。例如,一项在训练过程中过于占主导地位的任务,必然会通过诱导具有相对较大幅度的梯度来表达这种主导地位。我们的目标是通过调整多任务损失函数来直接修改梯度幅度,从而彻底缓解这些问题。
在实践中,多任务损失函数通常被认为是单任务损失Li, L = ∑ i w i L i L=\sum_iw_iL_i L=∑iwiLi,其中总和运行于所有T任务。在我们的例子中,我们提出了一种自适应的方法,因此 w i w_i wi可以在每个训练步骤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的训练速度相对较快,那么它的权重 w i ( t ) w_i (t) wi(t)应该相对于其他任务的权重 w j ( t ) ∣ j ≠ i w_j (t)|_{j≠i} wj(t)∣j=i减少,从而允许其他任务对训练的影响更大。我们的算法可以说是类似于批处理归一化(Ioffe & Szegedy,2015),有两个主要的特征:
对于多任务损失函数 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)的函数,其目标如下:
为此,我们首先对相关的量进行微调,首先是关于我们将操纵的梯度。
我们还为每个任务i定义了不同的训练率:
有了上述定义,我们现在完成了对GradNorm算法的描述。
如第上一节节所述,梯度应建立一个共同的梯度量表,还应平衡不同任务的训练率。梯度的共同尺度是最自然的是平均梯度范数 G ‾ W ( t ) \overline{G}_W (t) GW(t),它在每个时间步长t处建立一个基线,通过它我们可以确定相对梯度的大小。任务i的相对逆训练率, r i ( t ) r_i (t) ri(t),可以用来评价平衡我们的梯度.具体地说, r i ( t ) r_i (t) ri(t)的值越高,任务i的梯度大小就越高是为了鼓励任务更快的训练。因此,我们对每个任务i所期望的梯度范数很简单:
其中,α是一个额外的超参数。α设置了将任务恢复到普通训练速率的恢复力的强度。在任务的复杂性非常不同,导致任务之间的学习动态显著不同的情况下,应该使用更高的α值来执行更强的训练率平衡。当任务更对称时(例如第3节中的合成示例),较低的α值是合适的。请注意,α = 0总是试图将每个任务中反向传播梯度的规范固定定,使之相等。有关调优α的影响的更多细节,请参阅4.4节。
公式1给出了每个任务i的梯度范数的一个目标,我们更新了我们的损失权重 w i ( t ) w_i (t) wi(t),以将每个任务的梯度范数移动到这个目标上。GradNorm然后被实现为每个任务的每个时间步长的实际梯度范数之间的L1损失函数 L g r a d L_grad Lgrad,对所有任务进行求和:
总和贯穿所有T任务。当区分这个损失 L g r a d L_{grad} Lgrad时,我们将目标梯度范数 G ‾ W ( t ) × [ r i ( t ) ] α \overline{G}_W (t)×[ri (t)]^α GW(t)×[ri(t)]α视为一个固定的常数,以防止允许 L 1 L_1 L1目标移动导致的发散到零值。然后, L g r a d L_{grad} Lgrad只根据 w i w_i wi进行区分,因为 w i ( t ) w_i (t) wi(t)直接控制每个任务的梯度大小。然后,通过标准的更新规则应用计算出的梯度 ∇ w i L g r a d ∇_{wi}L_{grad} ∇wiLgrad来更新每个 w i w_i wi(如图1所示)。
图1:Gradient Normalization.不平衡的梯度规范(左)导致了在多任务网络中的次优训练。我们通过计算一种新的梯度损失 L g r a d L_{grad} Lgrad(右)来实现GradNorm,它检测任务之间梯度范数的不平衡,并调整损失函数中的权重来补偿。
在算法1中总结了完整的梯度规范算法。注意,在每个更新步骤之后,我们还将权值 w i ( t ) w_i (t) wi(t)重新正规化,以便 ∑ i w i ( t ) = T \sum_iw_i (t) = T ∑iwi(t)=T,以便将梯度归一化与全局学习速率解耦。
为了在一个简单的、可解释的系统上说明GradNorm,我们构建了一个多任务网络的通用场景
:具有相似损失函数但损失尺度不同的训练任务。在这种情况下,如果我们天真地选择 w i ( t ) = 1 w_i (t) = 1 wi(t)=1作为所有损失权重wi (t),这个网络训练任务将会由于具有较大损失尺度的任务所主导,因此为他们将倾向于方向传播更大的梯度。我们将证明GradNorm克服了这个问题。
在这里我就自己想,是否有一个这样的函数,根据loss1和loss2的变化不断调整权重参数,下降快的权重参数就大,下降慢的权重就大。
考虑对函数使用标准平方损失训练的T回归任务:
其中tanh(·)在要素方面起作用。输入值250维,输出值是100维。
从原文的阅读可以看出这个toy example因该就是指自己模拟一个场景,去说明这个问题。
为了训练我们的toy模型,我们使用了一个4层全连接的relu激活网络
,每层有100个神经元作为一个共同的主干。最后的仿射变换层给出了T个
最终的预测(对应于T个不同的任务
)。为了确保有效的分析,我们只比较初始化为相同随机值的模型,并输入从相同的固定随机种子生成的数据。
在这些实验中,不对称性α被设置低至0.12,因为输出函数 f i f_i fi都是相同的函数形式,因此我们期望任务之间的不对称性是最小的。
在这些toy问题中,我们测量任务归一化(task-normalized
)测试时间损失来判断测试时间性能,这是每个任务的测试损失比(loss ratios
)之和, l o s s − r a t i o = ∑ i L i ( t ) / L i ( 0 ) loss-ratio=\sum_i L_i (t)/L_i (0) loss−ratio=∑iLi(t)/Li(0)。我们这样做是因为当存在不同的损失尺度时,简单的损失之和对于多任务网络是一个不足的性能指标;更高的损失规模的任务将不成比例地考虑高度的损失。不幸的是,不存在一般的单一标量,它给出了在所有场景中的多任务性能的有意义的度量,但我们的toy问题是专门设计的任务,除了他们的损失量表 σ i σ_i σi,在统计上是相同的。因此,有一个明确的整体网络性能的度量,即由每个任务的方差 σ i 2 σ_i^2 σi2等价(高达一个比例因子)归一化的损失之和到损失比之和。
对于T = 2,我们选择值 ( σ 0 , σ 1 ) = ( 1.0 , 100.0 ) (σ_0,σ_1)=(1.0,100.0) (σ0,σ1)=(1.0,100.0),并在图2的顶部位置中显示训练的结果。
图2:在简单任务2(顶部)和任务10(底部)系统上的梯度标准化。左边是具有损失尺度的网络结构图,中间是训练过程中的 w i ( t ) w_i (t) wi(t)轨迹,右边是任务归一化测试损失曲线。α = 0.12为所有运行。
如果我们让所有损失的权重参数都为1,任务1会由于任务1更高的损失规模而抑制任务0的学习。然而,梯度归一化增加了 w 0 ( t ) w_0(t) w0(t)来抵消来自 t 1 t_1 t1的更大的梯度,并且改进的任务平衡导致了更好的测试时间性能。
当任务数量的增加时,梯度归一化的可能好处会变得更加清晰。对于T = 10,我们从一个广泛的正态分布中采样 σ i σ_i σi,并在图2的底部面板中绘制结果。与天真地加权每个任务相同时相比,GradNorm显著提高了测试时间性能。与T = 2类似,对于T=10, w i ( t ) w_i(t) wi(t)在较小的 σ i σ_i σi任务中变得更大。
对于T = 2和T = 10,GradNorm更稳定,优于(Kendall et al.,2017)。不确定性权重,即强制 w i ( t ) ∼ 1 / L i ( t ) w_i (t)∼1/L_i (t) wi(t)∼1/Li(t),随着每个任务损失的下降,往往会使 w i ( t ) w_i (t) wi(t)的权重太大且过快。虽然这样的网络一开始训练很快,但训练很快就恶化了。这个问题很大程度上是由于不确定性加权允许 w i ( t ) w_i (t) wi(t)不受约束地改变(与GradNorm相比,它确保 ∑ i w i ( t ) = T \sum _i wi (t) = T ∑iwi(t)=T总是这样),这推动了全局学习率随着网络的训练而迅速上升。
总的来说,在一个GradNorm运行过程中,每个w_i (t)的轨迹是相当稳定和收敛的。在第4.3节中,我们将看到时间平均权值 E t [ w i ( t ) ] E_t[w_i (t)] Et[wi(t)]是如何接近最优静态权值的,这表明GradNorm可以大大简化繁琐的网格搜索过程。
我们主要使用NYUv2
的两个变体作为我们的数据集。标准的NYUv2
数据集携带深度、表面法线和语义分割标签(我们聚类为13个不同的类别),用于不同房间类型(浴室、客厅、书房等)的各种室内场景。NYUv2
相对较小(795张训练,654张验证图像),但是包含回归和分类标签,使它成为测试在各种任务中 GradNorm
的鲁棒性的良好选择。
对一个更大规模的多任务数据集进行测试GradNorm,我们使用每个视频中的翻转和额外帧来增加标准的NYUv2
深度数据集,从而得到90,000张图像,包括像素级深度、表面法线和房间关键点标签(不幸的是,分割标签不适用于这些额外帧)。关键点标签是通过专业的人工标签服务获得的,而表面法线是通过算法生成的。然后,将完整的数据集按场景进行分割,以进行90/10的训练/测试分割。有关示例见图6。我们通常将这两个数据集分别称为NYUv2+seg和NYUv2+kpts。