【问题标题】:Why are Neural Networks with same properties different? [closed]为什么具有相同属性的神经网络不同? [关闭]
【发布时间】:2017-05-14 22:28:29
【问题描述】:

简介

我对人工智能、机器学习和神经网络非常陌生。

我尝试借助 FANN (快速人工神经网络) 库 (C++) 编写一些东西来测试这种系统的能力。

编程

我编写了一小段代码来生成一个学习文件来处理监督学习。我已经做了一些测试,但这一次是为了理解隐藏层的组织和人工智能能力之间的关系,以解决同样的问题。

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

在这些测试中,学习数据是 工作 NOT 函数 (f(0)=1 ; f(1)=0) 的 2k 随机结果(在许多语言中相当于 '!' )。还要注意,一个 Epoch 代表所有学习数据的 1 个训练测试。 “AI”将代表经过训练的 ANN。

学习数据没有出错。

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

越多越好

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

我的第一个想法是第二个 AI 需要更多的训练,因为要最小化的成本要高得多,但我不确定这是唯一的原因。

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

等于不等于

1-2-2-1 配置似乎比 1-4-1 更高效

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

测试包括向 AI 提供 0 到 1 之间的随机整数并打印输出。每个测试都是单独运行的。

// 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.0091620.024513)。这不是 IEEE 编码问题,如果我运行另一个测试,这两个值不会改变。

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

  • 在第一个配置中我们有多少个“突触”?

第一

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 个)。

我们如何才能在相同属性的情况下获得显着的能力差异?

【问题讨论】:

  • 这个问题不太适合 StackOverflow,你可以试试Cross Validated
  • 很难说。神经网络是复杂的野兽。他们有很多旋钮和按钮(“超参数”)可以调整和破解。它们在机器学习社区中也被称为“黑匣子”,这种模型不能解释自己(为什么它们工作或为什么不工作,或者为什么一组超参数比其他的更好)。 a lot of research 还在继续。为了训练好的模型并更好地理解它们,您需要好的工具,例如现代神经网络框架:TensorFlow、Theano、Torch 等。

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


【解决方案1】:

一般而言,拥有大量节点和权重会导致神经网络过度专业化。举一个极端的例子:如果你有几千张图像,一个拥有十亿个节点(以及更多权重)的神经网络将冒着学习训练数据中每个像素的风险,而不是找出“眼睛”的概念,”耳朵”,……组成“脸”。因此,当您展示具有不同图像的过度专业化的神经网络时,它不会对它们起作用(或者至少不是那么好)。它还没有解决抽象概念(例如“猫有耳朵和眼睛”而“房子有窗户”)。

虽然在您的测试中没有太多需要过度专业化的地方,但您仍可能会看到一些(次要)影响。

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

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

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

我不知道你的神经网络的细节(应用了权重的函数),但是如果你想到下面的例子,它可能会让事情变得清晰:

  • 假设函数为 f(weight, input) = input*weight + constant
  • 进一步我们的网络是 1-1(即它有一个权重要确定)

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

作为进一步工作的食物:神经网络擅长处理模糊数据,而不太擅长将代数函数精确到第 10 位。

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2015-01-10
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2016-09-11
    • 2018-01-05
    相关资源
    最近更新 更多