总结看到的深度学习调参技巧

1.本的流程是否正确。对于小数据量,生成速度快,但是所有的脚本都是和未来大规模训练一致的。如果小数据量下,大网络奔着过拟合去都没效果,那么要开始反思模型的输入输出是不是有问题?要不要检查自己的代码(永远不要怀疑工具库)? 模型解决的问题定义是不是有问题?对应用场景的理解是不是有错?不要怀疑NN的能力,调参能遇到的问题,NN没法拟合的。

2.Loss设计要合理。一般来说分类就是Softmax,回归就是L2的loss。但是要注意loss的错误范围(主要是回归),如果预测一个label是10000的值,模型输出0,这loss多大。这还是单变量的情况下,一般结果都是nan。所以不仅仅输入要做normalization, 输出也要这么弄。多任务情况下,各loss想法限制在一个量级上,或者最终限制在一个量级上,初期可以着重一个任务的loss。

3. 观察loss胜于观察准确率。准确率虽然是评测指标,但是训练过程中还是要注意loss的。有些情况下,准确率是突变的,原来一直是0,可能保持上千迭代,然后突然变1。而loss是不会有这么诡异的情况发生的,毕竟优化目标是loss。给NN一点时间,要根据任务留给NN的学习一定空间。有些情况下就是前面一段时间看不出起色,然后开始稳定学习。

4. 确认分类网络学习充分。分类网络就是学习类别之间的界限,网络就是慢慢的从类别模糊到类别清晰的。看Softmax输出的概率的分布,如果是二分类,刚开始的网络预测都是在0.5上下,很模糊,随着学习过程,网络预测会慢慢的移动到0,1这种极值附近。所以,如果网络预测分布靠中间,再学习学习。

5. Learning Rate设置合理。

    <1>太大造成loss爆炸,或者nan

    <2>太小造成半天loss没反映(但是,LR需要降低的情况也是这样,这里可视化网络中间结果,不是weights,有效果,俩者可视化结果是不一样的,太小的话中间结果有点水波纹或者噪点的样子,因为filter学习太慢的原因,试过就会知道很明显)

    <3>需要进一步降低了:loss在当前LR下一路降了下来,但是半天不再降了。

    <4>如果有个复杂点的任务, 刚开始, 是需要人肉盯着调LR的. 后面熟悉这个任务网络学习的特性后, 可以扔一边跑去了。

    <5>如果上面的Loss设计那块没法合理,初始情况下容易爆,先上一个小LR保证不爆,等loss降下来了,再慢慢升LR,之后当然还会慢慢再降LR。
    <6>LR在可以工作的最大值下往小收一收,免得ReLU把神经元弄死了。

6.对比训练集和验证集的loss。判断过拟合,训练是否足够,是否需要early stop的依据。

7.清楚receptive field的大小。CV的任务,context window是很重要的。所以对模型的receptive field的大小要心中有数,这个对效果的影响还是很显著的,特别是用FCN,大目标需要很大的receptive field。不像有fully connection的网络,好歹有个fc兜底,全局信息都有。

8.预处理: -mean/std zero-center就够了,PCA、白化什么的都用不上。

9.一定要shuffle。

10.一定要Dropout(不仅仅可以防止过拟合,其实这相当于做人力成本最低的Ensemble,当然,训练起来会比没有Dropout的要慢一点)。

11.CV领域无脑用ReLU。

12.无脑用xavier。

13.LRN一类的,其实可以不用。不行可以再拿来试试看。

14.filter数量2^n。

15.多尺度的图片输入(或者网络内部利用多尺度下的结果)有很好的提升效果.

16.第一层的filter, 数量不要太少. 否则根本学不出来(底层特征很重要).

17.sgd adam 这些选择上看个人选择,一般对网络不是决定性的。

18.batch normalization。

19.不要完全相信论文里面的东西。结构什么的觉得可能有效果,可以拿去试试。

20.有95%概率不会使用超过40层的模型。

21.shortcut的联接是有作用的.

22.Google的inception论文,结构要好好看看。

23.网络初始化方法有:常量初始化(constant)、高斯分布初始化(gaussian)、positive_unitball初始化、均匀分布初始化(uniform)、xavier初始化、msra初始化、双线性初始化(bilinear)。xavier、msra对ReLU网络效果较好。

猜你喜欢

转载自blog.csdn.net/Lyteins/article/details/80472373
今日推荐