【问题标题】:how to judge a neural network?如何判断一个神经网络?
【发布时间】:2017-05-23 08:37:55
【问题描述】:

我写了一个神经网络, 它主要基于 James McCaffrey https://visualstudiomagazine.com/articles/2015/04/01/back-propagation-using-c.aspx 的神经网络(已修复错误)我遇到了各种 Git 项目和书籍,使用他的代码 当他为 MS 研究工作时,我认为他的工作会很好,也许不是最重要的(它不是在 cuda 之上运行),但我可以阅读它的代码,尽管我不喜欢它。他的样本处理的数据集与我的问题非常相似。

我的目标是解决一些图像分类问题(基于像素信息的数据集) 这个问题不容易重现,但我设法创建了一个包含 50 个好的场景和 50 个坏的场景的数据集。当在散点图中绘制测量值时,两组都有很多模糊的边界重叠。我自己无法从中做出什么,这对我来说太模糊了。由于每个样本有 5 个输入,我想知道神经网络是否能够找到内部关系并解决我的模糊数据分类问题。

而且它确实做到了.. 好吧,我猜。
取决于权重的播种(我达到了 80%)、节点的数量和学习的时间;我的训练分数在 90% 到 85% 左右,最近是 95%

首先我使用了权重的随机初始化。 然后我玩了节点的数量。 我玩的是学习率、动量和重量衰减。 他们从(得分 85 到 90%):

// as in the example code i used
int maxEpochs = 100000;
double learnRate = 0.05;
double momentum = 0.01;
double weightDecay = 0.0001;

到(得分 95%)

int maxEpochs = 100000;
double learnRate = 0.02;  //had a huge effect
double momentum = 0.01;
double weightDecay = 0.001; //had a huge effect

与更改网络的随机初始化和更改上述常量相比,节点数量的影响较小,这让我有点惊讶。

然而这让我感到好奇。

  • 一般来说,95% 是高分吗? (不确定限制在哪里,但我认为这也取决于数据集,虽然我对 95% 感到惊讶,但我想知道是否可以将其调整到 97%。
  • 隐藏节点的数量,我应该尽量减少它们吗? 目前它是 5:9:3,但我曾经使用 5:6:3 的网络获得过类似的分数。
  • 神经网络通过改变初始随机种子权重(不同的起始种子)来获得模型而产生很大的评分影响是否正常;因为我认为训练会克服开始的情况。

【问题讨论】:

    标签: machine-learning neural-network backpropagation


    【解决方案1】:

    首先,抱歉,如果我没有正确理解,但看起来您有 100 个训练示例并且没有验证/测试集。这对于训练集来说相当小,这使得 NN 很容易对其进行过度训练。你似乎也选择了一个小的NN,所以也许你实际上并没有过拟合。最好的检查方法是拥有一个测试集。

    关于你的问题:

    • 什么是“好分数”完全取决于您的问题。例如,在 MNIST(广泛使用的数字识别数据集)上,这将被认为是非常糟糕的,最好的分数在 99.7% 以上(使用 ConvNet 获得 99% 并不难),但在 ImageNet 上,这将是非常棒的.了解自己是否优秀的一个好方法是以某种方式与人类的表现进行比较。到达它通常很难,所以稍微低于它是好的,高于它是很好的,远低于它是坏的。同样,这是主观的,取决于您的问题。

    • 您应该明确地尝试最小化隐藏节点的数量,遵循 Occam 的 rasor 规则:在几种模型中,最简单的是最好的。它有两个主要优点:运行速度更快,泛化效果更好(如果两个模型在您的训练集上表现相似,那么最简单的模型最有可能在新的测试集上表现更好)。

    • 已知初始化会极大地改变结果。然而,最大的区别在于不同的初始化方法:常量/简单随机(广泛使用,通常(截断)正态分布)/更聪明的随机(例如 Xavier 初始化)/“更聪明”的初始化(预先计算的特征等) . 更难使用)。在以完全相同的方式生成的两个随机初始化之间,性能差异应该不会那么大。我的猜测是,在某些情况下,您只是没有训练足够长的时间(正确训练所需的时间可能会因初始化而发生很大变化)。我的另一个猜测是,您的数据集和网络规模较小,使得评估比通常更依赖于初始权重。

    学习率和权重衰减对结果的影响很大是正常的,但是有效地找到最佳值可能很困难。

    【讨论】:

    • 实际上代码从训练集中生成了一个验证集,80% 训练和 20% 验证(通过随机分离),我应该提到它。如果集合太小,我会尝试自动收集数据,这样我就可以更轻松地生成更大的训练集。我不确定数据集应该有多大,你提到“过度拟合”,我想你指的是神经网络不应该记住(ea 包含)数据,而是应该处理/排序数据。那么是否有一些关于节点数量的拇指规则?或者抓住数据集,如何克服过度拟合?
    • 恐怕没有明确的规则可以避免过拟合。无论如何,您应该避免使用比不同输入字节(n_samples * size_of_a_sample)更多的变量,但它可能在此之前发生。但是,如果您的训练准确度比您的验证/测试准确度好得多(它几乎总是会好一点),您就可以发现它。您可以通过使用一些正则化技术来避免它:批量归一化、L1 或 L2 损失正则化、dropout 等;但在某些时候,您必须减小网络大小以防止它发生。
    • 至于数据集,越大越好,这在很大程度上取决于你的问题,以及你的神经网络大小......但我的意思是“你的数据集和网络的小规模使评估更依赖于初始权重”不仅是 网络 比通常更多地依赖于初始化,而且还在于 评估 本身:在如此少的测试样本上,方差任何评价都很高,所以即使非常相似的NN也会给出不同的评价结果​​(就像100人的调查是非常不准确的)
    • 我只是在某个地方发红,平方根(输入节点 x 输出节点)作为一般规则应该足够了..在我目前的情况下只有 4,令人惊讶的是我仍然得到 95%.. 但是我会将编码时间用于数据集检索。你怎么看这样的规则 sqrt(input*output)=hidden nodes
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2021-02-07
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2018-02-19
    • 2017-09-30
    • 2020-12-28
    相关资源
    最近更新 更多