这个问题很多人在训练自己或者迁移别的网络的时候都会遇到,特别是二分类这样的简单网络,感觉无处着手,都他妈的是对的,就是Loss不动。到底什么原因了?吐槽的网址很多。比如这里,或者这里。若想知道解决办法,请直接跳到文章最后。
-
0.69是个什么数?
一般采用的都是cross entropy loss value,定义如下:
发现就是网络预测给出的二类概率向量为[0.5,0.5],也就是a和1-a都是0.5,不管y取值0/1,整个的平均loss就是-ln(0.5)=0.69.
-
为啥a老是为0.5呢?
a的值是softmax的输出,在二分类的情况下为0.5,表明输入softmax的值x是(近似)相等的。
进一步观察发现,x几乎都很小,随着训练的进行,还有进一步变小的趋势,可怕!
-
为啥Conv和Pooling网络的输出一直往0走
这个我是不清楚的,可能是初始化参数太小,可能是Relu形成的Dead node。于是我调整initializer,调整Relu为leaky-Relu。经过这些处理,网络能够保证在前两次Loss不为0.69,后面又回到了这个可怕的0.69。想到的方案统统不起作用,我甚至怀疑我是不是maximize loss 而不是 minimize loss。 -
最终办法
显然不是我的loss写错了,而是数据分布的问题。调整初始化和激活函数无法间接保证与调节数据分布,那我就强上了BN层,即,在网络的最后某个位置加上Batch Normalization层操作,归一化强力保证其分布,果然彻底解决了0.69问题。在此,不得不佩服前人在网络发展过程中的巨大贡献。
我想这才是解决0.69问题的最终办法。选择不同的optimizer或者网络组成,都极有可能失败。
网友评论