在本文中,我们将了解是什么导致神经网络表现不佳,以及我们可以通过可视化梯度和与模型训练相关的其他参数来调试此问题的方法。我们还将讨论梯度消失和梯度爆炸的问题以及克服这些问题的方法。
最后,我们将了解适当的权重初始化为何有用,如何正确进行初始化,并深入研究 dropout 和批量归一化等正则化方法如何影响模型性能。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割
1、神经网络的Bug从何而来?
神经网络的错误很难发现,因为:
- 代码永远不会崩溃、引发异常,甚至不会变慢。
- 网络仍在训练,损失仍会下降。
- 值在几个小时后收敛,但结果非常糟糕
如果想更深入地研究这个主题,那么我强烈建议你阅读 Andrej Karparthy 的神经网络训练秘诀。
那么我们如何才能更好地调试我们的神经网络?
在调试神经网络时,没有要遵循的决定性步骤。但这里有一个概念列表,如果正确实施,可以帮助调试你的神经网络。
2、调试模型输入
我们必须了解数据的细微差别 - 数据的类型、存储方式、目标和特征的类别平衡、数据的值尺度一致性等。
数据预处理
我们必须考虑数据预处理并尝试将领域知识融入其中。通常有两种情况会使用数据预处理:
- 数据清理:如果删除数据的某些部分(称为伪影),则可以轻松实现目标任务。
- 数据增强:当我们的训练数据有限时,我们会以多种方式转换每个数据样本以用于训练模型(例如,缩放、移动和旋转图像)。
这篇文章不关注由不良数据预处理引起的问题。
小数据集过拟合问题。
如果我们有一个包含 50-60 个数据样本的小型数据集,模型将很快过度拟合,即损失将在 2-5 个时期内为零。为了克服这个问题,一定要从模型中删除任何正则化。
如果你的模型没有过拟合,可能是因为你的模型架构不正确,或者你的损失选择不正确。也许当你试图进行多类分类时,你的输出层被激活为 sigmoid。这些错误很容易被忽略,从而导致错误。查看我的笔记本,其中演示了这一点。
那么如何避免这样的错误呢?继续阅读。
3、调试模型架构
从小型架构开始
使用花哨的正则化器和调度器可能有点过头了。如果出现错误,调试小型网络会更容易。常见错误包括忘记将张量从一层传递到另一层、