多任务自适应损失权重

2022-08-01,,

多任务自适应损失权重

在训练多任务的时候,当不同任务的数据量不平衡、各任务难易程度不同等等情况下,会导致不同任务的损失差异较大,
导致:有些任务学的过快,有些任务学的过慢;简单的任务都已经过拟合了,困难的任务才开始有效果等等结果。
这时候,我们有必要干涉一下不同任务的优化力度,如:给不同任务设置超参,通过超参平衡不同任务的。
eg:
先给困难任务分配一个较大权重,简单任务分配一个较小权重,已使困难样本优化的更快,当困难任务和简单任务差不多平衡后再把两个的权重调整到平衡。
但这样有一个问题就是来回修改超参,繁琐且不好把持。所以就可以考虑设置一些规则来让模型自己动态调整一些超参。
这里以4个任务调整损失权重为例:
4个任务的损失分别为:

losses = torch.tensor([0.8, 0.7, 1.3, 0.9])

第三个任务损失较大,给他分配个较大的权重,使得损失更大,优化力度更强

def get_losses_weights(losses:[list, numpy.ndarray, torch.Tensor]):
	if type(losses) != torch.Tensor:
		losses = torch.tensor(losses)
	weights = torch.div(losses, torch.sum(losses)) * losses.shape[0]
	return weights

losses = torch.tensor([0.8, 0.7, 1.3, 0.9])	# old_loss = torch.sum(losses) = 3.7
loss_w = get_losses_weights(losses)			# loss_w: [0.8649, 0.7568, 1.4054, 0.9730] 
new_losses = losses * loss_w				# new_losses: [0.6919, 0.5297, 1.8270, 0.8757])
loss = torch.sum(new_losses)				# loss: 3.9243

该方法很简单,就是计算每个损失在总损失里的占比,然后根据这个占比重新为每个任务损失分配权重,各损失乘上新的权重新再求和得到重加权后的总损失。

总结

这样有个好处就是几个任务会差不多同时学习好

本文地址:https://blog.csdn.net/leiduifan6944/article/details/107486857

《多任务自适应损失权重.doc》

下载本文的Word格式文档,以方便收藏与打印。