基于神经收集的项目瓶颈通常并非对收集的实现。有时候,在编辑了所有代码并实验了一大堆超参数配置之后,收集就是无法正常工作。尤其是面对着数百万的参数, 任何一个小变动都有大概前功尽弃。
在面对各种各样的题目后,有人总结了一些帮助调试神经收集的实用 tips,希望能够减少大家调试神经收集的成本。
反省梯度题目
有时梯度是引发题目的原因。下面是几种与梯度相关的调试方法:
数值计算每个权重的梯度。这通常被称为「梯度反省」,有助于保证正确计算梯度,其中一种方法是应用有限差分。
比较每个权重的巨细和梯度的巨细。要保证巨细的比率是合理的。如果梯度巨细远小于权重巨细,收集将花费很长时间进行训练。如果梯度巨细与权重巨细大致相同或更大,收集将非常不稳定,大概根本不会训练。
反省梯度爆炸或消散。如果梯度变为 0 或 nan/infinity,则可以确定收集没有被正确训练。需要首先弄清楚为什么会发生爆炸 / 消散梯度,是不是步数太大。一旦弄清楚梯度爆炸 / 消散的原因,就有各种解决方案来解决这个题目,例如添加残差连接以更好地传播梯度或简单地应用较小的收集。
激活函数也会导致梯度爆炸 / 消散。如果 sigmoid 激活函数的输入太大,梯度将非常接近 0。随着时间的推移反省激活函数的输入,然后保证这些输入不会导致梯度始终为 0 或很大。
反省训练过程
经常反省收集的训练进度可以节省时间。以训练贪吃蛇游戏为例,不是训练收集好几天,然后再反省收集是不是学到了什么,而是每十分钟用当前学到的权重运行游戏。几个小时后,如果我们注意到每次都在做同样的事情并且获得零奖励,就知道大概有题目了,而这节省了几天的训练时间。
不要依赖定额输入
如果只查看定额输入,我们大概会错过有用的调试信息。例如,在训练语音翻译收集时,比起只反省评价函数是不是在减少,更重要的是阅读翻译后的语音以保证它有意义;当训练一个用于图像识别的收集时,一定要保证手动反省收集提供的标签。
不应该依赖定额输入的原因有两个:首先,评价函数中大概存在故障。如果只查看故障评价函数输入的数字,大概需要数周时间才能意识到出现题目。其次,在神经收集输入中大概存在无法定额显示的故障模式。我们大概会意识到某个特定单词总是被故障翻译,或者在左上象限的图像识别收集总是故障的。这些观察结果反过来可以帮助找到数据处理部分的代码 bug,否则这些 bug 将被忽视。
实验小数据集
确定代码是不是存在 bug 或数据是不是难以训练的另一种方法是首先拟合较小的数据集,比如将数据集中 100000 个训练示例修剪成只有 100 个甚至 1 个训练示例。如果在一个训练示例的情况下,收集仍然有很高的测试故障,不能够非常好地拟合数据,那么几乎可以肯定收集代码有题目。
实验更简单的收集
如果全尺寸收集在训练时遇到题目,可以实验应用层数较少的较小收集,这样可以更快地训练。如果较小的收集在全尺寸收集失败的情况下成功了,则表明全尺寸模型的收集架构过于复杂。如果简单收集和全尺寸收集都失败,则代码中大概存在 bug。
试着应用框架
如果没有应用机器学习框架编辑神经收集的代码,那么可以通过在机器学习框架中编辑相同的收集架构来反省题目何在。然后将打印语句放入非框架版本和框架版本中逐层比较输入,直到找到打印语句出现差异的位置,即故障所在。如果在反向传播期间发生故障,则可以从最后一层开始逐层打印权重的渐变,直到找到差异。但是此方法仅适用于收集的第一次迭代,因为由于第一次迭代输入的差异,第二次及以后的迭代将具有不同的起点。
参考内容:https://towardsdatascience.com/debugging-tips-for-neural-networks-f7dc699d6845