在训练CNN时,loss稳定在log(类别数),是存在什么问题? 比如说二分类误差稳定在0.69,十分类误差稳定在2.302
首先,0.69, 2.302表明网络就是在随机的猜,这里一般都是因为用了交叉熵损失函数
这里yi往往是1,最后就是1*log(yhat)
而如果是随机猜,预测值会接近1/n,即最后为log(1/n)=-log(n)
1.检查是否代码问题,是否有bug;调参数、learning rate等看看,
也很有可能先开始梯度太大,weight跑到了很远的地方(或者直接跑到了nan,这样loss也就nan了,所以可以先check 下loss)。 一般这个时候做gradient clip或者降低学习率就ok
2.最后一层输出不小心加了relu激活。这样可能导致输出值是0,如果用sigmoid那么求出的概率是0.5,-log0.5等于0.69。而且,由于relu输出值为0的时候,relu的导数为0,梯度没办法回传,因此就一直固定在0.69。
3.初始化是否使用了Xavier,还是使用的高斯初始化等工具。因为初始值决定了非凸优化的极值点。应该至少使用xavier这样的初始化策略。
4. 学习率是否过大,是否使用的sgd,可以尝试一下对学习率并不敏感的策略,比如adam优化
5. 可以尝试添加BN层加快收敛速度。