做起点说网站的服务器多少钱,网站建设公司经营范围,中国主流媒体平台有哪些,wordpress标签云怎么添加在面对模型不收敛的时候#xff0c;首先要保证训练的次数够多。在训练过程中#xff0c;loss并不是一直在下降#xff0c;准确率一直在提升的#xff0c;会有一些震荡存在。只要总体趋势是在收敛就行。若训练次数够多#xff08;一般上千次#xff0c;上万次#xff0c;…
在面对模型不收敛的时候首先要保证训练的次数够多。在训练过程中loss并不是一直在下降准确率一直在提升的会有一些震荡存在。只要总体趋势是在收敛就行。若训练次数够多一般上千次上万次或者几十个epoch没收敛再考虑采取措施解决。
一、数据与标签
没有对数据进行预处理。数据分类标注是否准确数据是否干净没有对数据进行归一化。由于不同评价指标往往具有不同的量纲和量纲单位这样的情况会影响到数据分析的结果为了消除指标之间的量纲影响需要进行数据标准化处理以解决数据指标之间的可比性。原始数据经过数据标准化处理后各指标处于同一数量级适合进行综合对比评价。此外大部分神经网络流程都假设输入输出是在0附近的分布从权值初始化到激活函数、从训练到训练网络的优化算法。将数据减去均值并除去方差。样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题你看下你的training set上的loss收敛了吗如果只是validate set上不收敛那就说明overfitting了这时候就要考虑各种anti-overfit的trick了比如dropoutSGD增大minibatch的数量减少fc层的节点数量momentumfinetune等。标签的设置是否正确。
二、模型
网络设定不合理。如果做很复杂的分类任务却只用了很浅的网络可能会导致训练难以收敛。应当选择合适的网络或者尝试加深当前网络。总体来说网络不是越深越好开始可以搭建一个3~8层的网络当这个网络实现的不错时你可以考虑实验更深的网络来提升精确度。从小网络开始训练意味着更快并且可以设置不同参数观察对网络的影响而不是简单的堆叠更多层。Learning rate不合适如果太大会造成不收敛如果太小会造成收敛速度非常慢。学习率设定不合理。在自己训练新网络时可以从0.1开始尝试如果loss不下降的意思那就降低除以10用0.01尝试一般来说0.01会收敛不行的话就用0.001. 学习率设置过大很容易震荡。不过刚刚开始不建议把学习率设置过小尤其是在训练的开始阶段。在开始阶段我们不能把学习率设置的太低否则loss不会收敛。我的做法是逐渐尝试从0.1,0.08,0.06,0.05 …逐渐减小直到正常为止。有的时候候学习率太低走不出低估把冲量提高也是一种方法适当提高mini-batch值使其波动不大。learning rate设大了会带来跑飞loss突然一直很大的问题。这个是新手最常见的情况——为啥网络跑着跑着看着要收敛了结果突然飞了呢可能性最大的原因是你用了relu作为激活函数的同时使用了softmax或者带有exp的函数做分类层的loss函数。当某一次训练传到最后一层的时候某一节点激活过度比如100那么exp(100)Inf发生溢出bp后所有的weight会变成NAN然后从此之后weight就会一直保持NAN于是loss就飞起来辣。如果lr设的过大会出现跑飞再也回不来的情况。这时候你停一下随便挑一个层的weights看一看很有可能都是NAN了。对于这种情况建议用二分法尝试。0.1~0.0001.不同模型不同任务最优的lr都不一样。隐层神经元数量错误。在一些情况下使用过多或过少的神经元数量都会使得网络很难训练。太少的神经元数量没有能力来表达任务而太多的神经元数量会导致训练缓慢并且网络很难清除一些噪声。隐层神经元数量可以从256 到1024中间开始设置然后可以看看研究人员使用的数字可以用作参考。如果他们使用的数字与这个大不相同那么可以想象一下这其中的原理。在决定使用隐层的单元数量之前最为关键的是考虑你需要通过这个网络表达信息的实际值的最少数量然后再慢慢增加这个数字。如果你做回归任务可以考虑使用的神经元数量为输入或输出变量的2到3倍。实际上与其它因素相比隐藏单元的数量通常对于神经网络的性能影响相当小。并且在很多情况下增大所需要隐藏单元的数量仅仅是减慢了训练速度。错误初始化网络参数。如果没有正确初始化网络权重那么网络将不能训练。通常使用的比较多的初始化权重的方法有‘he’,’lecun’,’xavier’在实际应用中这些方法有非常好的性能而网络偏差通常初始化为0你可以选择一个最适合你任务的初始化方式。没有正则化。正则化典型的就是dropout、加噪声等。即使数据量很大或者你觉得网络不可能出现过拟合但是对网络进行正则化还是很有必要的。dropout 通常从设定参数为0.75或0.9开始根据你认为网络出现过拟合的可能性来调整这个参数。另外如果你确定这个网络不会出现过拟合那么可以将参数设定为0.99。正则化不仅仅可以防止过拟合并且在这个随机过程中能够加快训练速度以及帮助处理数据中的异常值并防止网络的极端权重配置。对数据扩增也能够实现正则化的效果最好的避免过拟合的方法就是有大量的训练数据。Batch Size 过大。Batch size 设置的过大会降低网络的准确度因为它降低了梯度下降的随机性。另外在相同情况下batch size 越大那么要达到相同的精确度通常需要训练更多的epoch。我们可以尝试一些较小的batch size 如 16 8 甚至是1。使用较小的batch size 那么一个epoch就可以进行更多次的权值更新。这里有两个好处第一可以跳出局部最小点。其二可以表现出更好的泛化性能。学习率设的不对。许多深度学习的框架默认开启了gradient clipping ,这个可以处理gradient explosion问题这个是非常有用的但是在默认情况下它也很难找到最佳学习率。如果你正确的清理了数据删除了异常值以及设定了正确的学习率那么可以不需要使用gradient clipping偶尔你也会遇到gradient explosion问题那么你可以开启gradient clipping。但是出现这种问题一般情况下表明数据有其它问题而gradient clipping只是一个临时的解决方案。最后一层的激活函数用的不对。在最后一层使用错误的激活函数会导致网络最终不能输出你期望的范围值最常见的错误就是最后一层使用Relu函数其输出无负值。如果是做回归任务大多数情况下不需要使用激活函数除非你知道你所期望的值作为输出。想象一下你的数据值实际代表了什么以及再归一化之后它们的范围是多少最有可能的情况是输出没有边界的正数和负数。在这种情况下最后一层不应该使用激活函数。如果你的输出值只能在某个范围内有意义如0~1范围内的概率组成。那么最后一层可以使用sigmoid函数。网络存在坏梯度。如果你训练了几个epoch误差没有改变,那可能是你使用了Relu可以尝试将激活函数换成leaky Relu。因为Relu激活函数对正值的梯度为1负值的梯度为0。因此会出现某些网络权值的成本函数的斜率为0在这种情况下我们说网络是“dead”,因为网络已经不能更新。
如何通过train loss与test loss分析网络当下的状况
train loss 不断下降test loss不断下降说明网络仍在学习;
train loss 不断下降test loss趋于不变说明网络过拟合;
train loss 趋于不变test loss不断下降说明数据集100%有问题;
train loss 趋于不变test loss趋于不变说明学习遇到瓶颈需要减小学习率或批量数目;
train loss 不断上升test loss不断上升说明网络结构设计不当训练超参数设置不当数据集经过清洗等问题。