如题,在caffe训练时遇到这个特殊的数字之后,loss会一直就是这个数字
网上虽然有很哆针对这个问题调参的trick,但少有详细的分析因此,有必要研究一下caffe的源代码
其中x为softmax前一层的输出
softmax的loss计算公式也很简单,就是对softmax之后预測的概率做对数似然函数
其中y是label若类别数为N,则y为N维对于单label情况,N维中只有一维为1其他为零,计算loss时仅需考虑label中非零那一维即可(實际使用中单label用一个数字记录)
这说明softmax计算得到概率值出现了零(由于float类型所能表示的最小数值是10?38比这个值还小的无法表示,只能是零)
而softmax是用指数函数计算的指数函数的值都是大于零的。因此我们有理由相信,计算过程中出现了float溢出等异常出现了inf,nan等异常数值導致softmax输出为零
最后我们发现当softmax之前的feature值过大时,由于softmax先求指数会超出float数据范围,成为infinf与其他任何数值的和都是inf,softmax在做除法时任何正瑺范围的数值除以inf都会变为0然后求loss时log一下就出现了87.3356这样的值。
以下是模拟训练的loss代码观察feature数值范围对loss的影响
知道了原因,解决时就能對症下药总体上看,softmax输入的feature由两部分计算得到:一部分是输入数据另部分是各层权重参数。
1、观察数据中是否有异常样本或异常label导致數据读取异常
2、调小初始化权重以便使softmax输入的feature尽可能变小
3、降低学习率,这样就能减小权重参数的波动范围从而减小权重变大的可能性。这条也是网上出现较多的方法
4、如果有BN(batch normalization)层,finetune时最好不要冻结BN的参数否则数据分布不一致时很容易使输出值变的很大。
发布了5 篇原创文章 · 获赞 6 · 访问量 1万+