神经网络中,设计loss function有哪些技巧?

在实验中,每当涉及到loss修改都比较恼火,存在如下问题: 1、multitask时,如何控制各部分loss的权重?(如目标检测任务中的框回归loss…
关注者
4,270
被浏览
336,078

19 个回答

题主这个问题是 multi-task learning 里相当重要的一个核心问题。我正好在做相关的工作,很多细节将在论文投稿后再更新此答案。此外,我对 re-identfication 相关研究不熟所以无法回答第三个问题请见谅,望其他研究者补充。


理解多任务学习: Understanding Multi-task learning

Multi-task learning 核心的问题通常是可简单分为两类:

  1. How to share: 这里主要涉及到基于 multi-task learning 的网络设计。
  2. Share how much: 如何平衡多任务的相关性使得每个任务都能有比 single-task training 取得更好的结果。

题主的问题主要落在第二类,尽管这两个问题通常同时出现也互相关联。对于 multi-task learning 更加粗略的介绍以及和 transfer learning 的关系请参看我之前的回答:刘诗昆:什么是迁移学习 (Transfer Learning)?这个领域历史发展前景如何?其中同样包括了 task weighting 的一些讨论,以下再做更加细节的补充。

网络设计和梯度平衡的关系: The Relationship Between Network Design and Gradient Balancing

无论是网络设计还是平衡梯度传播,我们的目标永远是让网络更好的学习到 transferable, generalisable feature representation 以此来缓解 over-fitting。为了鼓励多任务里多分享各自的 training signal 来学泛化能力更好的 feature,之前绝大部分研究工作的重点在网络设计上。直到去年才有陆续一两篇文章开始讨论 multi-task learning 里的 gradient balancing 问题。

再经过大量实验后,我得出的结论是,一个好的 gradient balancing method 可以继续有效增加网络的泛化能力,但是在网络设计本身的提高强度面前,这点增加不足一提。更加直白的表达是:

Gradient balancing method 一定需要建立在网络设计足够好的基础上,不然光凭平衡梯度并不会对网络泛化能力有着显著的改变。

梯度统治: Gradient Domination

在 multi-task learning 里又可根据 training data 的类别再次分为两类:

  • one-to-many (single visual domain): 输入一个数据,输出多个标签。通常是基于 image-to-image 的 dense prediction。一个简单的例子,输入一张图片,输出 semantic segmentation + depth estimation。
  • many-to-many (multi visual domain):输入多个数据,输入各自标签。比如如何同时训练好多个图片分类任务。
由于不同任务之间会有较大的差异,平衡梯度的目标是为了减缓任务本身的由于 variance, scale, complexity 不同而导致的差异。

在训练 multi-task 网络时候则会因为任务复杂度的差异出现一个现象,我把他称之为: Gradient Domination, 通常发生在 many-to-many 的任务训练中。因为图片分类可以因为图片类别和本身数据数量而出现巨大差异。而基于 single visual domain 的 multi-task learning 则不容易出现这个问题因为数据集是固定的。

最极端的例子: MNIST + ImageNet 对于这种极端差异的多任务训练基本可以看成基于 MNIST initialisation 的网络对于 ImageNet 的 finetune。所以这种情况的建议就是:优先训练复杂度高的数据集,收敛之后再训练复杂度低的数据集。当然这种情况下,多任务学习也没有太大必要了。

对于一些差别比较大但是还是可接受范围的比如:SVHN + CIFAR100。这种情况的 gradient balancing 就会出现一定的效果但也取决于你输入数据的方式。输入数据的通常方法,例如在这篇文章里:Incremental Learning Through Deep Adaptation 就是通过一个 dataset switch 来决定更新哪一个数据集的参数。对于这种方法,起始 learning rate 调的低,网络本身就会有一个较好的下降速率。

动态加权梯度传播: Adaptive Weighting Scheme

即使光对优化网络调参并不能给多任务学习有着本质的改变。在考虑最 straightforward 的 loss:

L_{total}=\sum_iw_iL_i 我们的目标是学习好一个 w_i(t) 能够根据训练效果动态变化使得平衡网络的梯度传播。

这个问题目前只有两篇文章做出了相关成果,

  • Weight Uncertainty: 这个是通过 Gaussian approximation 的方式直接对修改了 loss 的方式,并同时以梯度传播的方式来更新里面的两个参数。实际实验效果也还不错,在我复现的结果来看能有显著的提升但是比较依赖并敏感于一个合适的的 learning rate 的设置。
  • GradNorm : 是通过网络本身 back-propagation 的梯度大小进行 renormalisation。这篇文章写的比较草率并被最近的 ICLR 2018 拒绝收录了。个人期待他的更新作品能对方法本身有着更细节的描述。
  • Dynamic Weight Average: 我对于 GradNorm 一个更加简约且有效的改进,细节将会被补充。

一些总结

平衡梯度问题最近一年才刚刚开始吸引并产出部分深入研究的工作,这个方向对于理解 multi-task learning 来说至关重要,也可以引导我们去更加高效且条理化的训练多任务网络。但在之前,更重要的事情是理解泛化能力本身,个人觉得 multi-task learning 的核心目标不在于训练多个任务并得到超越单任务学习的性能,而是通过理解 multi-task learning 学习的过程重新思考并加深理解深度学习里 generlisation 的真正意义和价值。

对于 gradient balancing问题,刘诗昆同学回答得挺不错。 我这边再额外补充一些。

multi-task learning 中, tasks之间彼此的相容性对结果也会有一些影响。当两个任务矛盾的时候, 往往结果会比单任务还要差不少。


Multi-task learning 还需要解决的是Gradient domination的问题。 这个问题产生的原因是不同任务的loss的梯度相差过大, 导致梯度小的loss在训练过程中被梯度大的loss所带走。 题主所说的问题1和2都是指这个问题。


如果一开始就给不同的Loss进行加权, 让它们有相近的梯度, 是不是就能训练的好呢? 结果往往不是这样的。 不同的loss, 他们的梯度在训练过程中变化情况也是不一样的;而且不同的loss, 在梯度值相同的时候, 它们在task上的表现也是不同的。在训练开始的时候,虽然balance了, 但是随着训练过程的进行, 中间又发生gradient domination了。 所以要想解决这个问题, 还是要合适地对不同loss做合适的均衡。


实践中应该要如何调整呢? 其实很简单:

假设我们有两个task, 用A和B表示。 假设网络设计足够好, 容量足够大, 而且两个任务本身具有相关性,能够训得足够好。

如果A和B单独训练, 他们在收敛的时候的梯度大小分别记为 Grad_a, Grad_b, 那么我们只需要在两个任务一起训练的时候, 分别用各自梯度的倒数(1/Grad_a, 1/Grad_b)对两个任务做平衡, 然后统一乘一个scalar就可以了。(根据单任务的收敛时候的loss梯度去确定multi-task训练中不同任务的权重。)

因为loss的梯度在训练中通常会变小(这里用通常是因为一般mean square error等loss是这样, 其他有的Loss并不是。), 如果我们确定这个网络在multi-task训练的时候能够达到原来的效果, 我们就只需要把平衡点设在两个任务都足够好的时候。 这样网络在训练过程中, 就自然能够达到那个平衡点, 即使一开始的时候会有gradient domination出现。


最后展示一下我们multi-task learning比较成功的例子:

https://www.zhihu.com/video/954350318671060992