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"的权重初始化几乎在所有情况下表现良好。当你 的神经网络正常后,
10. 过深的网络
11.隐藏单元数量错误