我编写了一个神经网络,主要是基于James McCaffrey的代码(修复了一些bug),他的神经网络代码可以在https://visualstudiomagazine.com/articles/2015/04/01/back-propagation-using-c.aspx找到。我查看了各种Git项目和书籍,这些都使用了他的代码。由于他曾在微软研究院工作,我认为他的工作应该不错,尽管可能不是顶尖的(比如没有运行在CUDA上),但至少是我能读懂的代码,虽然我不太懂其中的科学原理。他的示例在与我的问题相似的数据集上运行得很好。
我的目标是解决一些图像分类问题(基于像素信息的数据集)。这个问题的重现并不容易,但我设法创建了一个包含50个好场景和50个坏场景的数据集。当我在散点图上绘制这些测量数据时,发现两组数据有大量模糊的边界重叠。我自己无法从中得出任何结论,对我来说太模糊了。由于每个样本有5个输入,我在想神经网络是否能够找出其中的内在关系并解决我的模糊数据分类问题。
结果确实如此…嗯,我猜是这样的。
根据权重的初始设置(我达到了80%),节点数量和学习时间,我得到了大约90%到85%的训练分数,最近甚至达到了95%。
首先,我尝试了权重的随机初始化。然后,我调整了节点数量。接着,我调整了学习率、动量和权重衰减。它们从(得分85%到90%):
// 如示例代码中所使用
int maxEpochs = 100000;
double learnRate = 0.05;
double momentum = 0.01;
double weightDecay = 0.0001;
调整到(得分95%)
int maxEpochs = 100000;
double learnRate = 0.02; // 产生了巨大影响
double momentum = 0.01;
double weightDecay = 0.001; // 产生了巨大影响
我有点惊讶的是,节点数量的影响不如改变网络的随机初始化和上述常数的影响大。
然而,这让我产生了一些疑问。
- 作为一个一般性的经验法则,95%是否是一个高分?(我不确定界限在哪里,但我认为这也取决于数据集,虽然我对95%感到惊讶,但我想知道是否有可能调整到97%。)
- 隐藏节点的数量,我应该尝试最小化它们吗?目前是5:9:3的结构,但我曾经用5:6:3的网络得到过相似的分数。
- 神经网络通过改变初始随机种子权重(不同的起始种子)来获得模型时,产生巨大分数影响是正常的吗?我以为训练会克服起始情况的影响。
回答:
首先,如果我理解错了,请原谅,但看起来你有100个训练样本,没有验证/测试集。这对于训练集来说相当小,这使得神经网络很容易在上面过度训练。你似乎选择了一个较小的神经网络,所以可能实际上没有过度拟合。最好的检查方法是拥有一个测试集。
关于你的问题:
-
什么是“好分数”完全取决于你的问题。例如,在MNIST(广泛使用的数字识别数据集)上,这将被认为相当差,最好的分数超过99.7%(用卷积网络达到99%并不太难),但在ImageNet上,这将是非常棒的。了解你是否表现良好的一个好方法是与人类表现进行某种比较。达到人类水平通常很难,所以略低于人类水平是好的,高于人类水平是非常好的,远低于人类水平是差的。这也是主观的,取决于你的问题。
-
你绝对应该尝试最小化隐藏节点的数量,遵循“奥卡姆剃刀”原则:在几个模型中,最简单的模型是最好的。它有两个主要优点:它会运行得更快,并且它会更好地泛化(如果两个模型在你的训练集上表现相似,最简单的模型在新的测试集上最有可能表现得更好)。
- 已知初始化会极大地改变结果。然而,较大的差异通常是在不同的初始化方法之间:常数/简单随机(广泛使用,通常是(截断的)正态分布)/更聪明的随机(例如Xavier初始化)/“更聪明”的初始化(预计算特征等,使用起来更难)。在以完全相同的方式生成的两个随机初始化之间,性能差异不应该那么大。我猜在某些情况下,你只是没有训练足够长的时间(正确训练所需的时间可能根据初始化而大不相同)。我的另一个猜测是,你的数据集和网络的较小规模使得评估比平时更依赖于初始权重。
学习率和权重衰减改变结果是正常的,然而高效地找到这些的最佳值可能很难。