为什么具有相同属性的神经网络不同?

时间:2016-12-30 16:18:26

标签: c++ neural-network artificial-intelligence conv-neural-network fann

简介

我是人工智能,机器学习和神经网络的新手。

我尝试在FANN (快速人工神经网络)库(C ++)的帮助下对某些内容进行编码,以测试此类系统的功能。

编程

我制作了一段代码,生成一个学习文件来处理有监督的学习。我已经做过一些测试,但是这个是为了理解隐藏层之间的关系而做的。组织和AI能力,以解决同样的问题。

为了解释我的观察,我将使用符号 ABC - [...] - X 来描绘 A 输入神经元的配置, B 第一个隐藏层上的神经元,第二个,......和 X 输出神经元上的 C 神经元。

在那些测试中,学习数据是工作 NOT函数(f(0)= 1; f(1)= 0)的2k随机结果(相当于'!& #39;在许多语言中)。另请注意,Epoch代表对所有学习数据的1次训练测试。 " AI"将代表训练有素的人工神经网络。

学习数据没有出错。

您可以在my GitHub Repo上找到完整的源代码。

更多不是更好

首先,我注意到1-1-1系统在37个时代中比1个[50个5个神经元]更强大 - -1在20k时期(0.0001错误率与0.25)。

我的第一个问题是,第二个AI需要更多的培训,因为要减少更多的成本,但我不确定这是唯一的原因。

这使我尝试使用相同的神经元总数进行一些测试。

等于不等

1-2-2-1配置似乎比1-4-1

更有效

实际上,当我对这两种不同的配置进行测试时,我得到了那些输出(测试程序是我自己编写的)。 这是两个不同的测试," 9 **"是目前的测试指标。

测试包括给AI提供0到1之间的随机int并打印输出。每项测试都是单独进行的。

// 1-2-2-1
[936]Number : 0.000000, output : 1.000000
[937]Number : 1.000000, output : 0.009162
[938]Number : 0.000000, output : 1.000000
[939]Number : 0.000000, output : 1.000000
[940]Number : 1.000000, output : 0.009162
[941]Number : 0.000000, output : 1.000000
[942]Number : 0.000000, output : 1.000000

// 1-4-1
[936]Number : 0.000000, output : 1.000000
[937]Number : 0.000000, output : 1.000000
[938]Number : 1.000000, output : 0.024513
[939]Number : 0.000000, output : 1.000000
[940]Number : 0.000000, output : 1.000000
[941]Number : 1.000000, output : 0.024513
[942]Number : 1.000000, output : 0.024513

您可以注意到,第一个配置的结果比第二个配置的结果更接近0。 ( 0.009162 0.024513 )。这不是IEEE编码问题,如果我再次进行测试,这2个值就不会改变。

原因是什么?让我们试着弄清楚。

  • 多少"突触"我们有第一个配置吗?

第一

first[0]->second[0]
first[0]->second[1]

然后

second[0]->third[0]
second[0]->third[1]
second[1]->third[0]
second[1]->third[1]

最终

third[0]->first[0]
third[1]->first[0]

因此我们得到总数 2 + 4 + 2 = 8个突触。 (以及8种不同的权重可能性)。

  • 第二种配置怎么样?

第一

first[0]->second[0]
first[0]->second[1]
first[0]->second[2]
first[0]->second[3]

最终

second[0]->third[0]
second[1]->third[0]
second[2]->third[0]
second[3]->third[0]

所以我们得到总共 4 + 4 = 8个突触。 (仍有8种不同的重量可能性)。

在两个系统上我们都有 4个激活函数(每个神经元1个)。

我们如何才能获得具有相同属性的能力的显着差异?

1 个答案:

答案 0 :(得分:3)

一般,有很多节点&权重可导致神经网络过度专业化。在一个极端的例子中:如果你有几千个图像,一个拥有十亿个节点(以及更多权重)的神经网络将冒险学习训练数据中的每一个像素,而不是找出“眼睛”的概念,耳朵“,......构成一张”脸“。因此,当您使用不同的图像呈现过度专业化的神经网络时,它将不会对它们起作用(或者至少不那么好)。它没有弄清楚抽象概念(例如“猫有耳朵和眼睛”而“房子有窗户”)。

虽然在你的测试中没有太多的过度专注,但你可能仍会看到一些(次要的)效果。

相同的属性: 权重的数量是相同的,但结构是不同的。由直线节点(1-1-1 -... -1)组成的神经网络将与更紧凑的节点(1-20-1)完全不同。一个1-1-1 -... -1网络甚至可能无法了解1-20-1网络可以学到什么(虽然有一些关于你需要学习布尔代数的节点/权重数量的规则,尽管我不记得了。)

我怀疑,“1-4-1”显示出与预期结果的更多偏差,因为每个中间节点受到更多权重的影响 - 每个节点获得的权重越多,训练所需的时间就越长。

在1-2-2-1网络中,第一个中间层每个节点只有一个权重作为输入,第二个中间层每个节点有2个权重,输出层每个节点有两个权重。所以最多,每个中间节点可以“摆动”两个值。

我不知道您的神经网络的细节(应用权重的功能),但是如果您想到以下示例,它可能会使事情变得清晰:

  • 假设函数是f(权重,输入)=输入*权重+常数
  • 此外我们的网络是1-1(即它有一个权重来确定)

如果一个权重为-1且常数为1,则表示您具有否定函数。该神经网络在训练速度和准确性方面都会击败任何更大的网络。任何具有更多节点(以及权重)的网络必须计算出所有权重的微妙平衡,直到找到代表“否定”概念的网络 - 可能神经网络中会有很多零(即“忽略输入” “)和一条做出否定的道路。

作为进一步工作的食物:神经网络在模糊数据方面表现良好,而且将代数函数降到第10位也不太好。