# 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上的表现也是不同的。**&#x5728;训练开始的时候，虽然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出现。
