模型Loss值除了在学习率过高、batch size过大等情况下可能不收敛,还有一种比较基础的情况,也就是模型的Loss函数本身出了问题。
这里也不是指使用的Loss函数不正确,而是当模型中存在复数个Loss函数时,Loss函数之间可能会相互影响。实际情况下,假设有三个Loss函数分别为Loss_fn_a()、Loss_fn_b()、Loss_fn_c(),其返回的Loss值分别为Loss_a、Loss_b、Loss_c,可能出现Loss_a下降,Loss_b和Loss_c都不变的情况,此时可以尝试先屏蔽Loss_fn_a(),测试其余两个Loss值是否正常下降,如果在屏蔽了Loss_fn_a()的情况下,后两个Loss值正常下降,那么应该是Loss_fn_a()与后两个损失函数冲突,若后两个Loss值仍不下降,那么大概率就是后两个损失函数之间存在冲突。
在多个损失函数之间存在冲突的情况下,首先需要验证损失函数的设计逻辑是否存在问题,其次如果每个损失函数独立出来都是正确的优化逻辑,那么就应该分析各个损失函数之间的主从关系,然后对不同的损失值加权重,将主要的损失值权重设置为较大,然后就是愉快的调参时间(*^_^*)