调参经验

1. 假设一次训练有10个epoch,可能会出现以下情况:训练好一次模型去测试,测试的准确率为0.92。又去训练一次模型(不是在之前训练模型的基础上,而是单独进行一次训练),模型训练好去测试,测试准确率为0.93或者0.89。如果我改变一个模型的参数,比如调小dropout的值,可能训练出来的模型去测试准确率为0.94,这不能就得出调小dropout就能很明显提升模型的效果。因为单独训练一次模型,也可能达到这个效果。造成这种情况出现的原因就是数据量太小,数据量小,可能两次训练的模型去测试的准确率变化比较大。如果数据量大,两次训练的模型去测试准确率变化可能在0.0000几或者0.000几,但改变参数可能就是0.00几,这样就很容易看出调整参数是否能提高准确率了。解决方法就是可以在不改变参数前多训练几次,一般会在一个范围波动,改变参数也多训练几次,这样如果整个范围相较于之前都升高就表明调参确实提高了准确率。

2.   learning rate影响的是

3.高学习率有利于加快迭代更新的速度,但不利于找到局部/全局最优点;低学习率有利于找到局部最优点,但可能使得模型无法跳出局部最优而无法获取全局最优;一般先利用较大的学习率寻找全局近似最优,再利用较小的学习率寻找局部最优,以期望获取模型的全局最优解。实际中,使用验证集是获得合适LR的有效手段。开始训练时,LR通常设为0.1(这个值有待验证)。在实践中,当你观察到在验证集上的loss或者准确率不在变化时,将LR除以2或5后继续跑。

4.关于学习率的大小

  * 太大: loss爆炸, 或者nan
  * 太小: 半天loss没反映(但是, LR需要降低的情况也是这样, 这里可视化网络中间结果, 不是weights, 有效果, 俩者可视化结果是不一样的, 太小的话中间结果有点水波纹或者噪点的样子, 因为filter学习太慢  的原因, 试过就会知道很明显)
  * 需要进一步降低了: loss在当前LR下一路降了下来, 但是半天不再降了.

5.数据库太小一般不会带来不收敛的问题,只要你一直在train总会收敛(rp问题跑飞了不算)。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题,你看下你的training set上的loss收敛了吗?如果只是validate set上不收敛那就说明overfitting了,这时候就要考虑各种anti-overfit的trick了,如dropout,SGD,增大minibatch的数量,减少fc层的节点数量,momentun, finetune等。(我自己觉得,train不是一定收敛的,但样本信息量太大导致网络不足以fit住整个样本空间是造成不收敛的一种情况)

   learning rate设大了会带来跑飞(loss突然一直很大)的问题,这个是新手最常见的情况——为啥网络跑着跑着看着要收敛了结果突然飞了呢?可能性最大的原因是你用了relu作为激活函数的同时使用了softmax或者带有exp的函数做分类层的loss函数。当某一次训练传到最后一层的时候,某一节点激活过度(比如100),那么exp(100)=Inf,发生溢出,bp后所有的weight会变成NAN,然后从此之后weight就会一直保持NAN,于是loss就飞起来。

5.

原文地址:https://www.cnblogs.com/ymjyqsx/p/6433104.html