介绍
我对人工智能、机器学习和神经网络非常陌生。
我尝试在FANN (快速人工神经网络)库 (C++) 的帮助下编写一些东西来测试这种系统的能力。
编程
我编写了一小段代码来生成一个学习文件来处理监督学习。我已经做了一些测试,但这一次是为了理解隐藏层的组织和人工智能能力之间的关系,以解决同样的问题。
为了解释我的观察,我将使用符号ABC-[...]-X来描绘A输入神经元、第一个隐藏层上的B神经元、第二个隐藏层上的C神经元、...和X输出神经元的配置。
在那些测试中,学习数据是工作NOT 函数 (f(0)=1 ; f(1)=0) 的 2k 随机结果(在许多语言中相当于“!”)。还要注意,一个 Epoch 代表所有学习数据的 1 个训练测试。“AI”将代表经过训练的 ANN。
学习数据没有出错。
你可以在我的 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.009162对0.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 个)。