我设计了一个神经网路,损失函数由三部分组成,然后每部分的差值比较大,其中两项的损失函数初始几百,剩下一项的损失函数只有几点几。那我应该怎么设置权重呢?是否可以把损失函数都归一化?或者给小一点的损失函数乘以个100?或者说可以动态的调整权重,一开始给小一点的损失函数乘以100,之后逐渐减小?可行吗?会对学习速率,收敛造成什么影响?


前几天刚做过类似的问题。

我是先观察用各个损失函数单独训练时,在接近收敛时损失函数的数量级,设置基准权重。比如一个损失函数在 0.2 左右,另一个在 0.02 左右,那么就把基准权重设成 1:10。如果想强调某一个损失函数,就在此基础上加大相应的权重。

这样做的一个可能问题是,不同损失函数的收敛速度不同,在训练过程中可能会暂时偏向于某一个损失函数。不过做为调参的起点还是可以的,如果这种问题真的发生了,再对症下药地想办法。

谢邀。

多个损失函数,数值上应该大致接近,或者说量纲大致一致。比如你有三个人的体重,分别用t、kg、g做单位,数值上直接差了数量级,你加权怎么加。

这种还是有固定换算单位的,可以t乘1000,kg乘1,g乘0.001。但损失函数却没办法确定这个换算关系,你就没有办法通过乘一个常数进行。

解决办法是从损失函数入手使其一致,包括两个方面:

(1)看损失函数是用什么度量单位计算出来的,对其进行归一化处理,先让损失函数的输入保持一致的量纲。比如如果用余弦夹角计算的,本身就是[0,1]区间的,不用再处理。如果欧式距离,则对欧式距离进行归一化处理,比如用不带loss的Softmax进行归一化,caffe的欧式距离层里面也有直接归一化的设置。再比如输入直接是feature map,而feature map的值不是[0,1]的,则可以Softmax归一化,也可以根据其取值区间归一化。总之,先让loss的输入是相同区间的。

(2)损失函数的计算本身,比如是多个batch的总和,还是多个batch的平均,还是怎么算的。即看这3中loss计算方法是否一致,这个应该比较容易看出来,然后进行调整。比如一个loss是总和,其它两个loss是平均,那把总和那个除以batch_size就可以了。

目前我想到这两点,仅供参考。


你问了一个世界性难题,没有人可以有解决方法的。哪怕是你理论上计算出了某个特定的权重设置最终可以保证你的结果,在优化的过程中这个权重也不一定可以保证达到你理论计算的最优点。这种问题只能是『试』


设置超参平衡的是不同部分损失函数的量级和收敛速度,一般来说先使用超参调整损失到同一量级,然后再在这一调整范围内搜索能平衡收敛速度的某一超参数值。


没有免费午餐,任何方法总会在某种情况下表现糟糕。

如果都是正值,可以考虑取对数相加。


推荐阅读:
相关文章