调试神经网络的注意事项和技巧总结(一)

时间:2024-04-13 09:16:39

最近在调试神经网络的过程中,遇到了网络不收敛的情况,查阅了很多的相关的资料,根据相关的建议,作出了一些实验,来进行调试,下面这几点是我遇到的几个坑:
1.数据预处理
2. 数据规范化
3.正则化
4.batch size
5.使用了不适当的学习率
6.在最后一层使用了错误的**函数
7.网络含有不良梯度
8.尝试不同的优化器
9.及时检查结果

首先,对于一个神经网络来说,我们在进行建模的时候,数据是十分重要的,通常情况下,我们在进行解决问题的时候,最开始拿到的数据一般会比较“脏”,这时候,我们需要做数据预处理的工作,否则,如果没有好的数据集,很大的可能性会使我们的神经网络不work,而且,之后我们的设计网络以及调参的工作可能会白做。
1、对于数据来说,我们在做预处理的工作的时候,是主要分为数据清洗、数据集成、数据变换和数据规约这四个方面的。下面会分别进行介绍:
1)数据清洗
在进行数据清洗的时候,我们一般首先需要对我们的数据的总体的情况有一定的了解,而数据清洗又分为,有监督的清洗和无监督的清洗,我们在进行这项工作的时候,一般是先进行无监督的清洗,然后由领域专家来进行有监督的数据清洗,而数据清洗主要是包括数据分析,定义和执行清洗规则,清洗结果验证等步骤;在下面的这个的博客中,有详细的介绍,大家可以进行参考:
参考文献:http://blog.****.net/power0405hf/article/details/49644041
2)数据集成
相对来说是比较好理解的,它实际上就是将多个数据源中的数据结合起来并统一存储。
3)数据变换
在进行数据变换的时候,主要是包括规范化,归一化以及标准化等。
4)数据规约(参考文献:https://www.cnblogs.com/Hailong-Said/p/4918547.html)
(1)维归约
删除不相关的属性(维)来减少数据量。
找出最小属性集合,使得数据类的概率分布尽可能地接近使用所有属性的原分布,一般可以通过贪心算法,逐步向前选择,逐步后向删除,向前选择和后向删除相结合,判定树归纳
(2)数据压缩
主成分分析PCA,LDA,SVD
小波变换:将数据向量D转换成为数值上不同的小波系数的向量D’,对D’进行剪裁,保留小波系数最强的部分
(3)数值归约
回归和对数线形模型、线形回归、对数线形模型、直方图、等宽、等深、V-最优、maxDiff、聚类、多维索引树 : 对于给定的数据集合,索引树动态的划分多维空间。
2、数据规范化
对于神经网络来说,我们在进行输入数据的时候,一般是需要将数据进行规范到-1到1之间的,尤其是在处理图片的时候,是十分重要的,如果是没有进行规范化,对于255的图片来说,这将会产生巨大的梯度,你的训练误差很可能会爆表。这时候也需要注意,在进行选择**函数的时候,要选择相同范围的**函数来进行建模。
在进行规范到-1到1之间的时候,我们可以采取从数据中减去平均值,然后再除以标准差的操作。例如对于一个255的图片来说,可以除以128然后减去1。
3、正则化
在进行正则化的时候,方法也是比较多的,我们最常用的方式就是使用dropout的方式来进行,这么做的好处是,我们选择一定的比例的神经元来进行建模,使网络的结构的复杂度降低,这时候,就可以减少果农和的情况的发生。
4、batch size
这里主要是参考了知乎上的一个回答,作者做了相关的实验,得到了相关的实验的结果,参考文献:https://www.zhihu.com/question/32673260/answer/71137399
调试神经网络的注意事项和技巧总结(一)

下面是我做的相关的实验的结果:
这个是batch size512 epoch为18 的结果
调试神经网络的注意事项和技巧总结(一)
这个是batch size64 epoch为4的结果
调试神经网络的注意事项和技巧总结(一)
可以明显的看出,在进行训练的时候对于batch size为512的时候,epoch的轮数需要明显增多才能够达到类似的效果。
5、学习率
下面这个图是在某个博客上找的,忘记是哪个博客了,抱歉,如有侵权请联系我
调试神经网络的注意事项和技巧总结(一)
从图片中,我们可以发现,在进行训练的时候如果是选取比较高的学习率的话,会出现loss值先下降然后再上升的情况,这时候,我们是需要调低learning rate的,但是,如果是learning rate太低的话,训练的速度是会大大降低的。所以,我们需要不断的尝试,找到一个合适的learning rate。下面是我坐的一些实验:
learning rate0.1
调试神经网络的注意事项和技巧总结(一)
epoch 8
调试神经网络的注意事项和技巧总结(一)
learning rate 0.0002调试神经网络的注意事项和技巧总结(一)
epoch 8
调试神经网络的注意事项和技巧总结(一)
对于0.1的情况,之后数据就会变成高频噪声,而且loss值也会明显上涨,对于0.0002的情况,是比较理想的情况。
6.检查**函数
对于神经网络来说,**函数的作用是很重要的,在最后一层中,不合理的**函数有时会导致你的网络无法输出所需值的全部范围。
**函数主要是分为以下几种:
sigmoid tanh

调试神经网络的注意事项和技巧总结(一)
sigmoid(x)=1/(1+e-x)
tanh(x)=sinh(x)/cosh(x),sinh(x)= (ex-e-x)/2,cosh(x) = (ex+e-x)/2
Relu
调试神经网络的注意事项和技巧总结(一)
max(0,x)=0(if x<0),x(if x>0)
LeakRelu
调试神经网络的注意事项和技巧总结(一)
Leak Relu是对Relu的改进,当输入值小于0时,输出值为αx,其中α是一个很小的常数。
7、网络有不良的梯度
使用ReLU**函数的深度神经网络通常可能遭受由不良梯度引起的所谓“死神经元”。这可能会对网络的性能产生负面影响,或者在某些情况下导致完全无法训练。
如果发现在epoch到epoch之间,你的训练误差不会变化,就可能是由于ReLU**函数导致了所有的神经元已经死亡。
换一个**函数试试,比如leaky ReLU或ELU,看看是不是还会发生同样的情况。
8、尝试使用不同的优化器
优化器的选择不应当妨碍网络的训练,除非你选择了一个特别糟糕的参数。但是,为任务选择一个合适的优化器非常有助于在最短的时间内获得最多的训练。(参考文献:《37 Reasons why your Neural Network is not working》)
最常用的优化器有SGD、Adam等几十种,这两种是我在训练的时候最常用的,下面是做过的一个实验的对比,但是在进行选择的时候,还是需要考虑具体的实际情况来进行确定使用什么优化器
调试神经网络的注意事项和技巧总结(一)
epoch 25 使用SGD
调试神经网络的注意事项和技巧总结(一)
epoch 25 使用Adam
9、及时检查结果
敲黑板!这一点是十分重要的,在做相关的工作的时候,及时的可视化和检查结果是十分必要的,有助于帮助我们及时的检查自己的结果是否在朝着好的方向发展,这时候,我们也可以借助loss、accuary、precission、混淆矩阵等方式来帮助我们进行检查。

未完。。。待续~