如何验证神经网络的实现是否正常工作?

机器算法验证 神经网络 深度学习 软件
2022-03-04 08:36:46

我想知道有哪些有用的技术可以检查神经网络的实现是否正常工作。

以下是我知道的一些检查,我有兴趣了解更多:

  1. 在训练/测试/有效集上针对批次或时期数绘制一些指标(F1 分数、准确性、一些成本等)。
  2. 查看跨时代矩阵权重的演变。
  3. 在多层的情况下,删除一些层,看看它是否仍然学到一些东西。
  4. 在一些它应该能够学习的数据集上使用网络(尽管我不知道有任何好的参考数据集列表来测试神经网络实现,这将是一个有价值的资源,比在文献中寻找参考点更快.)
  5. 执行梯度检查
  6. 检查渐变是否爆炸或消失。

一些图例说明了先前的检查:

  1. 绘制 train/test/valid set vs epoch number:

好(虽然很快过拟合,但至少网络能够学习):

在此处输入图像描述

坏的:

在此处输入图像描述

  1. 查看跨时代矩阵权重的演变:

纪元 0:

在此处输入图像描述

50 纪元:

在此处输入图像描述

很难说权重矩阵的变化是好是坏(不看成本),但至少大部分都发生了变化,并且没有卡在0。

2个回答

首先,我想说的是,在神经网络的背景下,实现是一个可疑的词(根据我的说法)。我猜您列出了大多数方法,但这是我最近进行测试的方式。

第一种解释是一些源代码中的实际实现。在这种情况下,我认为测试这部分的最重要的方法是:

  1. 检查基本操作是否正确。特别是在使用矩阵运算时,您可能已经注意到*实际上是逐元素乘法而不是点积,或者您的维度不匹配。
  2. 执行梯度检查。我喜欢为多个衍生品做这件事。它从激活函数的导数和成本函数 wrt 权重的总导数开始。如果那里有问题,您可以将其应用于衍生 wrt 输入(这应该是关于偏差的更新)或输出(后续层中的误差加权和)
  3. 我也喜欢创建人工的、琐碎的学习任务。例如,对于一个完全连接的网络,我让一个单层网络学习输入的总和,或者我知道权重应该是什么的任何东西。对于多层网络,这有点困难,但你可以做类似的事情而不期望某些权重。这实际上与使用一些参考数据集的想法相同。

实现神经网络的第二种解释可能是超参数的选择。这些超参数中最重要的可能是学习率。您提到了一些在我看来属于选择正确超参数的技术。

  1. 将您的目标绘制为训练/有效/测试数据的时期的函数是通过比较训练/测试/有效错误来了解您的网络是否过度拟合/欠拟合的好方法。在过度拟合的情况下,您可以减少层数/神经元的数量,在拟合不足的情况下,您可以添加一些。如果您似乎没有学到任何东西,这可能是由于学习率太高(尝试从 1 开始以 2 步最小化二次函数)。
  2. 如果您遇到梯度爆炸或消失的问题,您可能需要不同的激活函数或不同的学习率。

我不认为看重量有什么用。在 CNN 的情况下,它有助于判断您正在学习哪种内核,或者您是否实施了某种形式的权重衰减,您确实希望将某些权重强制为零。

它可能不会增加你已经知道的东西,我在这里忘记了很多,但这将是我的答案,因为它的价值......

您还可以绘制学习曲线(参见下面链接中的第 3.3 节),即误差(训练误差和交叉验证误差)与训练集大小的关系。从学习曲线中,您将知道您的模型是否存在高偏差或高方差。

http://www.astroml.org/sklearn_tutorial/practical.html