首页 > 代码库 > 深度学习之收敛问题
深度学习之收敛问题
http://blog.csdn.net/xlbryant/article/details/48470987
1.数据库太小一般不会带来不收敛的问题,只要你一直在train总会收敛(rp问题跑飞了不算)。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题,你看下你的training set上的loss收敛了吗?如果只是validate set上不收敛那就说明overfitting了,这时候就要考虑各种anti-overfit的trick了,比如dropout,SGD,增大minibatch的数量,减少fc层的节点数量,momentum,finetune等。
2.learning rate设大了会带来跑飞(loss突然一直很大)的问题,这个是新手最常见的情况——为啥网络跑着跑着看着要收敛了结果突然飞了呢?可能性最大的原因是你用了relu作为激活函数的同时使用了softmax或者带有exp的函数做分类层的loss函数。当某一次训练传到最后一层的时候,某一节点激活过度(比如100),那么exp(100)=Inf,发生溢出,bp后所有的weight会变成NAN,然后从此之后weight就会一直保持NAN,于是loss就飞起来辣。会为了模拟这个情况,我复现了一下一年前我的一次失败的实验。我花了整个过程的loss曲线:
其中红色是loss,绿色是accuracy。可以看出在2300左右的时候跑飞了一次,不过所幸lr设的并不是非常大所以又拉了回来。如果lr设的过大会出现跑飞再也回不来的情况。这时候你停一下随便挑一个层的weights看一看,很有可能都是NAN了。对于这种情况建议用二分法尝试。0.1~0.0001.不同模型不同任务最优的lr都不一样。
3.尽量收集更多的数据。有个方法是爬flickr,找名人标签,然后稍微人工剔除一下就能收集一套不错的样本。其实收集样本不在于多而在于hard,比如你收集了40张基本姿态表情相同的同一个人的图片不如收集他的10张不同表情的图片。之前做过试验,50张variance大的图per person和300多张类似的图per person训练出来的模型后者就比前者高半个点。
4.尽量用小模型。如果数据太少尽量缩小模型复杂度。考虑减少层数或者减少kernel number。
=======================
看到这个问题的时候我正好在训练一个10,000 class face identify的网络,感觉很有缘所以小答一下。估计是运气好一次就收敛了~附accuracy的图(我是从random的googlenet开始train的,第100k次训练的时候做了finetune)。
深度学习之收敛问题