多任务自适应损失权重
程序员文章站
2022-05-25 09:50:51
多任务自适应损失权重在训练多任务的时候,当不同任务的数据量不平衡、各任务难易程度不同等等情况下,会导致不同任务的损失差异较大,导致:有些任务学的过快,有些任务学的过慢;简单的任务都已经过拟合了,困难的任务才开始有效果等等结果。这时候,我们有必要干涉一下不同任务的优化力度,如:给不同任务设置超参,通过超参平衡不同任务的。eg:先给困难任务分配一个较大权重,简单任务分配一个较小权重,已使困难样本优化的更快,当困难任务和简单任务差不多平衡后再把两个的权重调整到平衡。但这样有一个问题就是来回修改超参,繁...
多任务自适应损失权重
在训练多任务的时候,当不同任务的数据量不平衡、各任务难易程度不同等等情况下,会导致不同任务的损失差异较大,
导致:有些任务学的过快,有些任务学的过慢;简单的任务都已经过拟合了,困难的任务才开始有效果等等结果。
这时候,我们有必要干涉一下不同任务的优化力度,如:给不同任务设置超参,通过超参平衡不同任务的。
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
下一篇: JS高级---正则表达式练习身份证号码
推荐阅读