What are the tricks in Multi-Task network design?

作者:Alan Huang 链接:https://www.zhihu.com/question/268105631/answer/335246543 来源:知乎

对于 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出现。

Last updated