神经网络不收敛的原因
没有对数据进行归一化
忘记检查输入和输出
没有对数据进行预处理
没有对数据正则化
使用过大的样本
使用不正确的学习率
在输出层使用错误的激活函数
网络中包含坏梯度
初始化权重错误
过深的网络
隐藏单元数量错误
1、没有对数据进行归一化
问题描述:
在使用神经网络之前,对数据进行归一化十分重要。在深度学习社区,这一步通常众所周知,因此它很少在论文中提及,这导致初学者很容易在这方面犯错。因为一旦你没有谨慎和正确的对数据进行归一化,你的神经网络很可能无法运行(收敛)。
原理:
这是由于不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。
此外,大部分神经网络流程都假设输入输出是在0附近的分布,从权值初始化到激活函数、从训练到训练网络的优化算法。
解决办法:
通常归一化的是指将数据减去均值并除去方差,这是对每个输出和输入数据都要处理的。也可以对部分数据进行归一化处理。
2、忘记检查输入和输出
问题描述:
假设你已经训练了多个周期,同时损失函数相比最初也有了明显的变小,但往往这并不意味着训练工作的完成。在你的代码中,在数据预处理、训练代码等都有可能出现错误,而损失函数的下降并不意味着网络学习到了有用的东西
原理:
这是由于与传统的编程不同,机器学习对于某些错误不能够及时有效的反馈错误信息,以便我们回过头来对代码BUG进行检查。
解决办法:
通常,你需要找到一些可视化结果的工具。例如对于动画和图片,这步显得较为轻松。但如果是其他格式的数据,你需要找到检查结果的方法,从而与监督数据进行对比,以便确保神经网络正常运行。
3、没有对数据进行预处理
问题描述:
大多数数据通常结构复杂,以角色动画为例:假使我们使用角色关节的中心坐标来捕捉运动,那么当角色向某个方向执行动作时,相对于不同位置,不同方向执行同一动作,可能会产生大量不同的数值形式。那么我们需要以不同的方式表示数据,例如建立局部参考坐标,以便相似的动作有近乎类似的数值形式。
原理:
对于输入数据来说,假如数据所处空间是连续的。那么两组相似的输入数据至少应有一些交集。假如数据空间中存在较大的不连续性、大量需要变换分离数据都可能使学习任务变得困难。
解决办法:
思考数据的特征,是否有简单的变换、是否可以用相似的数值表示、是否有局部的坐标系统或更好的色彩空间。
4、没有对数据正则化
问题描述:
正则化通常以dropout层、添加噪声、或网络随机过程的某种形式进行。是训练神经网络另一个必不可少的关键。即使你拥有比参数多得多的数据量、或过拟合可以被允许的情况下、甚至对没有出现过拟合的网络,你仍然需要添加dropout或其他形式的噪声。
解决办法:
正则化的基本方法是在网络层之间添加dropout,设置从中到高的训练概率。例如0.75或0.9。如果你仍然认为不太可能出现过拟合,可以将此参数设置为较高的值例如0.99。
5、使用过大的样本
问题描述:
使用太大的训练样本可能会对网络在训练过程中的准确性造成负面影响,这是由于大样本会破坏梯度下降的随机性。
原理:
使用小样本与更为随机的权重。这样做有两大好处。首先,这样可以帮助训练跳出鞍点。其次,可以使训练在更为平缓的局部最小值停止。一般而言,后者具备更好的泛化性能。
解决方法:
尽可能小的缩减你的样本尺寸。在训练时可以最大化利用GPU并行性。此外更大的样本需要更多训练周期才能达到相同的准确度。最好使用较小的样本(16、8、1)。
6、学习率不正确
问题描述:
学习率会对训练结果产生很大影响。
原理:
很多深度学习框架会启用梯度裁剪(Clipping Gradient)。这可以防止训练过程中出现的梯度爆炸。它会在每一步中强制改变权重,让权重发生最大限度的改变。这在数据中含有大量异常时尤为有效。但是,开启这个选项也会让用户难以手动找到最佳的学习率。大多数用户由于梯度裁剪将学习率设置的过高,使整体训练行为变慢、也使结果不可预测。
解决办法:
关掉梯度裁剪。找到不会发生错误的最高学习率,并稍稍降低一些数值。这将十分靠近最佳学习率。
7、在输出层使用错误的激活函数
问题描述:
在最后一层使用激活函数时,无法产生所需全部范围的值。假使你使用Relu这类限制范围的函数,神经网络便只会训练得到正值。
原理:
如果你的输出值只在特定的范围有意义,例如0-1。那么最终应使用特定的激活函数例如Sigmoid。但如果你的输出为不限制范围的正数或复数,则不应在最终层使用激活函数。
解决办法:
如果你的目的是回归而不是分类,那么绝大多数时候你不应该在最后一层使用激活函数。其他视情况而定。
8、网络有坏的梯度
问题描述:
使用ReLU激活函数的网络通常会受到“坏死神经”的影响。后者是由于不良梯度的影响。这可能会对网络的性能造成影响。甚至会使整个神经网络瘫痪。
原理:
ReLU激活函数的梯度在正值为1,负值为0。当输入小于0时,输入的微弱变化并不会对输出造成影响,短期看,由于正值的大梯度这并不会成为问题。但由于多层神经网络的叠加,其他层的负值权重会对梯度很大的正值变为梯度为0的负值。因此,一些隐藏单元会对最后的函数造成坏的梯度,从而导致权重无法更新,影响整个神经网络。
解决办法:
如果你发现多个训练周期以后损失函数都没有收敛,那么可能是由于ReLU激活函数造成的。尝试切换到leaky ReLU或ELU。然后再看看问题是否解决。
9、没有正确初始化权重
问题描述:
如果你没有正确初始化神经网络的权重,那么神经网络便无法正常工作。
解决办法:
"lecun"或"xavier"的权重初始化几乎在所有情况下表现良好。当你的神经网络正常后,
使用过大的样本
使用不正确的学习率
在输出层使用错误的激活函数
网络中包含坏梯度
初始化权重错误
过深的网络
隐藏单元数量错误